nginx+fpm高并发的优化思路及方法
优化思路
- php opcache开启
- 系统内核参数
nginx 启用unix socket方式
opcache的开启
参见 https://www.habby.top/archives/44.html
nginx的unix socket方式
常用的nginx+fpm的模式下 经常都是用的tcp端口的形式
在nginx配置中都可见fastcgi_pass 127.0.0.1:9000;
这种写法
但是在这个写法下,经过老衲2000并发压测(服务器为阿里云独享4核8G) 会有10%左右的错误. 自然是不能接受的
后改为unix socket方式 nginx配制成fastcgi_pass unix:/dev/shm/php-fpm.sock;
(注意/dev/shm/php-fpm.sock路径是在php-fpm.conf中配置的)
反而大量报错11: Resource temporarily unavailable
经过搜索发现需要调整系统参数
kernel参数:
/etc/sysctl.conf,不能低于上面的配置
net.ipv4.tcp_max_syn_backlog = 16384
net.core.netdev_max_backlog = 16384
net.core.somaxconn = 2048
net.core.somaxconn这个值有的文档有些直接修改/proc/sys/net/core/somaxconn,实测该文件其实不可修改
直接编辑/etc/sysctl.conf即可
最后执行
sysctl -p
调整nginx php-fpm参数
php-fpm.conf:
配置文件的listen.backlog = 8192 # 默认为-1(由系统决定)
有的文档中有写需要配置nginx中的backloglisten 80 backlog=8192; # 默认为511
但是实测发现,nginx中不用配置,或许没有达到极限值
最后测试 2000并发 qps 600 错误了0.4% 完全可以接受(请忽视框架效率)