linux服务器php访问量暴增导致网页504 修改默认的php-fpm设置
线上机器默认的pm.max_children = 50 达到了上限,导致服务器504,
先重启php-fpm恢复线上服务,systemctl restart php-fpm
然后查看日志,
tail -f /var/log/php-fpm/error.log
cd /etc/php-fpm.d/ 下的 www.conf 修改配置
目前遇到的问题是pm.max_children 默认是50 超出了,设置成了200,以后观察
查看php-fpm的进程数 pstree | grep php-fpm 或者 ps aux | grep -c php-fpm
有个问题是 当max_children 的值小于 pm.max_spare_servers 的时候重启会报错。设置了180
随后设置了pm.start_servers 和pm.min_spare_servers为32
重启无报错
Min设置为35的意思是当服务器比较空闲的时候,那些进程会一个个的被关闭。但是最少保存35个。
min弄高一点。好像是因为如果你突然之间很大的请求量。每一次请求都要开一个进程,那么刚开始这些请求会很慢。
解决方法:
1.通过百度可以很多人的说法,调整 nginx配置或者php-fpm配置,配置大家都可以百度,在这边就不多说。但是很多都尝试了没有什么软用。
2.尝试过上面的方法还是回到本质上是不是整站都是504.如果不是,我建议你打开php-fpm 慢日志来查看对应的页面请求与响应慢是由哪个方法或者操作造成的。
php-fpm 慢日志的配置如下:
request_slowlog_timeout = 5 //5秒以上的 当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中 设置为 ‘0’ 表示 ‘Off’
slowlog = /var/log/php-fpm.slow.log //日志目录
再打开日志方法查看是哪个方法或者操作导致的。直接修改代码。
php-fpm 慢日志 不建议在生产环境下使用。
504 Gateway Time-out就字面意思,我们可以理解为网页请求超时,也就是浏览网站网页所发出的请求没有反应或者未响应,在网站程序层面来说,就是请求未能够执行相应的PHP-CGI程序,或者PHP-CGI程序未能做出相应的处理,又或者是CGI程序的响应处理结果未能够反馈到浏览器或者未能及时反馈到浏览器。
504 Gateway Time-out错误多是存在于Nginx网站服务器环境下,多与nginx.conf与php-fpm.conf设置是否正确合理有关。504GatewayTime-out错误的解决方法就是根据网站服务器性能及网站流量等诸多因素整合考虑,正确合理的设置niginx.conf和php-fpm.conf配置。
进行正确合理nginx.conf配置,我们需要先了解和清楚我们网站服务器的配置性能,包括CPU、内存等,并对网站服务器进行必要的性能测试(可参考:vps主机性能测试方法详解),从而准确的掌握网站服务器自身性能状况;
其次,是通过网站统计代码的添加,分析段时间内网站流量状况,比如:百度统计、CNZZ站长统计等,掌握网站日流量及PHP-CGI请求的大概情况;
后,根据我们掌握的服务器性能状况及网络流量情况,合理的对nginx.conf中的下列字句进行合理正确的设置。
fastcgi_connect_timeout300s;
fastcgi_send_timeout300s;
fastcgi_read_timeout300s;
fastcgi_buffer_size128k;
fastcgi_buffers8128k;#8128
fastcgi_busy_buffers_size256k;
fastcgi_temp_file_write_size256k;
fastcgi_intercept_errorson;
这些字句的设置规定了PHP-CGI的连接、发送和读取时间限制,需根据服务器性能及网络流量综合考虑设置,时间设置过长会给网站服务器造成压力,导致网站响应缓慢,甚至服务器宕机;时间设置过短,则就会出现504 Gateway Time-out或者其他CGI无响应错误。
还有就是php-fpm.conf中max_children与request_terminate_timeout两个重要参数的设置。这两个参数的设置需要我们根据PHP程序情况及服务器带宽状况综合考虑并计算出合理准确的值,才能够避免504 Gateway Time-out或者其他CGI无响应错误的出现。通常情况下,般网站,可将request_terminate_timeou设置在900s左右,而max_children值根据服务器内存大小和CGI请求数目设置为合理的数值,般设置为800M左右。