nginx服务器的半连接

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.

你可能感兴趣的:(nginx,tcp)