1. 程式人生 > 實用技巧 >5、Nginx 效能優化

5、Nginx 效能優化

系統優化

$ cat /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  36768
net.core.somaxconn = 36768
 
net.core.wmem_default = 8588608
net.core.rmem_default = 8588608
net.core.rmem_max = 16877216
net.core.wmem_max = 16877216
 
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries 
= 2 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3376800 net.ipv4.ip_local_port_range = 1024 65535 $ sysctl -p $ cat /etc/security/limit.conf * hard nofile 65535 * soft nofile 65535

Nginx配置 優化

#user  nobody;
worker_processes  
4; worker_cpu_affinity 0001 0010 0100 1000; worker_rlimit_nofile 65535; #pid logs/nginx.pid; events { use epoll; worker_connections 65535; multi_accept on; } http { include mime.types; default_type application/octet-stream; #access_log logs/access.log main; log_format main
'$http_X_Real_IP $http_CLIENTIP $remote_addr $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" $request_time'; sendfile on; tcp_nopush on; keepalive_timeout 60; keepalive_requests 10240; tcp_nodelay on; client_header_buffer_size 4k; open_file_cache max=102400 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 1; client_header_timeout 15; client_body_timeout 15; reset_timedout_connection on; send_timeout 15; server_tokens off; client_max_body_size 10m; gzip off; 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; fastcgi_connect_timeout 600; fastcgi_send_timeout 600; fastcgi_read_timeout 600; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_temp_path /usr/local/nginx/fastcgi_temp; server { listen 80; server_name localhost; access_log /usr/local/logs/nginx/access.log main; root html; index index.html index.htm index.php; #圖片快取時間 location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ { expires 30d; #log_not_found off; access_log off; } #JS和CSS快取時間 location ~* \.(js|css)$ { expires 7d; log_not_found off; access_log off; } error_page 500 502 503 504 /50x.html; location / { try_files $uri $uri/ @rewrites; } location @rewrites { rewrite ^ /index-development.php last; } location = /robots.txt { access_log off; log_not_found off; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } include conf.d/*; }

  • worker_processes
    nginx執行工作程序個數,一般設定cpu的核心或者核心數x2,如:worker_processes 4;
  • worker_cpu_affinity
    執行CPU親和力,與worker_processes對應,如:worker_cpu_affinity 0001 0010 0100 1000;
  • worker_rlimit_nofile
    Nginx最多可以開啟檔案數,與ulimit -n保持一致,如:worker_rlimit_nofile 65535;
  • events
    事件處理模型。如:
events {
  use epoll;
  worker_connections 65535;
  multi_accept on;
}
use epoll:nginx採用epoll事件模型,處理效率高
work_connections:是單個worker程序允許客戶端最大連線數,這個數值一般根據伺服器效能和記憶體來制定,實際最大值就是worker程序數乘以work_connections,實際我們填入一個65535,足夠了,這些都算併發值,一個網站的併發達到這麼大的數量,也算一個大站了!
multi_accept :告訴nginx收到一個新連線通知後接受盡可能多的連線,預設是on,設定為on後,多個worker按序列方式來處理連線,也就是一個連線只有一個worker被喚醒,其他的處於休眠狀態,設定為off後,多個worker按並行方式來處理連線,也就是一個連線會喚醒所有的worker,直到連線分配完畢,沒有取得連線的繼續休眠。當你的伺服器連線數不多時,開啟這個引數會讓負載有一定的降低,但是當伺服器的吞吐量很大時,為了效率,可以關閉這個引數。

  • http
高效傳輸模式,如:
http {
include mime.types;
default_type application/octet-stream;
……
sendfile on;
tcp_nopush on;
……

Include mime.types: 媒體型別,include 只是一個在當前檔案中包含另一個檔案內容的指令
default_type:預設媒體型別,如: application/octet-stream;
sendfile :開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。
注意:如果圖片顯示不正常把這個改成off
tcp_nopush:必須在sendfile開啟模式才有效,防止網路阻塞,積極的減少網路報文段的數量(將響應頭和正文的開始部分一起傳送,而不一個接一個的傳送。)
  • 連線超時時間
主要目的是保護伺服器資源,CPU,記憶體,控制連線數,因為建立連線也是需要消耗資源的,如:
keepalive_timeout 60;
keepalive_requests 10240;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;

keepalived_timeout 60:客戶端連線保持會話超時時間,超過這個時間,伺服器斷開這個連結
keepalive_requests 10240:引數限制了一個 HTTP 長連線最多可以處理完成的最大請求數, 預設是 100。當連線處理完成的請求數達到最大請求數後,將關閉連線。
tcp_nodelay:也是防止網路阻塞,不過要包涵在keepalived引數才有效
client_header_buffer_size 4k:客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過 1k,不過由於一般系統分頁都要大於1k,所以這裡設定為分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
open_file_cache max=102400 inactive=20s:這個將為開啟檔案指定快取,預設是沒有啟用的,max指定快取數量,建議和開啟檔案數一致,inactive 是指經過多長時間檔案沒被請求後刪除快取。
open_file_cache_valid 30s:這個是指多長時間檢查一次快取的有效資訊。
open_file_cache_min_uses 1:open_file_cache指令中的inactive 引數時間內檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在快取中開啟的,如上例,如果有一個檔案在inactive 時間內一次沒被使用,它將被移除。
client_header_timeout:設定請求頭的超時時間。我們也可以把這個設定低些,如果超過這個時間沒有傳送任何資料,nginx將返回request time out的錯誤
client_body_timeout:設定請求體的超時時間。我們也可以把這個設定低些,超過這個時間沒有傳送任何資料,和上面一樣的錯誤提示
reset_timeout_connection:告訴nginx關閉不響應的客戶端連線。這將會釋放那個客戶端所佔有的記憶體空間。
send_timeout:響應客戶端超時時間,這個超時時間僅限於兩個活動之間的時間,如果超過這個時間,客戶端沒有任何活動,nginx關閉連線
server_tokens:並不會讓nginx執行的速度更快,但它可以關閉在錯誤頁面中的nginx版本數字,這樣對於安全性是有好處的。
client_max_body_size:上傳檔案大小限制