LINUX:Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。
vim /etc/sysctl.conf可以检查配置这个变量。 net.ipv4.tcp_max_syn_backlog = 16384 但是nginx服务器的backlog队列远远没有到达这个值,就开始拒绝了连接,检查nginx的官方文档: 中注明: 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 三个值共同决定 具体计算可以参考: 产生此问题时候错误日志在/var/log/message中可以看到: kernel: possible SYN flooding on port 80. Sending cookies.