最近在進(jìn)行服務(wù)器的優(yōu)化,正好在看nginx相關(guān)的知識,所以把一些知識整理一下。
我的機(jī)器為四核CPU,16G內(nèi)存。
內(nèi)核參數(shù)優(yōu)化
把如下的參數(shù)追加到Linux系統(tǒng)的/etc/sysctl.conf文件中,然后使用如下命令使修改生效:/sbin/sysctl -p
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.core.netdev_max_backlog參數(shù)
參數(shù)net.core.netdev_max_backlog,表示當(dāng)每個網(wǎng)絡(luò)接口接受數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時,允許發(fā)送隊列的數(shù)據(jù)包的最大數(shù)目,我們調(diào)整為262144.
net.core.somaxconn
該參數(shù)用于調(diào)節(jié)系統(tǒng)同時發(fā)起的TCP連接數(shù),一般默認(rèn)值為128,在客戶端高并發(fā)的請求的情況下,該默認(rèn)值較小,可能導(dǎo)致連接超時或者重傳問題,我們可以根據(jù)實(shí)際情況結(jié)合并發(fā)數(shù)來調(diào)節(jié)此值。
net.ipv4.tcp_max_orphans
該參數(shù)用于設(shè)定系統(tǒng)中最多允許存在多少TCP套接字不被關(guān)聯(lián)到任何一個用戶文件句柄上,如果超過這個數(shù)字,沒有與用戶文件句柄關(guān)聯(lián)到TCP套接字將立即被復(fù)位,同時發(fā)出警告信息,這個限制只是為了簡單防治Dos攻擊,一般系統(tǒng)內(nèi)存充足的情況下,可以增大這個參數(shù)。
net.ipv4.tcp_max_syn_backlog
該參數(shù)用于記錄尚未收到客戶端確認(rèn)信息的連接請求的最大值,對于擁有128內(nèi)存的系統(tǒng)而言,此參數(shù)的默認(rèn)值為1024,對小內(nèi)存的系統(tǒng)則是128,一般在系統(tǒng)內(nèi)存比較充足的情況下,可以增大這個參數(shù)的賦值。
net.ipv4.tcp_timestamps
該參數(shù)用于設(shè)置時間戳,這個可以避免序列號的卷繞,在一個1Gb/s的鏈路上,遇到以前用過的序列號概率很大,當(dāng)此值賦值為0時,警用對于TCP時間戳的支持,默認(rèn)情況下,TCP協(xié)議會讓內(nèi)核接受這種異常的數(shù)據(jù)包,針對Nginx服務(wù)器來說,建議將其關(guān)閉。
net.ipv4.tcp_synack_retries
該參數(shù)用于設(shè)置內(nèi)核放棄TCP連接之前向客戶端發(fā)送SYN+ACK包的數(shù)量,為了建立對端的連接服務(wù),服務(wù)器和客戶端需要進(jìn)行三次握手,第二次握手期間,內(nèi)核需要發(fā)送SYN并附帶一個回應(yīng)前一個SYN的ACK,這個參數(shù)主要影響這個過程,一般賦予值為1,即內(nèi)核放棄連接之前發(fā)送一次SYN+ACK包。
net.ipv4.tcp_syn_retries
該參數(shù)的作用與上一個參數(shù)類似,設(shè)置內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量,賦值為1。
nginx優(yōu)化
nginx的配置文件如下:
user www-data;
pid /run/nginx.pid;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
accept_mutex off;
multi_accept off;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60 50;
send_timeout 10s;
types_hash_max_size 2048;
client_header_buffer_size 4k;
client_max_body_size 8m;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_min_length 1024;
gzip_vary on;
gzip_comp_level 2;
gzip_buffers 32 4k;
gunzip_static on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
worker_processes
worker_processes用來設(shè)置Nginx服務(wù)的進(jìn)程數(shù)。推薦是CPU內(nèi)核數(shù)或者內(nèi)核數(shù)的倍數(shù),推薦使用CPU內(nèi)核數(shù),因?yàn)槲业腃PU為4核的,所以設(shè)置為4。
worker_cpu_affinity
默認(rèn)情況下,Nginx的多個進(jìn)程有可能跑在某一個CPU或CPU的某一核上,導(dǎo)致Nginx進(jìn)程使用硬件的資源不均,因此綁定Nginx進(jìn)程到不同的CPU上是為了充分利用硬件的多CPU多核資源的目的。
worker_cpu_affinity用來為每個進(jìn)程分配CPU的工作內(nèi)核,參數(shù)有多個二進(jìn)制值表示,每一組代表一個進(jìn)程,每組中的每一位代表該進(jìn)程使用CPU的情況,1代表使用,0代表不使用。所以我們使用worker_cpu_affinity 0001 0010 0100 1000;來讓進(jìn)程分別綁定不同的核上。
worker_connections
設(shè)置一個進(jìn)程理論允許的最大連接數(shù),理論上越大越好,但不可以超過worker_rlimit_nofile的值。還有個問題,linux系統(tǒng)中有個指令open file resource limit,它設(shè)置了進(jìn)程可以打開的文件句柄數(shù)量,可以用下面的指令查看你的linux系統(tǒng)中open file resource limit指令的值,cat /proc/sys/fs/file-max
可以將該指令設(shè)置為23900251
echo "2390251" > /proc/sys/fs/file-max; sysctl -p
worker_rlimit_nofile