博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx 502 bad gateway
阅读量:6341 次
发布时间:2019-06-22

本文共 2594 字,大约阅读时间需要 8 分钟。

 

 

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_childrenpm.max_requestsrequest_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.confpm.max_children = 50

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占用率高,导致后台差不到数据也要注意

"世界上只有一种真正的英雄主义,就是认清了生活的真相后,还依然执着地热爱它。" ——罗曼·罗兰
 
分类:  ,

转载于:https://www.cnblogs.com/gaoyuechen/p/10133546.html

你可能感兴趣的文章
为什么React获取数据是在componentDidMount
查看>>
每日 30 秒 ⏱ 优雅初始化数组
查看>>
Python装饰器高级用法
查看>>
Git安装 for windows
查看>>
我统计了掘金前端面试文章出现的比例
查看>>
请给Sprint Boot多一些内存
查看>>
T 沙龙移动实践日总结 ——享物说大流量⼩程序的架构与性能优化方案
查看>>
浏览器渲染网页的过程
查看>>
聊聊系统平均负载
查看>>
斗鱼做直播已经年收益突破40亿:一对一在线直播程序源码、直播网站搭建就找布谷科技...
查看>>
深入理解Vue源码系列-6.认识下virtual dom
查看>>
Android的AsyncTask异步任务浅析
查看>>
关于weak 关于KVO
查看>>
微信 Tinker + 腾讯 Bugly 热修复就搞定啦
查看>>
基于docker搭建MySQL主从复制
查看>>
在appdelegate中 设置跟视图控制器 但是没办法全屏
查看>>
Java并发编程40道面试题及答案——面试稳了
查看>>
Spring中给静态字段(field)注入bean
查看>>
Unity内实现OBB包围盒算法
查看>>
4 极限的运算法则
查看>>