502 bad gateway nginx 的错误的解决方案
总结
一般是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
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假死的原因有两种:
- mysql假死了,你也请求不到后端的
- mysql慢查询也会引起
mysql 的cpu占用率高,导致后台差不到数据也要注意
个人公众号谢谢各位老铁支持

502 bad gateway nginx 的错误的解决方案的更多相关文章
- CentOS 7 + nginx + uwsgi + web2py (502 bad gateway nginx)
Web2py开发包中自带的setup-web2py-nginx-uwsgi-centos64.sh脚本, 只能运行在CentOS 6.4中使用, 如果直接在CentOS 7 中使用该脚本布署后, 访问 ...
- 关于SpringCloud的微服务架构,提示502 Bad Gateway nginx/1.10.0
1.具体环境是使用虚拟机,并在虚拟机上安装nginx对本机上的端口服务进行反向代理 我按照步骤一步步搭建完环境以后,第一次使用是可以正常使用的,当我关闭计算机后,再一次启动环境,就会发现输入网址之后网 ...
- 解决 504 Gateway Time-out和502 Bad Gateway(nginx)
504 Gateway Time-out 问题所在: 所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓 ...
- 502 bad gateway 可能的错误原因
1.PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间 #http代码段中增加 fastcgi_connect_timeout ...
- 502 bad gateway nginx
此方法可能仅对于我的问题有效 我在VMware虚拟机启动docker container nginx的,一开始启动nginx的contatiner,在浏览器是可以正常访问的,但次日重新访问时就报502 ...
- 502 Bad Gateway nginx 解决
打开 /usr/local/php/etc/php-fpm.conf 调大以下两个参数(根据服务器实际情况,过大也不行) <value name=”max_children”>5120&l ...
- NGINX+UWSGI 莫名发生Nginx 502 Bad Gateway错误的排查过程
自己有个阿里云UBUNTU运行的Django站,使用NGINX+UWSGI驱动,今天登陆系统后台更新内容出现了几个大字:Nginx 502 Bad Gateway,一看情况不好,这是要糟糕啊. 啊西八 ...
- 504 Gateway Time-out 和 502 Bad Gateway相关处理
若报:504 Gateway Time-out则与nginx有关 解决方案: #vim nginx.conf 添加以下代码: http{ fastcgi_connect_timeout 300; fa ...
- legend3---Homestead中Laravel项目502 Bad Gateway
legend3---Homestead中Laravel项目502 Bad Gateway 一.总结 一句话总结: 用查看错误日志的方法解决错误:(/var/log/nginx/.log) 1.home ...
随机推荐
- Windows 10下怎么远程连接 Ubuntu 16.0.4(方案二)
使用TeamViewer实现远程桌面连接 背景: 有些朋友反映,借助Ubuntu自带的桌面共享工具desktop sharing会有不再同一网端下出现连接不稳定或者掉线的问题,那么现在我们就可以借助第 ...
- Word模板替换
package com.sisa.auweb.tools.bookmarkprocess; import org.apache.poi.openxml4j.opc.OPCPackage; import ...
- win10安装mysql-最简单教程
工具下载地址 链接: https://pan.baidu.com/s/1XL2wUDrcd9NpT8NOcXoDTQ 提取码: vu34 下载好之后解压. 在目录D:\Program Files\my ...
- apache虚拟目录配置实例
apache虚拟目录配置实例 一.首先,开启虚拟主机配置 在文件httpd.conf中找到: include conf/extra/httpd-vhosts.conf #开启 二.对httpd-vho ...
- 在DBGrid中,按ctrl+Delete不让删除,怎么实现
DBGrid的Options中的dgConfirmDelete改为:False;在DBGrid所连接的DataSet的BeforeDelete事件中写:Abort; ^_^
- docker下载镜像加速
1.如何获取阿里云加速地址 参考文档 https://yq.aliyun.com/articles/29941 关于加速器的地址,你只需要登录容器Hub服务的控制台,左侧的加速器帮助页面就会显示为你独 ...
- java:容器/集合(Map(HashMap,TreeMap)Collection和Collections,(Collection-value();)
*Map接口:采用是键值对的方式存放数据.无序 HashMap: *常见的实现类: *--HashMap:基于哈希表的 Map 接口的实现. *常用的构造方法: * HashMap()构造一个具有默认 ...
- Oracle 归档日志管理
一.Oracle日志介绍 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo log ...
- javascript中,一个js中的函数,第一句var _this = this;为什么要这样做?
javascript中,一个js中的函数,第一句var _this = this;为什么要这样做? 下面是源码: 下面这段代码是常用的网站首页,自动切换span或者tabbar来变更List显示内容的 ...
- C语言Ⅰ作业12—学期总结
一.我学到的内容 二.我的收获 作业链接 收获 C语言Ⅰ博客作业01 认识了PTA编程,博客园,Markdown基本语法1,Markdown基本语法2 C语言Ⅰ博客作业02 PTA系统常见问题解答 C ...