今天刚好周末,恰好白天有事也不在电脑旁边,晚上的时候发现博客有问题了,只要是访问.php的都打不开,由于我用了百度CDN,它返回的是一个“502”源站未知错误。
环境:Linux+Nginx+PHP+Mysql
我只好上服务器去排查了一下,我查看了Nginx的日志文件,用命令:
[root@localhost logs]# tail error.log
结果发现有大量的类似如下的这种错误:
upstream timed out (110: Connection timed out) while reading response header from upstream,upstream: "fastcgi://127.0.0.1:9000"
中文翻译
从上游读取响应标头时,上游超时(110:连接超时),上游:"fastcgi://127.0.0.1:9000"
具体的完整错误如下:
2020/11/29 20:24:43 [error] 22724#0: *42932264 upstream timed out (110: Connection timed out) while reading response header from upstream, client: *.*.*.42, server: fujieace.com,www.fujieace.com,*.fujieace.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "mayalan.fujieace.com"
2020/11/29 20:24:44 [error] 22724#0: *42932270 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 58.*.*.*, server: fujieace.com,www.fujieace.com,*.fujieace.com, request: "GET /linux/permission-denied.html HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.fujieace.com"
原因
只要出现类似于“fastcgi://127.0.0.1:9000”,基本上就是后端php服务有问题了。
例如:php服务未启动。php服务虽然启动了,但是,却查不到9000端口.......等等原因。
解决方法
由于我为了让网站能快速恢复正常,我也没有细排查原因,我只简单的用了几个命令:
1、top ,正常。
2、df -h ,磁盘正常,未满。
3、free -m,内存正常。
我最终的解决方法是:
先杀掉 php-fpm 服务,再重启 php-fpm 服务,最终网站恢复正常。
[root@localhost logs]# pkill -9 php-fpm
[root@localhost php]# ./sbin/php-fpm
我个人感觉我的原因是:php-fpm启动以后,没有出现9000端口,也就是我的 9000端口 未监听。虽然我上服务器用命令“ps aux | grep php”能够查到这个服务,但是端口当时我却没有去看。
给大家两个Linux 查看端口占用情况命令,可以使用 lsof 和 netstat 命令。
[root@localhost /]# netstat -tunlp | grep 9000
[root@localhost /]# lsof -i:9000
其它解决方法
网上文章也有一种修改配置文件的解决方法,504导致访问无响应回复的解决方法。
我暂时没有用此种方法,后期我观察一段时间再说!毕竟我重启php-fpm服务能解决,就不乱改nginx.conf配置了。
具体解决方法如下:
在server标签内增加以下代码内容。 再重启Nginx服务。
重点看:xxx_xxx_timeout 300;
[root@localhost /]# vim nginx.conf
server {
listen 80;
server_name zabbix.gree.com;
access_log /roobo/logs/nginx/zabbix.gree.com_access.log main;
error_log /roobo/logs/nginx/zabbix.gree.com_error.log error ;
root /roobo/webserver/zabbix;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi.conf;
fastcgi_pass 10.7.19.195:9000;
}
#error Connection timed out and 504 error
large_client_header_buffers 4 16k;
client_max_body_size 30m;
client_body_buffer_size 128k;
fastcgi_connect_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 64k;
fastcgi_temp_file_write_size 64k;
}
注意:
php设置时间过短,执行超时有可能会影响。因此,也需要通过修改 php.ini 文件。
调整 max_execution_time = 300 ;
再重启php服务。
总结:
不管是改 nginx.conf 还是 php.ini ,甚至是 php-fpm.conf 配置文件;首先必须要保证 127.0.0.1:9000 能通,这个也是前提,如果没有这个前提,一切都是白瞎了。
原因:
经过几个月的观察,我发现是由于 php-fpm假死 所造成的。最根本的原因是由于我的博客请求量太大,毕竟现在访问的人多了,已经破万了。而且php里面又有挂起的任务,导致php-fpm在高峰期的时候经常假死掉,只有手动重启才能解决这个问题,当然了,也可以写一个脚本,用定时任务。
问:什么是php-fpm假死?
答:服务器CPU、内存、带宽等硬件都是正常的,php服务也是正常启动的,可以清楚的看到有很多个php-fpm子进程,虽然显示是正常的,其实有的它已经死掉了,不能处理php代码了。这就是所谓的php-fpm假死。
原理:
nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端php-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题导致不能正确解析php代码,最终返回给了客户端502错误。
nginx+php出现502 bad gateway,一般这都不是nginx的问题,而是由于fastcgi或者php的问题导致的。
解决方法:
前面也说过了,php-fpm既然假死了,有两种解决方法:
第二种:直接重启php-fpm就能恢复正常。至于你是手工启动php-fpm,还是写一个脚本+定时任务?这个就看个人需求了。