backlog的意思是,超出目前程序对于请求处理能力最大值,之后可以准许排队的请求数量。对于linux+nginx+php的组合来讲,需要合理的搭配这三者的处理能力(处理中的连接数最大值+backlog排队数值),综合调优。
nginx的backlog配置(nginx.conf)
listen 80 backlog=8192;
listen 443 backlog=8192;
默认值
-1
,即处理中的连接队列满了就拒绝; 处理中的连接队列最大值请查看worker_connections
配置PS:
最大连接数
+backlog
不能一味追求过大,要考虑后端php的处理能力,也要考虑linux系统的资源情况(主要是内存)
php-fpm的backlog配置(php-fpm.conf)
listen.backlog = 8192
关于此配置的默认值,可以打开默认配置文件查看(5.6.40版本是65536);关于处理中的连接队列最大值请查看php进程管理配置说明
PS: php-fpm的backlog不能一味追求大,需要看硬件处理水平而定。
- 如果
最大进程数
+backlog
设置过大,php的处理性能跟不上,超出了nginx等待时间,则会返回504,而php会报错broken pipeline- 如果
最大进程数
+backlog
设置过小,nginx的请求过多,则会返回502
linux系统内核配置(/etc/sysctl.conf)
# 系统全局参数:每一个listen() socket的最大backlog上限
net.core.somaxconn = 655360
# 每个网络接口,允许后台排队队列数据包的最大数目
net.core.netdev_max_backlog = 1048576
# 尚未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 1048576
查看效果
# 修改完之后检查状态
ss -ln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 8192 127.0.0.1:9000 *:*
LISTEN 0 8192 *:80 *:*
除了backlog是为了应对突发能力的额外队列之外
此处的配置,可以参考linux limit 配置