現(xiàn)在在linux2.6內(nèi)核下開啟文件打開數(shù)為65535,worker_rlimit_nofile就相應(yīng)應(yīng)該填寫65535。
這是因?yàn)閚ginx調(diào)度時(shí)分配請求到進(jìn)程并不是那么的均衡,所以假如填寫10240,總并發(fā)量達(dá)到3-4萬時(shí)就有進(jìn)程可能超過10240了,這時(shí)會返回502錯(cuò)誤。
/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_connections65535;
每個(gè)進(jìn)程允許的最多連接數(shù), 理論上每臺nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections。
6. keepalive_timeout60;
keepalive 超時(shí)時(shí)間。
7. client_header_buffer_size4k;
客戶端請求頭部的緩沖區(qū)大小,這個(gè)可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,一般一個(gè)請求頭的大小不會超過1k,不過由于一般系統(tǒng)分頁都要大于1k,所以這里設(shè)置為分頁大小。
分頁大小可以用命令getconf PAGESIZE 取得。
[root@web001 ~]# getconf PAGESIZE
4096
但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設(shè)置為“系統(tǒng)分頁大小”的整倍數(shù)。
8. open_file_cachemax=65535 inactive=60s;
這個(gè)將為打開文件指定緩存,默認(rèn)是沒有啟用的,max 指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive是指經(jīng)過多長時(shí)間文件沒被請求后刪除緩存。
9. open_file_cache_valid80s;
這個(gè)是指多長時(shí)間檢查一次緩存的有效信息。
10. open_file_cache_min_uses1;
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)會給我們內(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è)限制僅僅是為了防止簡單的DoS攻擊,不能過分依靠它或者人為地減小這個(gè)值,更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)。
net.ipv4.tcp_max_syn_backlog = 262144
記錄的那些尚未收到客戶端確認(rèn)信息的連接請求的最大值。對于有128M內(nèi)存的系統(tǒng)而言,缺省值是1024,小內(nèi)存的系統(tǒng)則是128。
net.ipv4.tcp_timestamps = 0
時(shí)間戳可以避免序列號的卷繞。一個(gè)1Gbps的鏈路肯定會遇到以前用過的序列號。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包。這里需要將其關(guān)掉。
net.ipv4.tcp_synack_retries = 1
為了打開對端的連接,內(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í)間。對端可以出錯(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)存,但是它們的生存期長些。
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
問題描述: 說明 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í)修改,但重啟后就無效了。(注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 種方式無效果,使用第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è)簡單的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)等級,關(guān)鍵字區(qū)域存儲時(shí)間和非活動刪除時(shí)間。
fastcgi_connect_timeout 300;
指定連接到后端FastCGI 的超時(shí)時(shí)間。
fastcgi_send_timeout 300;
向FastCGI 傳送請求的超時(shí)時(shí)間,這個(gè)值是指已經(jīng)完成兩次握手后向FastCGI 傳送請求的超時(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)答不會超過1k,由于頁面大小為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_headerhttp_500;
不知道這個(gè)參數(shù)的作用,猜想應(yīng)該是讓nginx 知道哪些類型的緩存是沒用的。以上為nginx 中FastCGI相關(guān)參數(shù),另外,F(xiàn)astCGI 自身也有一些配置需要進(jìn)行優(yōu)化,如果你使用php-fpm來管理FastCGI,可以修改配置文件中的以下值:
<valuename="max_children">60</value>
同時(shí)處理的并發(fā)請求數(shù),即它將開啟最多60 個(gè)子線程來處理并發(fā)連接。
<valuename="rlimit_files">102400</value>
最多打開文件數(shù)。
<valuename="max_requests">204800</value>
每個(gè)進(jìn)程在重置之前能夠執(zhí)行的最多請求數(shù)。