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