Nginx 502

nginx 502 bad gateway

总结
一般是php问题居多,也需要调整相应的nginx参数,最后也可能是mysql假死

nginx问题
查看日志中的报错error.log
一般设置路径/usr/local/nginx/logs/nginx_error.log

nginx等待时间超时
Nginx代理过程,将业务服务器请求数据缓存到本地文件,再将文件数据转发给请求客户端。高并发的客户端请求,必然要求服务器文件句柄的并发打开限制。

使用ulimit命令(ulimit -n),查看Linux系统文件句柄并发限制,默认是1024,我们可以改为65535(2 的 16 次方,这是系统端口的极限)。

修改的方法为:修改系统文件/etc/security/limits.conf,添加如下信息,并重新启动系统生效。

修改nginx.conf配置参数

部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

http  {
  fastcgi_connect_timeout 300;    # 链接
  fastcgi_send_timeout 300;    # 读取
  fastcgi_read_timeout 300;    # 发请求
  ......
  }

fastcgi_read_timeout是指fastcgi进程向nginx进程发送response的整个过程的超时时间

fastcgi_send_timeout是指nginx进程向fastcgi进程发送request的整个过程的超时时间

这两个选项默认都是秒(s),可以手动指定为分钟(m),小时(h)等

php问题
一般是/usr/local/php/etc/php-fpm.conf三个参数(最主要的问题)

pm.max_children
pm.max_requests
request_terminate_timeout

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

具体根据php-fpm.conf中error.log跟slow.log两个日志来判断

/usr/local/php/var/log/php-fpm.log
/usr/local/php/var/log/php-fpm-slowlog.log
1.php进程池pm.max_children参数

netstat -anp | grep php | grep CONNECTED
ps aux | grep php-fpm 观察fastcgi/php-fpm进程数,假如使用的进程数等于或高于5个,说明需要增加
vim /usr/local/php/etc/php-fpm.conf
pm.max_children = 50

1、max_children:
是PHP-FPM Pool 最大的子进程数,他数值取决于你的服务器内存。
假设你打算给10G内存给当前配置的PHP-FPM Pool,一般一个PHP请求占用内存20M-30M,我们按站点每个PHP请求占用内存25M,这样max_children = 10G/25M = 409。所以,这个值可以根据情况算出来

每个PHP请求占用内存可以在测试你的php程序时通过memory_get_peak_usage(true)这个函数获得内存峰值,以此作为单个请求的程序内存消耗消耗量,并考虑进php-fpm本身的基础内存消耗,可以得到一个近似的单进程内存消耗量。

  • 只要在峰值的时候所有PHP pool所耗内存低于我的有效内存80%算是合理的

pm.max_spare_servers这个参数值要小于pm.max_children的值,不然会启动php-fpm失败

2、pm.max_requests参数

我们知道这个参数的含义是php-fpm工作进程处理完多少请求后自动重启,主要目的就是为了控制请求处理过程中的内存溢出,使得内存占用在一个可接受的范围内。

max_requests = N 是指当每个children接受了N次请求以后,就会把自己杀死,然后重新建立一个children。

比如上面的值是1000,而你定义的是10240,那么fpm要超过10天才能杀死children并重建,这样如果存在内存泄露的话,就会导致进程占用过多的内存而无法释放,从而使fpm的处理能力降低,还会产生一些莫名其妙的错误。

但是如果你把这个值设置的过小,fpm频繁的杀死children并重建,也会导致额外的开销。

  • 这个参数依情况而定吧,具体没有实验测试过

3、request_terminate_timeout参数

max_requests是每个子进程重生之前处理的请求数, 默认值为unlimited(默认为1024),可以设置小一点(如500左右),这样可以避免内存泄露带来的问题

或者在/usr/local/php/etc/php.ini下的max_execution_time参数修改,百度这两个值貌似没有什么区别,最好的就是两个都设置一下

request_terminate_timeout = 0s #表示关闭,即无限执行下去。

4.php权限问题

php-fpm.conf中定义属主,属组
listen.owner = nobody //定义属主
listen.group = nobody //定义属组
这里的nobody只的是nginx的用户

5.php内存不足
php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。

mysql假死

根据mysql日志排查,这种情况不多,但要注意,暂时没有遇到过
一般引起mysql假死的原因有两种:

  1. mysql假死了,你也请求不到后端的
  2. mysql慢查询也会引起

mysql 的cpu占用率高,导致后台差不到数据也要注意

Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关。

常见的原因可能是php-cgi进程数不够用、php执行时间长(mysql慢)、或者是php-cgi进程死掉,都会出现502错误。

  1. 在安装好的环境中,运行一段时间出现502问题,一般是因为默认php-cgi进程是5个,可能因为phpcgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。

  2. php执行超时,修改/usr/local/php/etc/php.ini 将max_execution_time 改为300

  3. 磁盘空间不足,可以使用 # df -h命令查看磁盘使用量

  4. php-cgi进程死掉了。

通常的排查方法如下:

1、查看php fastcgi的进程数(max_children值)

# netstat -anop | grep php-cgi | wc -l
# netstat -anpo | grep php-fpm | wc -l

在这里插入图片描述
假如显示是5

2、查看当前进程

# ps aux | grep php-fpm 观察fastcgi/php-fpm进程数,假如使用的进程数等于或高于5个,说明需要增加。

在这里插入图片描述

3、调整/usr/local/php/etc/php-fpm.conf 的相关设置

pm.max_children = 5
request_terminate_timeout = 60

在这里插入图片描述

在这里插入图片描述

max_children最多5个进程,按照每个进程20MB内存,最多100MB。也就是1分钟。max_children增多,则php-cgi的进程多了就会处理的很快,排队的请求就会很少。 但是设置max_children也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右。根据自己服务器购买的内存来实际决定。
request_terminate_timeout执行的时间为60秒,request_terminate_timeout值可以根据服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。

  1. 部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

http
{

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

}

在这里插入图片描述

参考资料

https://www.cnblogs.com/irockcode/p/8336313.html

https://www.cnblogs.com/feng18/p/5148985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
nginx 502 Bad Gateway错误通常是由于Nginx作为反向代理时,无法成功连接到后端的上游服务器或后端服务器未能正确响应请求导致的[^2]。以下是一些可能的解决办法: 1. 检查上游服务器:确保上游服务器(通常是应用服务器或其他代理服务器)正在运行并监听正确的端口。可以尝试直接访问上游服务器,检查是否能够正常访问。如果上游服务器出现故障或网络问题,就会导致502错误。 2. 查看Nginx错误日志:检查Nginx的错误日志,通常位于/var/log/nginx/error.log或指定的配置文件中的error_log指令所定义的位置。错误日志中可能会提供有关502错误的更详细信息,帮助你定位问题。 3. 调整Nginx配置:尝试调整Nginx的配置文件,例如增加或修改proxy_connect_timeout、proxy_read_timeout和proxy_send_timeout等参数的值,以便更好地适应后端服务器的响应时间。 4. 检查网络连接:确保Nginx服务器和后端服务器之间的网络连接正常。可以使用ping命令或telnet命令测试网络连接是否正常。 5. 检查防火墙设置:确保防火墙没有阻止Nginx服务器与后端服务器之间的通信。可以检查防火墙规则,确保允许Nginx服务器与后端服务器之间的通信。 6. 重启Nginx服务:尝试重启Nginx服务,有时候502错误可能是由于临时的配置问题或服务问题导致的。 请注意,以上解决办法仅供参考,具体的解决方法可能因情况而异。如果问题仍然存在,请根据具体情况进一步排查和解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟伟哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值