掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在大多數(shù)情況下,一個常規(guī)安裝的Nginx對網(wǎng)站來說已經(jīng)能很好地工作了。然而如果想擠壓出Nginx的性能,就需要了解哪些指令會影響Nginx性能,在本文中將解釋Nginx性能調(diào)優(yōu)具體方案。

創(chuàng)新互聯(lián)建站專注于曲周企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城開發(fā)。曲周網(wǎng)站建設(shè)公司,為曲周等地區(qū)提供建站服務(wù)。全流程按需定制制作,專業(yè)設(shè)計,全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
下文中提到的一些配置,需要較新的Linux(2.6以上)內(nèi)核才能夠支持,筆者使用的CentOS 7.4,內(nèi)核版本3.10,如果不滿足需要的話,最好進(jìn)行相應(yīng)的升級,畢竟打補(bǔ)丁是件費(fèi)力不討好的事情。對于系統(tǒng)層面的調(diào)優(yōu),通常我們修改文件描述符限制、緩沖區(qū)隊列長度以及臨時端口數(shù)量就可以了。
由于每個TCP連接都要占用一個文件描述符,一旦文件描述符耗盡,新的連接到來就會返回“Too many open files”這樣的錯誤,為了提高性能,我們需要對其進(jìn)行修改:1.系統(tǒng)層級的限制 編輯文件 /etc/sysctl.conf,添加如下內(nèi)容:
fs.file-max =10000000
fs.nr_open =10000000
用戶層級的限制 編輯文件 /etc/security/limits.conf,添加以下內(nèi)容:
* hard nofile 1000000
* soft nofile 1000000
這里我們保證用戶層級限制不大于系統(tǒng)層級限制就可以了,否則可能會出現(xiàn)無法通過SSH登錄的問題。修改完畢執(zhí)行如下命令:
$ sysctl -p
可以通過執(zhí)行命令 ulimit -a查看是否修改成功。
編輯文件 /etc/sysctl.conf,添加如下內(nèi)容:
# The length of the syn quene
net.ipv4.tcp_max_syn_backlog =65535
# The length of the tcp accept queue
net.core.somaxconn =65535
其中 tcp_max_syn_backlog用于指定半連接SYN隊列長度,當(dāng)新連接到來時,系統(tǒng)會檢測半連接SYN隊列,如果隊列已滿,則無法處理該SYN請求,并在 /proc/net/netstat中的 ListenOverflows和 ListenDrops中增加統(tǒng)計計數(shù)somaxconn用于指定全連接ACCEPT隊列長度,當(dāng)該隊列滿了以后,客戶端發(fā)送的ACK包將無法被正確處理,并返回錯誤”connection reset by peer”Nginx則會記錄一條error日志”no live upstreams while connecting to upstreams”如果出現(xiàn)以上錯誤,我們需要考慮增大這兩項(xiàng)的配置。
由于Nginx用作代理,每個到上游Web服務(wù)的TCP連接都要占用一個臨時端口,因此我們需要修改 ip_local_port_range參數(shù) 修改 /etc/sysctl.conf文件,添加如下內(nèi)容:
net.ipv4.ip_local_port_range =102465535
net.ipv4.ip_local_reserved_ports =8080,8081,9000-9010
其中,參數(shù) ip_local_reserved_ports用于指定保留端口,這是為了防止服務(wù)端口被占用而無法啟動。
Nginx參數(shù)優(yōu)化主要圍繞 nginx.conf這個配置文件展開,下文不再贅述。
Nginx性能強(qiáng)大的一個重要原因在于它采用多進(jìn)程非阻塞I/O模型,因此我們要妥善利用這一點(diǎn):
worker_processes 默認(rèn)的Nginx只有一個master進(jìn)程一個worker進(jìn)程,我們需要對其進(jìn)行修改,可以設(shè)置為指定的個數(shù),也可以設(shè)置為 auto,即系統(tǒng)的CPU核數(shù)。更多的worker數(shù)量將導(dǎo)致進(jìn)程間競爭cpu資源,從而帶來不必要的上下文切換。因此這里我們將它設(shè)置為cpu的核數(shù)即可: worker_processes auto
worker_connections 每個worker可以處理的并發(fā)連接數(shù),默認(rèn)值512不是很夠用,我們適當(dāng)將它增大: worker_connections 4096
Nginx支持以下I/O復(fù)用方法處理連接:select、 poll、 kqueue、 epoll、 rtsig、 /dev/poll、 eventport。它們分別適用于不同的操作系統(tǒng),其中 epoll是Linux系統(tǒng)上面效率最高的: use epoll
為了避免從Nginx到Web服務(wù)頻繁的建立、斷開連接,我們可以啟用從HTTP 1.1開始支持的KeepAlive長連接特性,它可以大幅減少CPU和網(wǎng)絡(luò)開銷,在我們的實(shí)戰(zhàn)中也是對性能提高最大的一環(huán)。keepalive必須和 proxy_http_version與 proxy_set_header結(jié)合使用, 參考配置如下:
upstream BACKEND {
keepalive 300;
server 127.0.0.1:8081;
}
server {
listen 8080;
location /{
proxy_pass http://BACKEND;
proxy_http_version 1.1;
proxy_set_header Connection"";
}
}
其中 keepalive既非timeout,也不是連接池數(shù)量,官方解釋如下:
The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed.
可以看出它的意思是“最大空閑長連接數(shù)量”,超出這個數(shù)量的空閑長連接將被回收,當(dāng)請求數(shù)量穩(wěn)定而平滑時,空閑長連接數(shù)量將會非常?。ń咏?),而現(xiàn)實(shí)中請求數(shù)量是不可能一直平滑而穩(wěn)定的,當(dāng)請求數(shù)量有波動時,空閑長連接數(shù)量也隨之波動:
因此,如果這個值過小的話,就會導(dǎo)致連接池頻繁的回收、分配、再回收。為了避免這種情況出現(xiàn),可以根據(jù)實(shí)際情況適當(dāng)調(diào)整這個值,在我們實(shí)際情況中,目標(biāo)QPS為6000,Web服務(wù)響應(yīng)時間約為200ms,因此需要約1200個長連接,而 keepalive值取長連接數(shù)量的10%~30%就可以了,這里我們?nèi)?00,如果不想計算,直接設(shè)為1000也是可行的。
記錄日志的I/O開銷比較高,好在Nginx支持日志緩存,我們可以利用這個功能,降低寫日志文件的頻率,從而提高性能。可以將 buffer和 flush兩個參數(shù)結(jié)合使用來控制緩存行為:
access_log /var/logs/nginx-access.log buffer=64k gzip flush=1m
其中 buffer制定了緩存大小,當(dāng)緩沖區(qū)達(dá)到 buffer所指定的大小時,Nginx就會將緩存起來的日志寫到文件中;flush指定了緩存超時時間,當(dāng) flush指定的時間到達(dá)時,也會觸發(fā)緩存日志寫入文件操作。
上一節(jié)中已經(jīng)對Linux系統(tǒng)的文件描述符限制進(jìn)行了修改,Nginx配置中同樣有相應(yīng)的配置項(xiàng):worker_rlimit_nofile, 理論上這個值應(yīng)該設(shè)置為 /etc/security/limits.conf 中的值除以 worker_processes, 但實(shí)際中不可能每個進(jìn)程均勻分配,所以這里只要設(shè)置成和 /etc/security/limits.conf 一樣就可以了
worker_rlimit_nofile 1000000;

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流