Nginx 性能調優

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 –每個工作進程中空閒長連接到上游服務器保持開啟的連接數量。沒有默認值。

要使用連接到上游服務器的長連接,必須要配置文件中下面的指令。

proxy_http_version 1.1;

proxy_set_header Connection "";

訪問日誌

記錄每個請求會消耗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管理指南”中的壓縮和解壓縮。


分享到:


相關文章: