Nginx優(yōu)化詳解-------超詳細(xì)
一、一般來說nginx 配置文件中對(duì)優(yōu)化比較有作用的為以下幾項(xiàng):
1. worker_processes 8;
nginx 進(jìn)程數(shù)勒叠,建議按照cpu 數(shù)目來指定夺溢,一般為它的倍數(shù) (如,2個(gè)四核的cpu計(jì)為8)颇玷。
2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
為每個(gè)進(jìn)程分配cpu锌云,上例中將8 個(gè)進(jìn)程分配到8 個(gè)cpu感耙,當(dāng)然可以寫多個(gè)褂乍,或者將一
個(gè)進(jìn)程分配到多個(gè)cpu。
3.****worker_rlimit_nofile 65535;
這個(gè)指令是指當(dāng)一個(gè)nginx 進(jìn)程打開的最多文件描述符數(shù)目即硼,理論值應(yīng)該是最多打開文
件數(shù)(ulimit -n)與nginx 進(jìn)程數(shù)相除逃片,但是nginx 分配請(qǐng)求并不是那么均勻,所以最好與ulimit -n 的值保持一致只酥。
現(xiàn)在在linux 2.6內(nèi)核下開啟文件打開數(shù)為65535褥实,worker_rlimit_nofile就相應(yīng)應(yīng)該填寫65535。
這是因?yàn)閚ginx調(diào)度時(shí)分配請(qǐng)求到進(jìn)程并不是那么的均衡裂允,所以假如填寫10240损离,總并發(fā)量達(dá)到3-4萬時(shí)就有進(jìn)程可能超過10240了,這時(shí)會(huì)返回502錯(cuò)誤绝编。
查看linux系統(tǒng)文件描述符的方法:
[root@web001 ~]# sysctl -a | grep fs.file
fs.file-max = 789972
fs.file-nr = 510 0 789972
4.****use epoll;
使用epoll 的I/O 模型
(
補(bǔ)充說明:
與apache相類僻澎,nginx針對(duì)不同的操作系統(tǒng)貌踏,有不同的事件模型
A)標(biāo)準(zhǔn)事件模型
Select、poll屬于標(biāo)準(zhǔn)事件模型窟勃,如果當(dāng)前系統(tǒng)不存在更有效的方法祖乳,nginx會(huì)選擇select或poll
B)高效事件模型
Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用雙處理器的MacOS X系統(tǒng)使用kqueue可能會(huì)造成內(nèi)核崩潰。
Epoll: 使用于Linux內(nèi)核2.6版本及以后的系統(tǒng)秉氧。
/dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+眷昆。
Eventport:使用于 Solaris 10. 為了防止出現(xiàn)內(nèi)核崩潰的問題, 有必要安裝安全補(bǔ)丁汁咏。
)
5.****worker_connections 65535;
每個(gè)進(jìn)程允許的最多連接數(shù)亚斋, 理論上每臺(tái)nginx 服務(wù)器的最大連接數(shù)為worker_processes*worker_connections。
6.****keepalive_timeout 60;
keepalive 超時(shí)時(shí)間攘滩。
7****.****client_header_buffer_size 4k;
客戶端請(qǐng)求頭部的緩沖區(qū)大小帅刊,這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來設(shè)置,一般一個(gè)請(qǐng)求頭的大小不會(huì)超過1k轰驳,不過由于一般系統(tǒng)分頁(yè)都要大于1k厚掷,所以這里設(shè)置為分頁(yè)大小弟灼。
分頁(yè)大小可以用命令getconf PAGESIZE 取得级解。
[root@web001 ~]# getconf PAGESIZE
4096
但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設(shè)置為“系統(tǒng)分頁(yè)大小”的整倍數(shù)田绑。
8****.****open_file_cache max=65535 inactive=60s;
這個(gè)將為打開文件指定緩存勤哗,默認(rèn)是沒有啟用的,max 指定緩存數(shù)量掩驱,建議和打開文件數(shù)一致芒划,inactive 是指經(jīng)過多長(zhǎng)時(shí)間文件沒被請(qǐng)求后刪除緩存。
9****.****open_file_cache_valid 80s;
這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息欧穴。
10****.****open_file_cache_min_uses 1;
open_file_cache 指令中的inactive 參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù)民逼,如果超過這個(gè)數(shù)字,文件描述符一直是在緩存中打開的涮帘,如上例拼苍,如果有一個(gè)文件在inactive 時(shí)間內(nèi)一次沒被使用,它將被移除调缨。
二疮鲫、關(guān)于內(nèi)核參數(shù)的優(yōu)化:
net.ipv4.tcp_max_tw_buckets = 6000
timewait 的數(shù)量,默認(rèn)是180000弦叶。
net.ipv4.ip_local_port_range = 1024 65000
允許系統(tǒng)打開的端口范圍俊犯。
net.ipv4.tcp_tw_recycle = 1
啟用timewait 快速回收。
net.ipv4.tcp_tw_reuse = 1
開啟重用伤哺。允許將TIME-WAIT sockets 重新用于新的TCP 連接燕侠。
net.ipv4.tcp_syncookies = 1
開啟SYN Cookies者祖,當(dāng)出現(xiàn)SYN 等待隊(duì)列溢出時(shí),啟用cookies 來處理绢彤。
net.core.somaxconn = 262144
web 應(yīng)用中l(wèi)isten 函數(shù)的backlog 默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn 限制到128咸包,而nginx 定義的NGX_LISTEN_BACKLOG 默認(rèn)為511,所以有必要調(diào)整這個(gè)值杖虾。
net.core.netdev_max_backlog = 262144
每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí)烂瘫,允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目。
net.ipv4.tcp_max_orphans = 262144
系統(tǒng)中最多有多少個(gè)TCP 套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上奇适。如果超過這個(gè)數(shù)字坟比,孤兒連接將即刻被復(fù)位并打印出警告信息。這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS 攻擊嚷往,不能過分依靠它或者人為地減小這個(gè)值葛账,更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)。
net.ipv4.tcp_max_syn_backlog = 262144
記錄的那些尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值皮仁。對(duì)于有128M 內(nèi)存的系統(tǒng)而言籍琳,缺省值是1024,小內(nèi)存的系統(tǒng)則是128贷祈。
net.ipv4.tcp_timestamps = 0
時(shí)間戳可以避免序列號(hào)的卷繞趋急。一個(gè)1Gbps 的鏈路肯定會(huì)遇到以前用過的序列號(hào)。時(shí)間戳能夠讓內(nèi)核接受這種“異呈铺埽”的數(shù)據(jù)包呜达。這里需要將其關(guān)掉。
net.ipv4.tcp_synack_retries = 1
為了打開對(duì)端的連接粟耻,內(nèi)核需要發(fā)送一個(gè)SYN 并附帶一個(gè)回應(yīng)前面一個(gè)SYN 的ACK查近。也就是所謂三次握手中的第二次握手。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK 包的數(shù)量挤忙。
net.ipv4.tcp_syn_retries = 1
在內(nèi)核放棄建立連接之前發(fā)送SYN 包的數(shù)量霜威。
net.ipv4.tcp_fin_timeout = 1
如 果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2 狀態(tài)的時(shí)間册烈。對(duì)端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接戈泼,甚至意外當(dāng)機(jī)。缺省值是60 秒茄厘。2.2 內(nèi)核的通常值是180 秒矮冬,3你可以按這個(gè)設(shè)置,但要記住的是次哈,即使你的機(jī)器是一個(gè)輕載的WEB 服務(wù)器胎署,也有因?yàn)榇罅康乃捞捉幼侄鴥?nèi)存溢出的風(fēng)險(xiǎn),F(xiàn)IN- WAIT-2 的危險(xiǎn)性比FIN-WAIT-1 要小窑滞,因?yàn)樗疃嘀荒艹缘?.5K 內(nèi)存琼牧,但是它們的生存期長(zhǎng)些恢筝。
net.ipv4.tcp_keepalive_time = 30
當(dāng)keepalive 起用的時(shí)候,TCP 發(fā)送keepalive 消息的頻度巨坊。缺省是2 小時(shí)撬槽。
三、下面貼一個(gè)完整的內(nèi)核優(yōu)化設(shè)置:
vi /etc/sysctl.conf CentOS5.5中可以將所有內(nèi)容清空直接替換為如下內(nèi)容:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
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.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
使配置立即生效可使用如下命令:
/sbin/sysctl -p
四趾撵、下面是關(guān)于系統(tǒng)連接數(shù)的優(yōu)化
linux 默認(rèn)值 open files 和 max user processes 為 1024
ulimit -n
1024
ulimit Cu
1024
問題描述: 說明 server 只允許同時(shí)打開 1024 個(gè)文件侄柔,處理 1024 個(gè)用戶進(jìn)程
使用ulimit -a 可以查看當(dāng)前系統(tǒng)的所有限制值,使用ulimit -n 可以查看當(dāng)前的最大打開文件數(shù)占调。
新裝的linux 默認(rèn)只有1024 暂题,當(dāng)作負(fù)載較大的服務(wù)器時(shí),很容易遇到error: too many open files 究珊。因此薪者,需要將其改大。
解決方法:
使用 ulimit Cn 65535 可即時(shí)修改剿涮,但重啟后就無效了言津。(注ulimit -SHn 65535 等效 ulimit -n 65535 ,-S 指soft 取试,-H 指hard)
有如下三種修改方式:
1. 在/etc/rc.local 中增加一行 ulimit -SHn 65535
2. 在/etc/profile 中增加一行 ulimit -SHn 65535
- 在/etc/security/limits.conf 最后增加:
*** soft nofile 65535
- hard nofile 65535
- soft nproc 65535
- hard nproc 65535**
具體使用哪種悬槽,在 CentOS 中使用第1 種方式無效果,使用第3 種方式有效果想括,而在Debian 中使用第2 種有效果
ulimit -n
65535
ulimit -u
65535
備注:ulimit 命令本身就有分軟硬設(shè)置陷谱,加-H 就是硬,加-S 就是軟默認(rèn)顯示的是軟限制
soft 限制指的是當(dāng)前系統(tǒng)生效的設(shè)置值瑟蜈。 hard 限制值可以被普通用戶降低。但是不能增加渣窜。 soft 限制不能設(shè)置的比 hard 限制更高铺根。 只有 root 用戶才能夠增加 hard 限制值。
五乔宿、下面是一個(gè)簡(jiǎn)單的nginx 配置文件:
user www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000
01000000;
error_log /www/log/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;
events
{
use epoll;
worker_connections 204800;
}
http
{
include mime.types;
default_type application/octet-stream;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m
inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;
fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
fastcgi_cache_use_stale error timeout invalid_header http_500;
open_file_cache max=204800 inactive=20s;
open_file_cache_min_uses 1;
open_file_cache_valid 30s;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
server
{
listen 8080;
server_name backup.aiju.com;
index index.php index.htm;
root /www/html/;
location /status
{
stub_status on;
}
location ~ .*/.(php|php5)?
{
expires 30d;
}
log_format access ‘remote_user [request” ‘
‘body_bytes_sent “http_user_agent” $http_x_forwarded_for’;
access_log /www/log/access.log access;
}
}
六位迂、關(guān)于FastCGI 的幾個(gè)指令:
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10minactive=5m;
這個(gè)指令為FastCGI 緩存指定一個(gè)路徑,目錄結(jié)構(gòu)等級(jí)详瑞,關(guān)鍵字區(qū)域存儲(chǔ)時(shí)間和非活動(dòng)刪除時(shí)間掂林。
fastcgi_connect_timeout 300;
指定連接到后端FastCGI 的超時(shí)時(shí)間。
fastcgi_send_timeout 300;
向FastCGI 傳送請(qǐng)求的超時(shí)時(shí)間坝橡,這個(gè)值是指已經(jīng)完成兩次握手后向FastCGI 傳送請(qǐng)求的超時(shí)時(shí)間泻帮。
fastcgi_read_timeout 300;
接收FastCGI 應(yīng)答的超時(shí)時(shí)間,這個(gè)值是指已經(jīng)完成兩次握手后接收FastCGI 應(yīng)答的超時(shí)時(shí)間计寇。
fastcgi_buffer_size 4k;
指定讀取FastCGI 應(yīng)答第一部分需要用多大的緩沖區(qū)锣杂,一般第一部分應(yīng)答不會(huì)超過1k脂倦,由于頁(yè)面大小為4k,所以這里設(shè)置為4k元莫。
fastcgi_buffers 8 4k;
指定本地需要用多少和多大的緩沖區(qū)來緩沖FastCGI 的應(yīng)答赖阻。
fastcgi_busy_buffers_size 8k;
這個(gè)指令我也不知道是做什么用,只知道默認(rèn)值是fastcgi_buffers 的兩倍踱蠢。
fastcgi_temp_file_write_size 8k;
在寫入fastcgi_temp_path 時(shí)將用多大的數(shù)據(jù)塊火欧,默認(rèn)值是fastcgi_buffers 的兩倍。
fastcgi_cache TEST
開啟FastCGI 緩存并且為其制定一個(gè)名稱茎截。個(gè)人感覺開啟緩存非常有用布隔,可以有效降低CPU 負(fù)載,并且防止502 錯(cuò)誤稼虎。
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
為指定的應(yīng)答代碼指定緩存時(shí)間衅檀,如上例中將200,302 應(yīng)答緩存一小時(shí)霎俩,301 應(yīng)答緩存1 天哀军,其他為1 分鐘。
fastcgi_cache_min_uses 1;
緩存在fastcgi_cache_path 指令inactive 參數(shù)值時(shí)間內(nèi)的最少使用次數(shù)打却,如上例杉适,如果在5 分鐘內(nèi)某文件1 次也沒有被使用,那么這個(gè)文件將被移除柳击。
fastcgi_cache_use_stale error timeout invalid_header http_500;
不知道這個(gè)參數(shù)的作用猿推,猜想應(yīng)該是讓nginx 知道哪些類型的緩存是沒用的。以上為nginx 中FastCGI 相關(guān)參數(shù)捌肴,另外蹬叭,F(xiàn)astCGI 自身也有一些配置需要進(jìn)行優(yōu)化,如果你使用php-fpm 來管理FastCGI状知,可以修改配置文件中的以下值:
<value name=”max_children”>60</value>
同時(shí)處理的并發(fā)請(qǐng)求數(shù)秽五,即它將開啟最多60 個(gè)子線程來處理并發(fā)連接。
<value name=”rlimit_files”>102400</value>
最多打開文件數(shù)饥悴。
<value name=”max_requests”>204800</value>
每個(gè)進(jìn)程在重置之前能夠執(zhí)行的最多請(qǐng)求數(shù)坦喘。