Nginx 效能調優

獨自等待_天涯發表於2017-01-05

NGINX以高效能的負載均衡器,快取,和web伺服器聞名,驅動了全球超過 40% 最繁忙的網站。在大多數場景下,預設的 NGINX 和 Linux 設定可以很好的工作,但要達到最佳效能,有些時候必須做些調整。本文將討論當調優系統時要考慮的一些NGINX和Linux設定。

有太多可以調優的設定,但本文只涵蓋一小部分設定,這些設定對大多數使用者有優化的好處。本文不包括那些設定,那些需要必須深入理解 NGINX 和 Linux,或者需要 Nginx 支援團隊或專業服務團隊指導才能做的設定。專業服務團隊已經和很多全球熱門網站共事,調優Nginx 以達到最高效能,他們可以與你一起共事,充分利用NGINX或NGINX部署。

簡介

本文假設你已經對 NGINX 架構和配置的概念有一個基本的理解,本文不會重複 NGINX 文件,但會提供各種選項的概述和相關文件的連結。

調優的時候要遵循的一個準則:一次只改一個設定,如果對效能無有效提升,就改回預設值。

我們先從討論Linux調優開始,因為一些作業系統配置的設定決定了如何優化Nginx的配置。

調優Linux 的配置

Linux 核心(2.6以上)的設定已經適用於大多數場合,不過對一些設定的調整,會有更大的收益。如果系統配置太低,檢查錯誤資訊的核心日誌則會提示建議升級。在這裡我們只涉及最有可能在常規工作負載下調優很有收益的配置。調整配置的更多細節,請參考Linux文件。

緩衝區佇列

下面的設定與連線及其如何排隊相關。如果傳入連線速率很高,導致效能參次不齊(例如一些連線似乎停滯了),改變這些配置會有效。

  • net.core.somaxconn:排隊等待連線的最大數目,由NGINX可接受的數目決定。預設值通常很低,但可以接受,因為NGINX 接收連線非常快,但如果網站流量大時,就應該增加這個值。核心日誌中的錯誤訊息會提醒這個值太小了,把值改大,直到錯誤提示消失。
    注意: 如果設定這個值大於512,相應地也要改變NGINX listen指令的backlog引數。
  • net.core.netdev_max_backlog : 在提交到CPU前網路卡中資料包緩衝的速率,高頻寬下提高這個值可提高效能。檢查核心日誌檔案中有關這個設定的錯誤,根據網路卡文件中的建議修改這個值。

檔案描述符

檔案描述符是作業系統資源,用於表示連線、開啟的檔案,以及其他資訊。NGINX 每個連線可以使用兩個檔案描述符。例如,如果NGINX充當代理時,通常一個檔案描述符表示客戶端連線,另一個連線到代理伺服器,如果開啟了HTTP 保持連線,這個比例會更低(譯註:為什麼更低呢)。對於有大量連線服務的系統,下面的設定可能需要調整一下:

  • sys.fs.file_max —— 檔案描述符系統級別的限制
  • nofile —— 使用者級別檔案描述符限制,在 /etc/security/limits.conf 檔案中修改。

臨時埠

當NGINX充當代理時,每個到上游伺服器的連線都使用一個短暫或臨時埠。可能需要修改這些設定:

  • net.ipv4.ip_local_port_range —— 埠值的起止範圍。如果你發現用盡埠號,可以增大埠範圍。一般埠號設定是1024到65000。

調優NGINX配置

以下是一些可以影響效能的NGINX指令。如上所述,我們只討論自己能調整的指令。我們建議你在沒有NGINX團隊指導下,不要調整別的指令。

工作程式

NGINX可以執行多個工作程式,每個都可處理大量併發連線。可以控制工作程式數,用下面的指令管理它們的連線:

  • worker_processes —— NGINX工作程式數(預設值是1)。在大多數情況下,一個CPU核心執行一個工作程式最好,建議將這個指令設定成自動就可以。有時可能想增大這個值,比如當工作程式需要做大量的磁碟I/O。
  • worker_connections —— 每個工作程式可以處理併發的最大連線數。預設值是512,但多數系統有充足的資源可以支撐更多的連線。合適的設定可以根據伺服器的大小和流量的性質決定,可以通過測試修改。

長連線

長連線對效能有很大的影響,通過減少CPU和網路開銷需要開啟或關閉連線。NGINX終止所有客戶端連線,建立到上游伺服器獨立的連線。NGINx支援客戶端和上游伺服器兩種長連線。下面是和客戶端的長連線相關的指令:

  • keepalive_requests-單個客戶端長連線可以請求的數量,預設值是100,但是當使用壓力測試工具從一個客戶端傳送多個請求測試時,這個值設更高些特別有用。
  • keepalive_timeout—空閒長連線保持開啟狀態的時間。

下面是和上游伺服器長連線的相關指令:

  • keepalive –每個工作程式中空閒長連線到上游伺服器保持開啟的連線數量。沒有預設值。

要使用連線到上游伺服器的長連線,必須要配置檔案中下面的指令。

訪問日誌

記錄每個請求會消耗CPU和I/O週期,一種降低這種影響的方式是緩衝訪問日誌。使用緩衝,而不是每條日誌記錄都單獨執行寫操作,NGINX會緩衝一連串的日誌記錄,使用單個操作把它們一起寫到檔案中。

要啟用訪問日誌的快取,就涉及到在access_log指令中buffer=size這個引數。當緩衝區達到size值時,NGINX會把緩衝區的內容寫到日誌中。讓NGINX在指定的一段時間後寫快取,就包含flush=time引數。當兩個引數都設定了,當下個日誌條目超出緩衝區值或者緩衝區中日誌條目存留時間超過設定的時間值,NGINX都會將條目寫入日誌檔案。當工作程式重新開啟它的日誌檔案或退出時,也會記錄下來。要完全禁用訪問日誌記錄的功能,將access_log 指令設定成off引數。

Sendfile

作業系統的sendfile()系統呼叫可以實現從一個檔案描述符到另一個檔案描述符的資料拷貝,通常實現零拷貝,這能加速TCP資料傳輸。要讓NGINX使用它,在http或server或location環境中包含sendfile指令。NGINX可以不需要切換到使用者態,就把快取或磁碟上的內容寫入套接字 ,而且寫的速度非常快,消耗更少的CPU週期。注意,儘管使用sendfile()資料拷貝可以繞過使用者態,這不適用於常規的NGINX處理改變內容的鏈和過濾器, 比如gzip。當配置環境下有sendfile指令和啟用內容更改過濾器的指令時,NGINX會自動禁用sendfile。

限制

你可以設定多個限制,防止使用者消耗太多的資源,避免影響系統效能和使用者體驗及安全。 以下是相關的指令:

  • limit_conn and limit_conn_zone—NGINX接受客戶連線的數量限制,例如單個IP地址的連線。設定這些指令可以防止單個使用者開啟太多的連線,消耗超出自己的資源。
  • limit_rate–傳輸到客戶端響應速度的限制(每個開啟多個連線的客戶消耗更多的頻寬)。設定這個限制防止系統過載,確保所有客戶端更均勻的服務質量。
  • limit_req and limit_req_zone– NGINX處理請求的速度限制,與limit_rate有相同的功能。可以提高安全性,尤其是對登入頁面,通過對使用者限制請求速率設定一個合理的值,避免太慢的程式覆蓋你的應用請求(比如DDoS攻擊)。
  • max_conns上游配置塊中伺服器指令引數。在上游伺服器組中單個伺服器可接受最大併發數量。使用這個限制防止上游伺服器過載。設定值為0(預設值)表示沒有限制。
  • queue (NGINX Plus) – 建立一個佇列,用來存放在上游伺服器中超出他們最大max_cons限制數量的請求。這個指令可以設定佇列請求的最大值,還可以選擇設定在錯誤返回之前最大等待時間(預設值是60秒)。如果忽略這個指令,請求不會放入佇列。

快取和壓縮可以提高效能

NGINX的一些額外功能可用於提高Web應用的效能,調優的時候web應用不需要關掉,但值得一提,因為它們的影響可能很重要。 它們包括快取和壓縮。

快取

一個啟用NGINX快取的情景,一組web或者應用伺服器負載均衡,可以顯著縮短對客戶端的響應時間,同時大幅度降低後端伺服器的負載。快取本身就可以作個專題來講,這裡我們就不試圖講它了。參閱NGINX Plus管理手冊的NGINX內容快取。

壓縮

所以使用更小的網路頻寬。然而儘管壓縮資料會消耗CPU資源,但當需要減少網路頻寬使用時這樣做非常有效。需要注意的是,不能對已壓縮的檔案再壓縮例如JPEG 檔案。有關更多的資訊,請參閱“NGINX Plus管理指南”中的壓縮和解壓縮。

瞭解更多資訊,參閱以下:

• Benchmarking NGINX: 4 Ways to Improve Accuracy (whitepaper)

• NGINX documentation at nginx.org

• NGINX and NGINX Plus Feature Matrix

• NGINX Plus Technical Specifications

相關文章