Nginx高併發性能優化【轉】

在日常的運維工作中,經常會用到nginx服務,也時常會碰到nginx因高併發導致的性能瓶頸問題。這裏簡單梳理下nginx性能優化的配置

一、Nginx配置中比較重要的優化項如下:
1)nginx進程數,建議按照cpu數目來指定,一般跟cpu核數相同或爲它的倍數。
worker_processes 8;
2)爲每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
3)下面這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是系統的最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
4)使用epoll的I/O模型,用這個模型來高效處理異步事件
use epoll;
5)每個進程允許的最多連接數,理論上每臺nginx服務器的最大連接數爲worker_processes*worker_connections。
worker_connections 65535;
6)http連接超時時間,默認是60s,功能是使客戶端到服務器端的連接在設定的時間內持續有效,當出現對服務器的後繼請求時,該功能避免了建立或者重新建立連接。切記這個參數也不能設置過大!否則會導致許多無效的http連接佔據着nginx的連接數,終nginx崩潰!
keepalive_timeout 60;
7)客戶端請求頭部的緩衝區大小,這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
client_header_buffer_size 4k;
8)下面這個參數將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。
open_file_cache max=102400 inactive=20s;
9)下面這個是指多長時間檢查一次緩存的有效信息。
open_file_cache_valid 30s;
10)open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
open_file_cache_min_uses 1;

11)隱藏響應頭中的有關操作系統和web server(Nginx)版本號的信息,這樣對於安全性是有好處的。
server_tokens off;
12)可以讓sendfile()發揮作用。sendfile()可以在磁盤和TCP socket之間互相拷貝數據(或任意兩個文件描述符)。Pre-sendfile是傳送數據之前在用戶空間申請數據緩衝區。之後用read()將數據從文件拷貝到這個緩衝區,write()將緩衝區數據寫入網絡。sendfile()是立即將數據從磁盤讀到OS緩存。因爲這種拷貝是在內核完成的,sendfile()要比組合read()和write()以及打開關閉丟棄緩衝更加有效(更多有關於sendfile)。
sendfile on;
13)告訴nginx在一個數據包裏發送所有頭文件,而不一個接一個的發送。就是說數據包不會馬上傳送出去,等到數據包最大時,一次性的傳輸出去,這樣有助於解決網絡堵塞。
tcp_nopush on;
14)告訴nginx不要緩存數據,而是一段一段的發送--當需要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能立即得到返回值。
tcp_nodelay on;
比如:
http {
   server_tokens off;
   sendfile on;
   tcp_nopush on;
   tcp_nodelay on;
......
}
15)客戶端請求頭部的緩衝區大小,這個可以根據系統分頁大小來設置,一般一個請求頭的大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。
client_header_buffer_size 4k;
客戶端請求頭部的緩衝區大小,這個可以根據系統分頁大小來設置,一般一個請求頭的大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。
分頁大小可以用命令getconf PAGESIZE取得。
[root@test-huanqiu ~]# getconf PAGESIZE
4096
但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設置爲“系統分頁大小”的整倍數。
16)爲打開文件指定緩存,默認是沒有啓用的,max 指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時間文件沒被請求後刪除緩存。
open_file_cache max=65535 inactive=60s;
17)open_file_cache 指令中的inactive 參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive 時間內一次沒被使用,它將被移除。
open_file_cache_min_uses 1;
18)指定多長時間檢查一次緩存的有效信息。
open_file_cache_valid 80s;

###############   常用Nginx標準配置   ##################

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
[root@dev-huanqiu ~]# cat /usr/local/nginx/conf/nginx.conf
user   www www;
worker_processes 8;
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   huan.wangshibo.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;
       }
}

二、關於FastCGI的幾個指令                                                                                                       

1)這個指令爲FastCGI緩存指定一個路徑,目錄結構等級,關鍵字區域存儲時間和非活動刪除時間。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
2)指定連接到後端FastCGI的超時時間。
fastcgi_connect_timeout 300;
3)向FastCGI傳送請求的超時時間,這個值是指已經完成兩次握手後向FastCGI傳送請求的超時時間。
fastcgi_send_timeout 300;
4)接收FastCGI應答的超時時間,這個值是指已經完成兩次握手後接收FastCGI應答的超時時間。
fastcgi_read_timeout 300;
5)指定讀取FastCGI應答第一部分 需要用多大的緩衝區,這裏可以設置爲fastcgi_buffers指令指定的緩衝區大小,上面的指令指定它將使用1個 16k的緩衝區去讀取應答的第一部分,即應答頭,其實這個應答頭一般情況下都很小(不會超過1k),但是你如果在fastcgi_buffers指令中指 定了緩衝區的大小,那麼它也會分配一個fastcgi_buffers指定的緩衝區大小去緩存。
fastcgi_buffer_size 16k;
6)指定本地需要用多少和多大的緩衝區來 緩衝FastCGI的應答,如上所示,如果一個php腳本所產生的頁面大小爲256k,則會爲其分配16個16k的緩衝區來緩存,如果大於256k,增大 於256k的部分會緩存到fastcgi_temp指定的路徑中, 當然這對服務器負載來說是不明智的方案,因爲內存中處理數據速度要快於硬盤,通常這個值 的設置應該選擇一個你的站點中的php腳本所產生的頁面大小的中間值,比如你的站點大部分腳本所產生的頁面大小爲 256k就可以把這個值設置爲16 16k,或者4 64k 或者64 4k,但很顯然,後兩種並不是好的設置方法,因爲如果產生的頁面只有32k,如果用4 64k它會分配1個64k的緩衝區去緩存,而如果使用64 4k它會分配8個4k的緩衝區去緩存,而如果使用16 16k則它會分配2個16k去緩存頁面,這樣看起來似乎更加合理。
fastcgi_buffers 16 16k;
7)這個指令我也不知道是做什麼用,只知道默認值是fastcgi_buffers的兩倍。
fastcgi_busy_buffers_size 32k;
8)在寫入fastcgi_temp_path時將用多大的數據塊,默認值是fastcgi_buffers的兩倍。
fastcgi_temp_file_write_size 32k;
9)開啓FastCGI緩存並且爲其制定一個名稱。個人感覺開啓緩存非常有用,可以有效降低CPU負載,並且防止502錯誤。但是這個緩存會引起很多問題,因爲它緩存的是動態頁面。具體使用還需根據自己的需求。
fastcgi_cache TEST
10)爲指定的應答代碼指定緩存時間,如上例中將200,302應答緩存一小時,301應答緩存1天,其他爲1分鐘。
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
11)緩存在fastcgi_cache_path指令inactive參數值時間內的最少使用次數,如上例,如果在5分鐘內某文件1次也沒有被使用,那麼這個文件將被移除。
fastcgi_cache_min_uses 1;
12)不知道這個參數的作用,猜想應該是讓nginx知道哪些類型的緩存是沒用的。
fastcgi_cache_use_stale error timeout invalid_header http_500;

#########################################################
另外,FastCGI自身也有一些配置需要進行優化,如果你使用php-fpm來管理FastCGI,可以修改配置文件中的以下值:
1)同時處理的併發請求數,即它將開啓最多60個子線程來處理併發連接。
<value name="max_children">60</value>
2)最多打開文件數。
<value name="rlimit_files">65535</value>
3)每個進程在重置之前能夠執行的最多請求數。
<value name="max_requests">65535</value>

三、關於內核參數的優化,在/etc/sysctl.conf文件內                                                                                     
1)timewait的數量,默認是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值減小)
net.ipv4.tcp_max_tw_buckets = 6000
2)允許系統打開的端口範圍。
net.ipv4.ip_local_port_range = 1024 65000
3)啓用TIME-WAIT狀態sockets快速回收功能;用於快速減少在TIME-WAIT狀態TCP連接數。1表示啓用;0表示關閉。但是要特別留意的是:這個選項一般不推薦啓用,因爲在NAT(Network Address Translation)網絡下,會導致大量的TCP連接建立錯誤,從而引起網站訪問故障。
net.ipv4.tcp_tw_recycle = 0
=================================================================================
實際上,net.ipv4.tcp_tw_recycle功能的開啓,一般需要net.ipv4.tcp_timestamps(一般系統默認是開啓這個功能的)這個開關開啓後纔有效果;
當tcp_tw_recycle 開啓時(tcp_timestamps 同時開啓,快速回收 socket 的效果達到),對於位於NAT設備後面的 Client來說,是一場災難!!會導致到NAT設備後面的Client連接Server不穩定(有的 Client 能連接 server,有的 Client 不能連接 server)。

tcp_tw_recycle這個功能,其實是爲內部網絡(網絡環境自己可控 ” -不存在NAT 的情況)設計的,對於公網環境下,不宜使用。通常來說,回收TIME_WAIT狀態的socket是因爲“無法主動連接遠端”,因爲無可用的端口,而不應該是要回收內存(沒有必要)。也就是說,需求是Client的需求,Server會有“端口不夠用”的問題嗎?除非是前端機,需要大量的連接後端服務,也就是充當着Client的角色。

正確的解決這個總是辦法應該是:
net.ipv4.ip_local_port_range = 9000 6553            #默認值範圍較小
net.ipv4.tcp_max_tw_buckets = 10000                 #默認值較小,還可適當調小
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_fin_timeout = 10 
=================================================================================

4)開啓重用功能,允許將TIME-WAIT狀態的sockets重新用於新的TCP連接。這個功能啓用是安全的,一般不要去改動!
net.ipv4.tcp_tw_reuse = 1
5)開啓SYN Cookies,當出現SYN等待隊列溢出時,啓用cookies來處理。
net.ipv4.tcp_syncookies = 1
6)web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認爲511,所以有必要調整這個值。
net.core.somaxconn = 262144
7)每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
net.core.netdev_max_backlog = 262144
8)系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被複位並打印出警告信息。這個限制僅僅是爲了防止簡單的DoS攻擊,不能過分依靠它或者人爲地減小這個值,更應該增加這個值(如果增加了內存之後)。
net.ipv4.tcp_max_orphans = 262144
9)記錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M內存的系統而言,缺省值是1024,小內存的系統則是128。
net.ipv4.tcp_max_syn_backlog = 262144
10)時間戳可以避免序列號的卷繞。一個1Gbps的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異常”的數據包。
net.ipv4.tcp_timestamps = 1
=============================================================================
有不少服務器爲了提高性能,開啓net.ipv4.tcp_tw_recycle選項,在NAT網絡環境下,容易導致網站訪問出現了一些connect失敗的問題。
個人建議:
關閉net.ipv4.tcp_tw_recycle選項,而不是net.ipv4.tcp_timestamps;
因爲在net.ipv4.tcp_timestamps關閉的條件下,開啓net.ipv4.tcp_tw_recycle是不起作用的;而net.ipv4.tcp_timestamps可以獨立開啓並起作用。
=============================================================================
11)爲了打開對端的連接,內核需要發送一個SYN並附帶一個迴應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK包的數量。
net.ipv4.tcp_synack_retries = 1
12)在內核放棄建立連接之前發送SYN包的數量。
net.ipv4.tcp_syn_retries = 1
13)如果套接字由本端要求關閉,這個參數 決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關閉連接,甚至意外當機。缺省值是60秒。2.2 內核的通常值是180秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB服務器,也有因爲大量的死套接字而內存溢出的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因爲它最多隻能喫掉1.5K內存,但是它們的生存期長些。
net.ipv4.tcp_fin_timeout = 30
14)當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時。
net.ipv4.tcp_keepalive_time = 30

=====================================================================
以下是一個常用的內核參數的標準配置
[root@dev-huanqiu ~]# cat /etc/sysctl.conf
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            //這四行標紅內容,一般是發現大量TIME_WAIT時的解決辦法
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 = 1            //在net.ipv4.tcp_tw_recycle設置爲1的時候,這個選擇最好加上
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1           //開啓此功能可以減少TIME-WAIT狀態,但是NAT網絡模式下打開有可能會導致tcp連接錯誤,慎重。
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 6553500

##############  tcp參數引起的一個nginx故障   #############
net.ipv4.tcp_tw_recycle = 1 這個功能打開後,確實能減少TIME-WAIT狀態,習慣上我都會將這個參數打開。
但是也因爲這個參數踩過一次坑:
公司的一個發佈新聞的CMS後臺系統,採用haproxy+keepalived代理架構,後端的real server服務器外網ip全部拿掉。
現象:在某一天早上發文高峯期,CMS後臺出現訪問故障,重啓php服務後會立刻見效,但持續一段時間後,訪問就又出現故障。
排查nginx和php日誌也沒有發現什麼,後來google了一下,發現就是net.ipv4.tcp_tw_recycle這個參數搗的鬼!
這種網絡架構對於後端的realserver來說是NAT模式,打開這個參數後,會導致大量的TCP連接建立錯誤,從而引起網站訪問故障。
最後將net.ipv4.tcp_tw_recycle設置爲0,關閉這個功能後,後臺訪問即刻恢復正常

#############   Nginx安全配置小提示    #############
下面是一個常見安全陷阱和解決方案的列表,它可以輔助來確保你的Nginx部署是安全的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1)禁用autoindex模塊。這個可能在你使用的Nginx版本中已經更改了,如果沒有的話只需在配置文件的location塊中增加autoindex off;聲明即可。
 
2)禁用服務器上的ssi (服務器端引用)。這個可以通過在location塊中添加ssi off; 。
 
3)關閉服務器標記。如果開啓的話(默認情況下)所有的錯誤頁面都會顯示服務器的版本和信息。將server_tokens off;聲明添加到Nginx配置文件來解決這個問題。
 
4)在配置文件中設置自定義緩存以限制緩衝區溢出攻擊的可能性。
client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
 
5)將timeout設低來防止DOS攻擊。所有這些聲明都可以放到主配置文件中。
client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     65;
send_timeout          10;
 
6)限制用戶連接數來預防DOS攻擊。
limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;
 
7)試着避免使用HTTP認證。HTTP認證默認使用crypt,它的哈希並不安全。如果你要用的話就用MD5(這也不是個好選擇但負載方面比crypt好) 。

#############   總結:Nginx調優方式   #############
1、隱藏 Nginx 版本號(server_tokens off)
2、隱藏 Nginx 版本號和軟件名(進入nginx的源碼包裏修改)
3、更改 Nginx 服務的默認用戶
4、優化 Nginx worker 進程數
5、綁定 Nginx 進程到不同的 CPU 上
6、優化 Nginx 處理事件模型
7、優化 Nginx 單個進程允許的最大連接數
8、優化 Nginx worker 進程最大打開文件數
9、優化服務器域名的散列表大小
10、開啓高效文件傳輸模式
11、優化 Nginx 連接超時時間
12、限制上傳文件的大小
13、FastCGI 相關參數調優
14、配置 Nginx gzip 壓縮
15、配置 Nginx expires 緩存
16、優化 Nginx日誌(日誌切割)
17、優化 Nginx 站點目錄
18、配置 Nginx 防盜鏈
19、配置 Nginx 錯誤頁面優雅顯示
20、優化 Nginx 文件權限
21、Nginx 防爬蟲優化
22、控制 Nginx 併發連接數
23、集羣代理優化

#############   運維中常用Nginx監控與性能調優做法   #############
1. Nginx監控
nginx有自帶的監控模塊,編譯nginx的時候,加上參數 --with-http_stub_status_module

1
2
3
4
5
6
7
8
9
10
11
12
13
# 配置指令
  ./configure --prefix=/usr/local
    --user=nginx
    --group=nginx
    --with-http_ssl_module
    --with-http_realip_module
    --http-client-body-temp-path=/usr/local/var/tmp/nginx/client
    --http-proxy-temp-path=/usr/local/var/tmp/nginx/proxy
    --http-fastcgi-temp-path=/usr/local/var/tmp/nginx/fcgi
    --http-scgi-temp-path=/usr/local/var/tmp/nginx/scgi
    --http-uwsgi-temp-path=/usr/local/var/tmp/nginx/uwsgi
    --with-http_geoip_module
    --with-http_stub_status_module

接着修改nginx配置文件,添加監控狀態配置

1
2
3
4
5
6
location = /nginx_status {
             stub_status on;
             access_log off;
             allow 127.0.0.1;
             deny all;
}

最後就可以通過 "curl 127.0.0.1/nginx_status"訪問nginx的狀態了。

上面是很簡單的一個模塊,除了這個還有外部的工具比如:ngxtop監控請求信息

1
2
3
4
5
6
7
8
9
10
11
12
安裝python-pip
    # yum install epel-release
    # yum install python-pip
安裝ngxtop
    # pip install ngxtop
 
ngxtop常用指令:
# ngxtop top remote_addr   查看訪問最多的IP
# ngxtop -i 'status >= 400' print request status http_referer    #列出4xx or 5xx 的相應
指定配置文件: # ngxtop -c /etc/nginx/nginx.conf
查詢狀態是200:# ngxtop -c /etc/nginx/nginx.conf -i 'status==200'
查詢訪問最多ip: # ngxtop -c /etc/nginx/nginx.conf -g remote_addr

還有一種圖像化工具nginx-rrd,但是需要和php整合,這裏就不介紹了。

2. 常用的Nginx優化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
1)配置線程數和併發數  #############################
worker_processes 4  #cpu(取決於cpu的核數,一般爲cpu核數或倍數。也可以配置成auto,讓nginx自己選擇工作線程數)
events{
    worker_connections 10240;  #每一個進程打開的最大連接數,包含了nginx與客戶端和nginx與upstream之間的連接(受限於操作系統)
    multi_accept on;  #可以一次建立多個連接
    use epoll;   # Linux下多路複用IO接口select/poll的增強版本,它能顯著提高程序在大量併發連接中只有少量活躍的情況下的系統CPU利用率
}
 
2)配置後端Server的長連接  #############################
upstream server_pool{
    server    localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
    server    localhost:8081 weight=1 max_fails=2 fail_timeout=30s;
    keepalive 300;    #300個長連接
}
location /{
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://server_pool/;
 
}
 
3) 啓用緩存、壓縮。Nginx的緩存還有很大的侷限性,下面是靜態文件壓縮配置  #############################
gzip on;
    gzip_disable "msie6";
    gzip_proxied any;
    gzip_min_length 1000;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
 
4)其他優化  #############################
sendfile on;       #減少文件在應用和內核之間的拷貝
tcp_nopush on;     #當數據包達到一定大小再發送
tcp_nodelay off;   #有數據隨時發送(只用在應答需要非常快速的情況下
 
注意:測試nginx語法是否正確:nginx -t
 
5) 操作系統優化  #############################
1. 配置文件/etc/sysctl.conf
sysctl -w net.ipv4.tcp_syncookies=1      #防止一個套接字在有過多試圖連接到達時引起過載
sysctl -w net.core.somaxconn=1024        #默認128,連接隊列
sysctl -w net.ipv4.tcp_fin_timeout=10    #timewait的超時時間
sysctl -w net.ipv4.tcp_tw_reuse=1        #os直接使用timevait的連接
sysctl -w net.ipv4.tcp_tw_recycle=0      #回收禁用
 
2. 配置文件/etc/security/limits.conf
hard nofile 204800
soft nofile 204800
soft core unlimited
soft stack 204800

 

轉自

Nginx高併發性能優化 - 運維筆記 - 散盡浮華 - 博客園
https://www.cnblogs.com/kevingrace/p/6094007.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章