Nginx以高性能負載均衡、緩存和web服務器出名,支撐着世界上繁忙網站中的40%。大多數使用場景下,Nginx和Linux系統的默認配置表現較好,可是仍有必要作一些調優以期達到最佳性能。web
這篇文章討論當調優系統時須要考慮的一些Nginx和Linux配置。這些配置有不少,可是在本文裏咱們只涉及適合大多數用戶的配置。那些沒有涉及到的配置,只有那些對Nginx和Linux有深刻理解的人,或者Nginx專家服務團隊推薦,纔會考慮到。後端
Nginx專家服務,已經和世界上一些繁忙網站合做來調優Nginx以達到最大限度的性能,而且能夠對任何須要充分發揮系統能力的客戶提供支持。緩存
這裏假定讀者對Nginx架構和配置概念有個基本瞭解。本文不會重複Nginx文檔的內容,而是概述各類配置選項並提供相關文檔連接。安全
調優時,有一條較好的準則是,一次只改一個配置項,若是改後沒有性能上的提高,就退回爲原先的值。服務器
咱們先討論Linux調優,由於有些值會影響在Nginx配置中能夠用的值。網絡
現代Linux內核(2.6+)可以很好的調節各類配置,有些配置您可能想更改。若是操做系統配置過低,那麼會在內核日誌中看到錯誤信息,所以須要調節這些配置。Linux配置項不少,本文只說起那些在普通工做負載下最可能須要調優的配置項。若是須要這些配置的詳細信息,請參考Linux文檔。架構
如下設置與鏈接及其如何排隊直接相關。若是傳入的鏈接率很高而性能水平良莠不齊,好比一些鏈接彷佛被暫停了,那麼更改這些配置可能會有用。負載均衡
net.core.somaxconn 該項設置等待被Nginx接受的鏈接的排隊大小。因爲Nginx接受鏈接速度很是快,這個值一般不須要很是大,可是默認值是很是低的,因此若是你有一個高流量網站,增長這個值是個好主意。若是設置太低,那麼你能在內核日誌中看到錯誤信息,這時你應該增長這個值直到沒有錯誤信息。注意:若是你將其設置爲大於512的值,你應該同時用listen指令的backlog參數匹配這個值來更改Nginx的配置。socket
net.core.netdev_max_backlog 該項設置在交由CPU處理以前網卡緩衝數據包的速率。對於擁有高帶寬的機器,這個值可能須要增長。查看網卡文檔尋求相關建議,或者檢查內核日誌相關錯誤信息。tcp
文件描述符是一種操做系統資源,用來處理諸如鏈接和打開文件的事情。對每個鏈接,Nginx能夠用上多達兩個文件描述符。例如,若是Nginx用做代理,則其中一個用於客戶端鏈接,另外一個用於鏈接到被代理的服務器。若是使用了HTTP keepalive,則鏈接描述符的使用會少得多。對於有大量鏈接的系統,以下設置可能須要進行調整:
sys.fs.file_max 這是系統範圍內的文件描述符限制。
nofile 這是用戶級別的文件描述符限制,在/etc/security/limits.conf文件中配置
當Nginx被看成代理使用時,每個到upstream服務器的鏈接都使用一個臨時端口。
net.ipv4.ip_local_port_range 這個用來指定可使用的起止端口號。若是你看到端口耗盡,你能夠增長這個範圍。常見的設置爲1024到65000。
net.ipv4.tcp_fin_timeout 這個用於指定一個再也不被使用的端口多久以後能夠被另外一鏈接再次使用。一般,這個值默認爲60秒,可是能夠安全地減小到30甚至15秒。
下面是一些可能影響性能的Nginx指令。如前所述,咱們僅討論那些推薦大多數用戶調整的指令。這裏未說起到的任何指令,若是沒有Nginx團隊的指導,不推薦更改。
Nginx能夠運行多個工做進程,每一個都能處理大量鏈接。你能夠用以下指令控制工做進程個數以及鏈接如何被處理:
worker_processes 這個控制Nginx運行的工做進程個數。大多數狀況下,一個CPU核心跑一個工做進程可以工做得很好。能夠將該指令設爲auto來達到與CPU核心數匹配的工做進程數。有時候,能夠增長這個值,好比工做進程須要處理大量磁盤IO操做的時候。這個值默認爲1。
worker_connections 這個表示每一個工做進程同時可以處理的最大鏈接數。默認值是512,可是大多數系統能處理更大的值。這個值該設爲多少取決於服務器硬件配置以及流量的特性,能夠經過測試來發現。
持久鏈接能夠減小打開和關閉鏈接所須要的CPU和網絡開銷,於是對性能有重大影響。Nginx終止全部客戶端鏈接,並具備到upstream服務器的單獨鏈接。Nginx支持客戶端和upstream服務器的持久鏈接。以下指令涉及客戶端持久鏈接:
keepalive_requests 這表示客戶端能在單個持久鏈接上發送多少請求。默認值是100,能夠設置成更高的值,這在負載生成器從單個客戶端發送大量請求的測試場景中很是有用。
keepalive_timeout 表示一個空閒持久鏈接保持打開狀態多長時間。
以下指令涉及upstream持久鏈接:
keepalive 這個指定每一個工做進程鏈接到upstream服務器的空閒持久鏈接數量。這個指令沒有默認值。
爲了啓用到upstream的持久鏈接,須要增長以下指令:
proxy_http_version 1.1;
proxy_set_header Connection "";
記錄每一個請求須要花費CPU和IO週期,減小這種影響的一種方法是啓用access日誌緩衝。這將致使Nginx緩衝一系列日誌條目,而後一次性寫入文件而不是單個單個寫入。
經過指定access_log指令的"buffer=size"選項能夠打開access日誌緩衝,該設置指定要使用的緩衝區的大小。你還可使用"flush=time"選項告訴Nginx多長時間後把緩衝區中的條目寫入文件。
定義了這兩個選項後,當緩衝區放不下下一條日誌,或者緩衝區中的條目超過了flush參數指定的時間,Nginx會將緩衝區中的條目寫入日誌文件。當工做進程從新打開日誌文件或者關閉時,緩衝區中的條目也會被寫入文件。也能夠徹底禁用access日誌記錄。
Sendfile是一個操做系統特性,能夠在Nginx上啓用。它經過在內核中從一個文件描述符向另外一個文件描述符複製數據,每每能達到零拷貝,於是能夠提供更快的TCP數據傳輸。Nginx可使用該機制將緩存或者磁盤上的內容寫到socket,無需從內核空間到用戶空間的上下文切換,於是很是快而且使用較少的CPU開銷。因爲數據永遠不會觸及用戶空間,因此不可能把須要訪問數據的過濾器插入處處理鏈中,不能使用任何須要改變內容的Nginx過濾器,好比gzip過濾器。Nginx默認沒有啓用該機制。
Nginx和Nginx Plus容許設置各類限制,用來控制客戶端資源消耗,以防影響系統性能以及用戶體驗和安全。如下是一些相關指令:
limit_conn / limit_conn_zone 這些指令能夠用來限制Nginx容許的鏈接數,好比來自單個客戶端IP地址的鏈接數。這能夠防止單個客戶端打開太多鏈接而消耗太多資源。
limit_rate 這個用來限制客戶端在單個鏈接上容許使用的帶寬。這能夠防止某些客戶端致使系統超載,於是有利於爲全部客戶端提供QoS保證。
limit_req / limit_req_zone 這些指令能夠用來限制Nginx的請求處理速率。與limit_rate一塊兒,能夠防止某些客戶端致使系統超載,於是有利於爲全部客戶端提供QoS保證。這些指令也能夠用來加強安全性,尤爲是對登陸頁面,經過限制請求速率,使得其對人類用戶是合適的,而會減慢試圖訪問你的應用的程序。
max_conns 這個用來限制同時鏈接到upstream組中單個服務器的最大鏈接數。這能夠防止upstream服務器超載。默認值是0,表示沒有限制。
queue 若是設置了max_conns,那麼queue指令用來決定當一個請求因爲upstream組中沒有可用服務器或者這些服務器達到max_conns限制而不能獲得處理時會發生什麼。這個指令用來設定有多少請求將會排隊以及排多久。若是沒有設置這個指令,就不會有排隊行爲。
Nginx還有一些特性能夠用來提升web應用的性能。這些特性不常出如今調優討論中,可是有必要一提,由於它們的影響也可能比較可觀。咱們將討論這些特性中的兩個。
對於一個爲一組web服務器或者應用服務器做負載均衡的Nginx實例來講,啓用緩存能夠顯著地下降響應時間,同時能顯著減輕後端服務器的負載。緩存自己就是一個主題,這裏不會討論。Nginx緩存配置的更多信息請參考:Nginx管理指南 - 緩存http://t.cn/RKQL8ys。
壓縮響應能夠大大減少響應的大小,減小帶寬佔用。不過,這須要CPU資源來處理壓縮,因此最好在值得減小帶寬佔用的狀況下使用。須要注意的是,不能對已經壓縮的東西(好比jpeg圖片)再次啓用壓縮。Nginx壓縮配置的更多信息請參考:Nginx管理指南 - 壓縮和解壓縮 http://t.cn/RKQLoXA