nginx响应高并发参数配置
一、一般來(lái)說(shuō)nginx 配置文件中對(duì)優(yōu)化比較有作用的為以下幾項(xiàng):
1. ?worker_processes 8;
nginx 進(jìn)程數(shù),建議按照cpu 數(shù)目來(lái)指定,一般為它的倍數(shù) (如,2個(gè)四核的cpu計(jì)為8)。
2. ?worker_cpu_affinity 00000001 0000001000000100 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_nofile65535;
這個(gè)指令是指當(dāng)一個(gè)nginx 進(jìn)程打開的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開文 件數(shù)(ulimit -n)與nginx 進(jìn)程數(shù)相除,但是nginx 分配請(qǐng)求并不是那么均勻,所以最好與ulimit -n的值保持一致。
現(xiàn)在在linux2.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萬(wàn)時(shí)就有進(jìn)程可能超過(guò)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.??useepoll;使用epoll 的I/O 模型
(
補(bǔ)充說(shuō)明:
與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+, NetBSD2.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)核崩潰的問(wèn)題,有必要安裝安全補(bǔ)丁。
)
5.??worker_connections65535;
每個(gè)進(jìn)程允許的最多連接數(shù), 理論上每臺(tái)nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections。
6.??keepalive_timeout60;
keepalive 超時(shí)時(shí)間。
7.??client_header_buffer_size4k;
客戶端請(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 取得。
[root@web001 ~]# getconf PAGESIZE?
4096
但也有client_header_buffer_size超過(guò)4k的情況,但是client_header_buffer_size該值必須設(shè)置為“系統(tǒng)分頁(yè)大小”的整倍數(shù)。
8.??open_file_cachemax=65535 inactive=60s;
這個(gè)將為打開文件指定緩存,默認(rèn)是沒(méi)有啟用的,max 指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive是指經(jīng)過(guò)多長(zhǎng)時(shí)間文件沒(méi)被請(qǐng)求后刪除緩存。
9.??open_file_cache_valid80s;
這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息。
10.??open_file_cache_min_uses1;
open_file_cache 指令中的inactive參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過(guò)這個(gè)數(shù)字,文件描述符一直是在緩存中打開的,如上例,如果有一個(gè)文件在inactive時(shí)間內(nèi)一次沒(mé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 來(lái)處理。
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è)用戶文件句柄上。如果超過(guò)這個(gè)數(shù)字,孤兒連接將即刻被復(fù)位并打印出警告信息。這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS攻擊,不能過(guò)分依靠它或者人為地減小這個(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ì)遇到以前用過(guò)的序列號(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),FIN-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 –u
1024
問(wèn)題描述:?說(shuō)明 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 –n 65535 可即時(shí)修改,但重啟后就無(wú)效了。(注ulimit -SHn 65535 等效 ulimit-n 65535 ,-S 指soft ,-H 指hard)
有如下三種修改方式:
1. 在/etc/rc.local 中增加一行 ulimit -SHn 65535 2. 在/etc/profile 中增加一行 ulimit -SHn 65535 3.?在/etc/security/limits.conf最后增加:
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535
具體使用哪種,在 CentOS 中使用第1 種方式無(wú)效果,使用第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 0001000000100000 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_headerhttp_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/cssapplication/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)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; } log_format access '$remote_addr -- $remote_user [$time_local]"$request" ' '$status $body_bytes_sent "$http_referer" ' '"$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:2keys_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ì)超過(guò)1k,由于頁(yè)面大小為4k,所以這里設(shè)置為4k。
fastcgi_buffers 8 4k;
指定本地需要用多少和多大的緩沖區(qū)來(lái)緩沖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è)人感覺(jué)開啟緩存非常有用,可以有效降低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次也沒(méi)有被使用,那么這個(gè)文件將被移除。
fastcgi_cache_use_stale error timeout invalid_headerhttp_500;
不知道這個(gè)參數(shù)的作用,猜想應(yīng)該是讓nginx 知道哪些類型的緩存是沒(méi)用的。以上為nginx 中FastCGI相關(guān)參數(shù),另外,FastCGI 自身也有一些配置需要進(jìn)行優(yōu)化,如果你使用php-fpm來(lái)管理FastCGI,可以修改配置文件中的以下值:
<valuename="max_children">60</value>
同時(shí)處理的并發(fā)請(qǐng)求數(shù),即它將開啟最多60 個(gè)子線程來(lái)處理并發(fā)連接。
<valuename="rlimit_files">102400</value>
最多打開文件數(shù)。
<valuename="max_requests">204800</value>
每個(gè)進(jìn)程在重置之前能夠執(zhí)行的最多請(qǐng)求數(shù)。
注:文章轉(zhuǎn)載自網(wǎng)絡(luò),只做參考,未實(shí)際驗(yàn)證。轉(zhuǎn)載于:https://www.cnblogs.com/whiterock/p/7232852.html
總結(jié)
以上是生活随笔為你收集整理的nginx响应高并发参数配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第一章:火狐浏览器 : 环境配置: Fi
- 下一篇: 阿里云API网关(14)流控策略