问题概述
在某段时间段,网站出现 nginx 502,通过宝塔查看,负载状态是 100%,查看监控,磁盘 IO 飙高,如下为近 7 日 IO 磁盘图:
排查数据
nginx 抛出 502,证明是它的反向代理出错,这个代理 php-cgi 出了问题,我用的是 php-fpm,出了问题。 查看 php-fpm 日志,发现并没有什么异常,提示需要提升 start_servers 是因为在这个时候我重载了 php-fpm, 但是重启后并没作用。然后重启了 nginx,才恢复了正常。
查看 nginx 日志,出现了很多*12359859 connect() to unix:/tmp/php-cgi-72.sock failed (11: Resource temporarily unavailable) while connecting to upstream
根据这个 nginx 这个提示查了相关资料,得到了 3 个解决方案
1、php-fpm 的 sock 通讯方式 改为 tcp
结论:不考虑,查了相关的 blog,出现了相同问题,还从 tcp 改为 sock 模式呢!!
2、用两个 php-fpm sock,nginx 负载均衡
2.1、复制一份配置文件,修改里边的 pid sock cp /usr/local/php/etc/php-fpm.conf cp /usr/local/php/etc/php-fpm2.conf
[global] pid = /usr/local/php/var/run/php-fpm2.pid error_log = /usr/local/php/var/log/php-fpm2.log log_level = notice [www] listen = /tmp/php-cgi2.sock 2.2、复制一个启动文件,也修改相关的信息
cp /etc/init.d/php-fpm /etc/init.d/php-fpm2
php_fpm_BIN=${exec_prefix}/sbin/php-fpm php_fpm_COnF=${prefix}/etc/php-fpm2.conf php_fpm_PID=${prefix}/var/run/php-fpm2.pid 2.3、启动 /etc/init.d/php-fpm2 start
2.4、nginx 配置文件,增加 upstream 模块
upstream backend{ server unix:/tmp/php-cgi.sock; server unix:/tmp/php-cgi2.sock; } 2.5、把 fastcgi_pass unix:/tmp/php-cgi.sock;改成 fastcgi_pass backend; 重新加载 /etc/init.d/nginx reload
结论:这个方法,和我直接调大 php-fpm max_children 差不多,不考虑。
3、php-fpm 的 listen.backlog 默认-1 改为 1024 或者 4096,即是调大
结论:待检验,
V 友们,又遇到我这种情况吗?
