Nginx效能優化

2021-10-07 06:47:15 字數 3117 閱讀 1507

在大多數情況下,乙個常規安裝的nginx對你的**來說已經能很好地工作了。然而,如果你真的想擠壓出nginx的效能,你必須更深入一些。在本指南中,我將解釋nginx的那些設定可以微調,以優化處理大量客戶端時的效能。

nginx.conf檔案中,nginx中有少數的幾個高階配置在模組部分之上。

user root;

pid /var/run/nginx.pid;

user和pid 應該按預設設定 - 我們不會更改這些內容,因為更改與否沒有什麼不同。

worker_processes auto;

定義了nginx對外提供web服務時的worker程序數。最優值取決於許多因素,包括(但不限於)cpu核的數量、儲存資料的硬碟數量及負載模式。不能確定的時候,將其設定為可用的cpu核心數將是乙個好的開始(設定為「auto」將嘗試自動檢測它)。

worker_rlimit_nofile 100000;

更改worker程序的最大開啟檔案數限制。如果沒設定的話,這個值為作業系統的限制。設定後你的作業系統和nginx可以處理比「ulimit -a」更多的檔案,所以把這個值設高,這樣nginx就不會有「too many open files」問題了。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

為每個程序分配cpu,上例中將8個程序分配到8個cpu,當然可以寫多個,或者將乙個程序分配到多個cpu。

client_header_buffer_size 4k;

客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設定,一般乙個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。分頁大小可以用命令getconf pagesize取得。

worker_connections 2048;

設定可由乙個worker程序同時開啟的最大連線數。如果設定了上面提到的worker_rlimit_nofile,我們可以將這個值設得很高。記住,最大客戶數也由系統的可用socket連線數限制(~ 64k),所以設定不切實際的高沒什麼好處。

multi_accept on;

告訴nginx收到乙個新連線通知後接受盡可能多的連線。

use epoll;

設定用於復用客戶端執行緒的輪詢方法。如果你使用linux 2.6+,你應該使用epoll。如果你使用*bsd,你應該使用kqueue。(值得注意的是如果你不知道nginx該使用哪種輪詢方法的話,它會選擇乙個最適合你作業系統的)

http模組控制著nginx http處理的所有核心特性。因為這裡只有很少的配置,所以我們只節選配置的一小部分。所有這些設定都應該在http模組中,甚至你不會特別的注意到這段設定。

sendfile on;

可以讓sendfile()發揮作用。sendfile()可以在磁碟和tcp socket之間互相拷貝資料(或任意兩個檔案描述符)。pre-sendfile是傳送資料之前在使用者空間申請資料緩衝區。之後用read()將資料從檔案拷貝到這個緩衝區,write()將緩衝區資料寫入網路。sendfile()是立即將資料從磁碟讀到os快取。因為這種拷貝是在核心完成的,sendfile()要比組合read()和write()以及開啟關閉丟棄緩衝更加有效(更多有關於sendfile)。

tcp_nopush on;

告訴nginx在乙個資料報裡傳送所有標頭檔案,而不乙個接乙個的傳送。

tcp_nodelay on;

告訴nginx不要快取資料,而是一段一段的傳送–當需要及時傳送資料時,就應該給應用設定這個屬性,這樣傳送一小塊資料資訊時就不能立即得到返回值。

access_log off;

設定nginx是否將儲存訪問日誌。關閉這個選項可以讓讀取磁碟io操作更快(aka,yolo)

error_log /var/log/nginx/error.log crit;

告訴nginx只能記錄嚴重的錯誤:

keepalive_timeout 10;

給客戶端分配keep-alive鏈結超時時間。伺服器將在這個超時時間過後關閉鏈結。我們將它設定低些可以讓ngnix持續工作的時間更長。

reset_timeout_connection on;

告訴nginx關閉不響應的客戶端連線。這將會釋放那個客戶端所占有的記憶體空間。

send_timeout 10;

指定客戶端的響應超時時間。這個設定不會用於整個**器,而是在兩次客戶端讀取操作之間。如果在這段時間內,客戶端沒有讀取任何資料,nginx就會關閉連線。

limit_conn_zone $binary_remote_addr zone=addr:5m;

設定用於儲存各種key(比如當前連線數)的共享記憶體的引數。5m就是5兆位元組,這個值應該被設定的足夠大以儲存(32k5)32byte狀態或者(16k5)64byte狀態。

limit_conn addr 100;

為給定的key設定最大連線數。這裡key是addr,我們設定的值是100,也就是說我們允許每乙個ip位址最多同時開啟有100個連線。

include /etc/nginx/mime.types;

只是乙個在當前檔案中包含另乙個檔案內容的指令。這裡我們使用它來載入稍後會用到的一系列的mime型別。

default_type text/html;

設定檔案使用的預設的mime-type。

charset utf-8;

設定我們的標頭檔案中的預設的字符集

gzip on;

是告訴nginx採用gzip壓縮的形式傳送資料。這將會減少我們傳送的資料量。

Nginx效能優化

在http裡面新增一行 server tokens off 預設可以設定為cpu的核數相等,併發比較大的時候,可以設定為cpu核數 2 worker cpu affinity 0001 0010 0100 1000 四核worker cpu affinity 00000001 00000010 00...

nginx效能優化

1 執行緒池 預設情況下,nginx的work process按照順序乙個個處理http請求,因此如果後台處理時間較長,則work process會長時間等待io狀態,因此限制併發性。如下所示 所以,對於可能存在的這類http請求,一般會啟用執行緒池。預設情況下,執行緒池特性並不啟用,需要在編譯時增...

Nginx效能優化

簡介 在大多數情況下,乙個常規安裝的nginx對 來說已經能很好地工作了。然而如果想擠壓出nginx的效能,就需要了解哪些指令會影響nginx效能,在本文中將解釋nginx的哪些設定可以微調。需要注意一點,這是乙個簡單的預覽 那些可以通過微調來提高效能設定的概述,不同的環境可能情況不太一樣。對於ng...