upstream timed out (110: Connection timed out) 原因与解决方法

今天刚好周末,恰好白天有事也不在电脑旁边,晚上的时候发现博客有问题了,只要是访问.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"

upstream timed out 110

 

原因

只要出现类似于“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既然假死了,有两种解决方法:

第一种:设置 pm.max_requests 

第二种:直接重启php-fpm就能恢复正常。至于你是手工启动php-fpm,还是写一个脚本+定时任务?这个就看个人需求了。

    A+
发布日期:2020年11月29日 21:13:38  所属分类:Nginx
最后更新时间:2023-04-07 18:11:25
付杰
  • ¥ 49.9元
  • 市场价:99.9元
  • ¥ 498.0元
  • 市场价:998.0元
  • ¥ 818.0元
  • 市场价:1688.0元
  • ¥ 1980.0元
  • 市场价:2980.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: