Nginx
是一個高性能的 HTTP
和反向代理web
服務(wù)器,在連接高并發(fā)的情況下,Nginx
是Apache
服務(wù)不錯的替代品。
日常的運(yùn)維工作中,我們經(jīng)常會用到nginx
服務(wù),也時常會碰到nginx
因高并發(fā)導(dǎo)致的性能瓶頸問題。
今天,我來簡單總結(jié)、梳理下配置文件中影響 Nginx
高并發(fā)性能的一些主要參數(shù):
1. worker_processes 6;
nginx
進(jìn)程數(shù):建議設(shè)置為等于CPU
總核心數(shù)(一般跟CPU
核數(shù)相同或?yàn)樗谋稊?shù))。這里設(shè)置為多少,在進(jìn)行top
監(jiān)控的時候就能看到高負(fù)載時就會打開多少個nginx
進(jìn)程??赏ㄟ^ lscpu
命令查看服務(wù)器里有幾個核(先看幾個CPU
,以及每個CPU
是幾核)。
2. worker_connections 65535;
單個進(jìn)程最大連接數(shù):默認(rèn)的值是1024,理論上每臺nginx服務(wù)器的最大連接數(shù) = worker_processes
(最大進(jìn)程個數(shù)) * worker_connections
(單個進(jìn)程最大連接數(shù))。
這個值太小的后果就是你的系統(tǒng)會報:too many open files
等錯誤,導(dǎo)致你的系統(tǒng)死掉。一般給到服務(wù)器后最好通過 ulimit
命令結(jié)合修改/etc/security/limits.conf
(增加* soft nofile * hard nofile
)兩個配置值,將其設(shè)置的更大些。
/etc/security/limits.conf文件詳細(xì)說明
3. keepalive_timeout 120;
http
連接超時時間:單位是秒,默認(rèn)為60s,功能是使客戶端到服務(wù)器端的連接在設(shè)定的時間(即:keepalive_timeout
)內(nèi)持續(xù)有效,當(dāng)出現(xiàn)對服務(wù)器的后繼請求時,該功能避免了建立或者重新建立連接。切記 – 這個參數(shù)不能設(shè)置過大!否則會導(dǎo)致許多無效的http
連接占據(jù)著nginx
的連接數(shù),最終造成 nginx
服務(wù)崩潰!
4. worker_rlimit_nofile 65535;
每個 nginx
進(jìn)程打開文件描述符最大數(shù)目:這個指令是指一個 nginx
進(jìn)程打開的最多文件描述符數(shù)目,理論值應(yīng)該是系統(tǒng)的最多打開文件數(shù)(ulimit -n
)與nginx
進(jìn)程數(shù)相除,但是nginx
分配請求并不是那么均勻,所以該配置要和系統(tǒng)的單進(jìn)程打開文件數(shù)一致。
5. gzip on;
通過測試一個5000多bytes
的json
數(shù)據(jù)在經(jīng)過壓縮只后只有700多bytes
,壓縮效率可達(dá)7倍。有效降低帶寬的使用,加快響應(yīng)速度。
6. tcp_nopush on;
防止網(wǎng)絡(luò)阻塞:告訴nginx在一個數(shù)據(jù)包里發(fā)送所有頭文件,而不一個接一個的發(fā)送。就是說數(shù)據(jù)包不會馬上傳送出去,等到數(shù)據(jù)包最大時,一次性的傳輸出去,這樣有助于解決網(wǎng)絡(luò)堵塞。
7. tcp_nodelay on;
防止網(wǎng)絡(luò)阻塞:告訴nginx不要緩存數(shù)據(jù),而是一段一段的發(fā)送–當(dāng)需要及時發(fā)送數(shù)據(jù)時,就應(yīng)該給應(yīng)用設(shè)置這個屬性,這樣發(fā)送一小塊數(shù)據(jù)信息時就不能立即得到返回值。
注意:tcp_nopush on和 tcp_nodelay on:這兩個指令也許是最難理解的nginx配置,他們對于nginx的影響在網(wǎng)絡(luò)的較低層.。可以簡單的認(rèn)為這些指令決定了操作系統(tǒng)如何處理網(wǎng)絡(luò)緩存和他們何時將這些緩存輸出到最終用戶(客戶端).。建議如果之前不了解這些概念你最好不要動它.,他們不會顯著的改善或者改變性能,,所以最好使用他們的默認(rèn)值。
8. client_header_buffer_size 4k;
客戶端請求頭部的緩沖區(qū)大小,這個可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置,一般一個請求的頭部大小不會超過1k,不過由于一般系統(tǒng)分頁都要大于1k,所以這里設(shè)置為分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
9. use epoll;
在events
標(biāo)簽中使用epol
l的I/O
模型,用這個模型用來高效處理異步事件。
10. server_tokens off;
隱藏響應(yīng)頭中的有關(guān)操作系統(tǒng)和web server(Nginx)
版本號的信息,這樣對于安全性是有好處的。
11. open_file_cache max=102400 inactive=20s;
這個參數(shù)將為打開文件指定緩存,默認(rèn)是沒有啟用的,max指定緩存數(shù)量,建議和打開文件數(shù)一致,inactive
是指經(jīng)過多長時間文件沒被請求后刪除緩存。
12. open_file_cache_valid 30s
指多長時間檢查一次緩存的有效信息
[root@dev-huanqiu ~]# cat /usr/local/nginx/conf/nginx.conf
user www www;
worker_processes 6;
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 65535;
events
{
use epoll;
worker_connections 65535;
}
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 16k;
fastcgi_buffers 16 16k;
fastcgi_busy_buffers_size 16k;
fastcgi_temp_file_write_size 16k;
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 csdn.tianxiaowen.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;
}
}