LINUX:Linux用變量tcp_max_syn_backlog定義backlog隊列容納的最大半鏈接數。
vim /etc/sysctl.conf能夠檢查配置這個變量。
net.ipv4.tcp_max_syn_backlog = 16384
可是nginx服務器的backlog隊列遠遠沒有到達這個值,就開始拒絕了鏈接,檢查nginx的官方文檔:
http://wiki.nginx.org/HttpCoreModule#Directives
中註明:
listen指令中的參數backlog:
backlog=num -- is assigned parameter backlog in call listen(2). By default backlog equals -1.
這樣應該不會產生問題,可是查看當前nginx的源代碼:
cd /home/software/nginx-1.2.6/src
grep backlog -ir *獲得相關參數以及輸出(省略其餘輸出):
os/unix/ngx_darwin_config.h:#define NGX_LISTEN_BACKLOG -1
os/unix/ngx_solaris_config.h:#define NGX_LISTEN_BACKLOG 511
os/unix/ngx_posix_config.h:#define NGX_LISTEN_BACKLOG 511
os/unix/ngx_linux_config.h:#define NGX_LISTEN_BACKLOG 511
os/unix/ngx_freebsd_config.h:#define NGX_LISTEN_BACKLOG -1
由此在linux平臺上nginx默認的backlog其實是511,須要配置此值來增大backlog隊列。
注意:
內核版本小於2.6.20的話max_qlen_log是直接由sysctl_max_syn_backlog決定的,因此半鏈接隊列的長度就是等於 sysctl_max_syn_backlog
內核版本大於2.6.20的話,SYN_RECV狀態數最大值由 net.ipv4.tcp_max_syn_backlog net.core.somaxconn 和 listen()函數中第二個參數int backlog 三個值共同決定
具體計算能夠參考:
http://www.piao2010.com/linux%E8%AF%A1%E5%BC%82%E7%9A%84%E5%8D%8A%E8%BF%9E%E6%8E%A5syn_recv%E9%98%9F%E5%88%97%E9%95%BF%E5%BA%A6%E4%BA%8C
產生此問題時候錯誤日誌在/var/log/message中能夠看到:
kernel: possible SYN flooding on port 80. Sending cookies. linux