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=)兩個配置值,將其設置的更大些。
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的影響在網絡的較低層.。可以簡單的認爲這些指令決定了操作系統如何處理網絡緩存和他們何時將這些緩存輸出到最終用戶(客戶端).。建議如果之前不瞭解這些概念你最好不要動它.,他們不會顯著的改善或者改變性能,,所以最好使用他們的默認值。
8. client_header_buffer_size 4k;
客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
9. use epoll;
在events標籤中使用epoll的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;
指多長時間檢查一次緩存的有效信息。
下面試一個運維常用的nginx標準配置文件(只供參照):
[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;
}
}
更多精彩,請關注我的"今日頭條號":Java雲筆記
隨時隨地,讓你擁有最新,最便捷的掌上雲服務