在日常的運(yùn)維工作中,經(jīng)常會(huì)用到nginx服務(wù),也時(shí)常會(huì)碰到nginx因高并發(fā)導(dǎo)致的性能瓶頸問題。今天這里簡(jiǎn)單梳理下nginx性能優(yōu)化的配置(僅僅依據(jù)本人的實(shí)戰(zhàn)經(jīng)驗(yàn)而述,如有不妥,敬請(qǐng)指出~)
一、這里的優(yōu)化主要是指對(duì)nginx的配置優(yōu)化,一般來(lái)說(shuō)nginx配置文件中對(duì)優(yōu)化比較有作用的主要有以下幾項(xiàng):
1)nginx進(jìn)程數(shù),建議按照cpu數(shù)目來(lái)指定,一般跟cpu核數(shù)相同或?yàn)樗谋稊?shù)。
worker_processes 8;
2)為每個(gè)進(jìn)程分配cpu,上例中將8個(gè)進(jìn)程分配到8個(gè)cpu,當(dāng)然可以寫多個(gè),或者將一個(gè)進(jìn)程分配到多個(gè)cpu。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
3)下面這個(gè)指令是指當(dāng)一個(gè)nginx進(jìn)程打開的最多文件描述符數(shù)目,理論值應(yīng)該是系統(tǒng)的最多打開文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請(qǐng)求并不是那么均勻,所以最好與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
4)使用epoll的I/O模型,用這個(gè)模型來(lái)高效處理異步事件
use epoll;
5)每個(gè)進(jìn)程允許的最多連接數(shù),理論上每臺(tái)nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections。
worker_connections 65535;
6)http連接超時(shí)時(shí)間,默認(rèn)是60s,功能是使客戶端到服務(wù)器端的連接在設(shè)定的時(shí)間內(nèi)持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),該功能避免了建立或者重新建立連接。切記這個(gè)參數(shù)也不能設(shè)置過(guò)大!否則會(huì)導(dǎo)致許多無(wú)效的http連接占據(jù)著nginx的連接數(shù),終nginx崩潰!
keepalive_timeout 60;
7)客戶端請(qǐng)求頭部的緩沖區(qū)大小,這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來(lái)設(shè)置,一般一個(gè)請(qǐng)求的頭部大小不會(huì)超過(guò)1k,不過(guò)由于一般系統(tǒng)分頁(yè)都要大于1k,所以這里設(shè)置為分頁(yè)大小。分頁(yè)大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 4k;
8)下面這個(gè)參數(shù)將為打開文件指定緩存,默認(rèn)是沒有啟用的,max指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive是指經(jīng)過(guò)多長(zhǎng)時(shí)間文件沒被請(qǐng)求后刪除緩存。
open_file_cache max=102400 inactive=20s;
9)下面這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息。
open_file_cache_valid 30s;
10)open_file_cache指令中的inactive參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過(guò)這個(gè)數(shù)字,文件描述符一直是在緩存中打開的,如上例,如果有一個(gè)文件在inactive時(shí)間內(nèi)一次沒被使用,它將被移除。
open_file_cache_min_uses 1;
11)隱藏響應(yīng)頭中的有關(guān)操作系統(tǒng)和web server(Nginx)版本號(hào)的信息,這樣對(duì)于安全性是有好處的。
server_tokens off;
12)可以讓sendfile()發(fā)揮作用。sendfile()可以在磁盤和TCP socket之間互相拷貝數(shù)據(jù)(或任意兩個(gè)文件描述符)。Pre-sendfile是傳送數(shù)據(jù)之前在用戶空間申請(qǐng)數(shù)據(jù)緩沖區(qū)。之后用read()將數(shù)據(jù)從文件拷貝到這個(gè)緩沖區(qū),write()將緩沖區(qū)數(shù)據(jù)寫入網(wǎng)絡(luò)。sendfile()是立即將數(shù)據(jù)從磁盤讀到OS緩存。因?yàn)檫@種拷貝是在內(nèi)核完成的,sendfile()要比組合read()和write()以及打開關(guān)閉丟棄緩沖更加有效(更多有關(guān)于sendfile)。
新聞熱點(diǎn)
疑難解答
圖片精選