對 Nginx SSL 的效能進行調整

oschina發表於2013-08-05

  這篇文章是講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: 部署另外一臺伺服器

  我還有另外一臺Linode伺服器。具有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。

  I因為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有兩個工作程式。

  英文來源:http://techsamurais.com/?p=1384

相關文章