歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 對Nginx SSL的性能進行調整

對Nginx SSL的性能進行調整

日期:2017/2/27 15:58:23   编辑:Linux教程
這篇文章是講web服務器方面的性能調整. 不包括數據庫性能的調整.
初始化服務器
這個web服務器運行在一個EC2 t1.micro 環境.我選擇 Nginx + PHP5-FPM 來運行php頁面,出於安全考慮我使用SSL.

測試性能
我使用Blitz.io來進行壓力和性能測試. 下面的是我壓力測試的命令. 功能是在60秒內逐漸增加用戶. 在整個過程中,Blitz.io 每秒創建一個請求並增加4個用戶(rise/run = 260/60).
-p 1-250:60 https://mydomian.com

結論
對於那些不想看完全文的下面是幾個方案.
  1. 這個默認的 DH算法是性能低的最大原因. 改變你的 SSL 密碼設置用下面的這個命令:
    ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+SSLv2:+EXP;
  2. 升級你的EC2 從t1.micro 到 c1.medium
  3. 當c1.medium給你兩個CPU時,設置Nginx使用2個工作進程.

詳細的解釋
對於愛好者來說,這裡是詳細的解釋。我將會在下述章節帶領你重溫我的思考過程。
如果編輯了Nginx配置,那麼重啟Nginx服務器。如果編輯了PHP5-FPM配置,那麼重啟服務。

目錄
嘗試 #1: 增強硬件
嘗試 #2: 評效CPU性能
嘗試 #3, #4, #5: 微調Nginx + PHP5-FPM
嘗試 #6: 部署另外一台服務器
嘗試 #7: 大啟示
嘗試 #8: 我真的需要增強硬件

嘗試 #1: 增強硬件
對於改善性能,我本能的想法是增強服務器硬件,希望一切都會正常工作。我將EC2實例從t1.micro升級到了c1.medium(針對高流量服務器進行了優化,而不是通用服務器)。
在此之後,我運行了Blitz.io負載測試。這是結果的截圖 服務器的峰值性能可以達到每秒50個成功命中。隨著負載的繼續增加,超時的數量上升,而命中的數量下降。

嘗試 #2: 評效CPU性能
我重新執行了測試,同時在後台運行htop。我注意到兩個CPU的利用率不超過13%。內存使用了300Mb。看起來服務器沒有充分利用。所以我做了下述改變。我編輯了/etc/ngnix/nginx.conf
worker_processes 2;

嘗試 #3, #4, #5: 微調 Nginx + PHP5-FPM
在下述嘗試中,我改變了下述值,仍然獲得跟嘗試 #1同樣的結果。

嘗試 #3
/etc/ngnix/nginx.conf
worker_processes 2;
events {
worker_connections 19000;
multi_accept on;
}
...
嘗試 #4
/etc/ngnix/nginx.conf
worker_processes 2;
events {
  worker_connections 19000;
  multi_accept on;
}
http {
  gzip on;
  gzip_disable "msie6";

  gzip_min_length  1000;
  gzip_proxied     expired no-cache no-store private auth;
  gzip_types       text/plain application/xml application/javascript text/css application/x-javascript;
…
}
...

嘗試 #5
我沒有取消嘗試 #4的改變
/etc/php5/fpm/pool.d/www.conf
pm.max_children = 160
pm.start_servers = 24
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 1500

嘗試 #6: 部署另外一台服務器
我還有另外一台LLinux/1672.html' target='_blank'>inode服務器。具有1.5Gb的內存和8個CPU。我復制所有Nginx和PHP5-FPM的設置到這台服務器上。
這是我使用Blitz.io進行壓力測試的命令
-p 1-250:60 http://labs.mydomian2.com
這是結果: Linode服務器非常棒!我在想“Linode比EC2好麼?”。在我決定沿著這條思路走下去,將代碼遷移到Linode之前,我想要確保兩台服務器之間沒有差別。

嘗試 #7: 大啟示
我搜索了一下,發現Nginx有些SSL相關的問題。默認Nginx使用DHE算法創建密碼(cipher)。禁用該算法將會提升性能。
這是我讀到的文章:
http://matt.io/entry/ur
http://auxbuss.com/blog/posts/2011_06_28_ssl_session_caching_on_nginx/
所有我編輯/etc/nginx/nginx.conf去掉了kEDH密碼算法。
worker_processes 2;
events {
  worker_connections 1024;
}
http {
  gzip on;
  gzip_disable "msie6";

  gzip_min_length  1000;
  gzip_proxied     expired no-cache no-store private auth;
  gzip_types       text/plain application/xml application/javascript text/css application/x-javascript;
  ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;    
…
}
...
我重現執行了原來的壓力測試:
-p 1-250:60 https://mydomian.com
這是結果:
嘗試 #8: 我真的需要增強硬件
太棒了,EC2與Linode在性能上很接近。但是我真的需要c1.medium實例來獲得這種性能麼?可能不需要... 所以我將EC2的實例類型改回了t1.micro。
因為micro實例只有一個CPU,所有我在/etc/nginx/nginx.conf中減少了worker_processes。
worker_processes 1;
...
這是結果: 嗯,額外的硬件是有幫助的。

結論
想要在使用了SSL的Nginx服務器上獲得最好的性能,如下操作:
  1. 默認使用的DH算法是低性能的最大原因。改變SSL密碼設置如下:
    ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
  2. 升級EC2從t1.micro到c1.medium
  3. 因為c1.medium有兩個CPUs,所有設置Nginx有兩個工作進程。
Copyright © Linux教程網 All Rights Reserved