nginx服务器异常502 bad gateway原因排查

服务器进行公众号粉丝数据同步以及批量推送报错502

根据错误信息可以判定是后端的问题,502错误的原因有很多种,但总的来说就是服务器处理不过来了

1.首先查看服务器日志
1)先查nginx日志,不熟悉的可以从nginx.conf中获取error_log的路径,找到错误如下:

发现nginx进程处理的连接数不够用,单个进程处理的连接数超过了nginx.conf配置的worker_connections值

通常worker_connections的值可以参考单个进程打开的最大连接数,命令为:ulimit -n
ulimit -a 查看所有限制参数
当前最大打开文件数:65535,可以设置worker_connections为51200

重启nginx nginx -s reload

查看当前tcp连接状况
netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}'

2)查看php-fpm日志,同样不熟悉日志位置可以从php-fpm.conf中查看,注意php7以上的配置文件是放在php-fpm.d目录下的www.conf

查看php-fpm.log

发现pm.max_children不够用了,说明php-fpm最大进程数太小了,查看php配置文件ww.conf,修改改参数pm.max_children=100

php-fpm主要调整几个参数
pm = dynamic 如何控制子进程,选项有static和dynamic

pm.max_children:静态方式下开启的php-fpm进程数量

pm.max_requests:php-fpm子进程能处理的最大请求数

pm.start_servers:动态方式下的起始php-fpm进程数量
pm.min_spare_servers:动态方式下的最小php-fpm进程数
pm.max_spare_servers:动态方式下的最大php-fpm进程数量

一、pm.max_children,pm.max_spare_servers 多大合适?

这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。
设置”max_children” 也需要根据服务器的性能进行设定。

数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。

对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。

因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,
给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,
因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/30M 得到。

pm.start_servers缺省值计算公式: min_spare_servers + (max_spare_servers - min_spare_servers) / 2。

比如说512M的VPS,加入分配给php-fpm最大250M,建议pm.max_spare_servers设置为250/30 ,约为8。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比如服务器上只是部署php环境的话,比较合适的值在2~5之间。

这里面还有一个问题,php-fpm因为一些第三方库可能会引起内存泄漏,时间长了,占用的内存会比较多,像我们的服务器现在就是50m左右,还好,有pm.max_requests这个参数,这个参数指定了一个php-fpm子进程执行多少次之后重启该进程。这个可能就要根据你的实际情况调整了。

计算方式如下:

一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M~30M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存2Gb。

而如果我 的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累“,处理速度也很慢,等待的时间也较长,占用的CPU也很高。

如果长时间没有得到处理的请求就会出现 504 Gateway Time-out 这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现 502 Bad gateway 这个错误。

max_children较好的设置方式根据req/s
(吞吐率,单位时间里服务器处理的最大请求数,单位req/s)来设置,
若程序是 100 req/s 的处理能力,那么就设置 100比较好,这是动态来调整的。

二、request_terminate_timeout 多大合适?

计算方式如下:

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有循环或BUG的话你可以直接将”request_terminate_timeout”设 置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。

而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根 据你服务器的性能进行设定。

一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

优化后的参数

编辑/usr/local/php/etc/php-fpm.d/www.conf:
服务器配置:2核8G
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 100

request_terminate_timeout=1200

查出服务的进程id
ps aux |grep php-fpm
kill -9 进程id 常用来杀死僵尸进程

总结nginx出现502错误原因

二、代理缓冲区设置过小
如果你使用的是nginx反向代理,如果header过大,超出了默认的1k,就会引发上述的upstream sent too big header (说白了就是nginx把外部请求给后端处理,后端返回的header太大,nginx处理不过来就会导致502。

server {

listen       80;
server_name  *.lxy.me;

location / {

添加这3行
fastcgi_buffer_size 64k;
fastcgi_buffers 32 32k;
fastcgi_busy_buffers_size 128k;
添加这3行
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
…………
}

三、默认php-cgi的进程数设置过少
在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为phpcgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。也有可能是max_requests值不够用。需要说明的是这连个配置项占用内存很大,请根据服务器配置进行设置。否则可能起到反效果。

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

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

http {
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}

六、如果做公众号这一块,注意有可能是微信服务器请求自己服务器过多导致的
如果发现php-fpm进程数已经达到最大的进程数,查看php-fpm配置文件,可以看到错误信息

到此这篇关于nginx服务器异常502 bad gateway原因排查的文章就介绍到这了,更多相关nginx服务器异常502 bad gateway内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP脚本监控Nginx 502错误并自动重启php-fpm

    最近服务器时不时出现Nginx 502 Bad Gateway,如果在电脑旁边还好,要是半夜或者出去了,怎么办? 没关系,写个脚本检测服务状态,发现异常,自动重启. 自动重启脚本: 复制代码 代码如下: <?php $url = 'http://blog.rebill.info'; $cmd = '/usr/local/php/sbin/php-fpm restart';   for($i = 0; $i < 5; $i ++){         $exec = "curl  con

  • 详解linux中 Nginx 常见502错误问题解决办法

    常见的Nginx 502 Bad Gateway解决办法如下: Nginx 502错误情况1: 网站的访问量大,而php-cgi的进程数偏少. 针对这种情况的502错误,只需增加php-cgi的进程数.具体就是修改/usr/local/php/etc/php-fpm.conf 文件,将其中的max_children值适当增加.这个数据要依据你的VPS或独立服务器的配置进行设置.一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多. /usr/local/php/sbin/php-f

  • Nginx 502 Bad Gateway错误原因及解决方案

    Nginx 502 Bad Gateway 的错误已经遇到好几次了,这里做一下记录,备忘哈哈. 会有好多种情况出现502错误,下面我们分情况来说一下. 一.fastcgi缓冲区设置过小 出现错误,首先要查找nginx的日志文件,目录为/var/log/nginx,在日志中发现了如下错误. 2013/01/17 13:33:47 [error] 15421#0: *16 upstream sent too big header while reading response header from

  • 深入分析nginx+php-fpm服务HTTP状态码502

    我们的一个web项目,由于新上城市增多,导致访问量增大,DB压力增大,作为提供接口的业务方,最近被下游反馈大量请求"502". 502,bad gateway,一般都是upstream(这里就是php)出错,对于php,造成502的原因常见的就是脚本执行超过timeout设置时间,或者timeout设置过大,导致php进程长时间不能被释放,没有空闲worker进程来接客. 我们的项目就是php执行时间设置过短导致的,对于这种情况,可以先适当增大php的执行时间,先保证清除502,优化的

  • Nginx 502 Bad Gateway错误常见的4种原因和解决方法

    1.FastCGI worker进程数是否不够 通过命令查看服务器上一共开了多少的 php-cgi 进程 复制代码 代码如下: ps -fe |grep "php" | grep -v "grep" | wc -l 使用如下命令查看已经有多少个php-cgi进程用来处理tcp请求 复制代码 代码如下: netstat -anop | grep "php" | grep -v "grep" | wc -l 接近配置文件中设置的数

  • 将PHP从5.3.28升级到5.3.29时Nginx出现502错误

    今天将PHP从5.3.28升级到5.3.29,发现网站打不开了,提示"502 bad gateway",访问静态资源可以,但访问任何PHP文件都会502. 其实之前也发现这个问题,只是一直没找到解决办法,所以我一直将PHP保持在5.3.28版本. 按照我以前的脾气,我什么软件都得要最新的稳定版,但PHP之类的软件是例外,因为版本高了,会导致很多程序不兼容,相对来说5.3兼容性算是最好的版本之一,当然5.2也可以. 强迫症实在受不了,官方说5.3.29是5.3的最后一个版本,最后一个版本

  • 详解php+nginx 服务发生500 502错误排查思路

    概述 当线上的服务中访问中出现500或者502错误时,需要紧急处理,排查问题,该怎么做?可以通过分析一些错误日志或者跟踪php-fpm进程来进行问题定位. nginx error_log nginx的error_log在nginx的配置文件中定义的 server { listen 80; server_name localhost; root /var/www; access_log /Users/jiao/logs/default.access.log; error_log /Users/ji

  • 详解Nginx 502错误解决办法

    详解Nginx 502错误解决办法 1.配置错误 因为nginx找不到php-fpm了,所以报错,一般是fastcgi_pass后面的路径配置错误了,后面可以是socket或者是ip:port 2.资源耗尽 lnmp架构在处理php时,nginx直接调取后端的php-fpm服务,如果nginx的请求量偏高,我们又没有给php-fpm配置足够的子进程,那么php-fpm就会资源耗尽,一旦资源耗尽nginx找不到php-fpm就会出现502错误, 解决方案 去调整php-fpm.conf中的pm.m

  • nginx服务器异常502 bad gateway原因排查

    服务器进行公众号粉丝数据同步以及批量推送报错502 根据错误信息可以判定是后端的问题,502错误的原因有很多种,但总的来说就是服务器处理不过来了 1.首先查看服务器日志 1)先查nginx日志,不熟悉的可以从nginx.conf中获取error_log的路径,找到错误如下: 发现nginx进程处理的连接数不够用,单个进程处理的连接数超过了nginx.conf配置的worker_connections值 通常worker_connections的值可以参考单个进程打开的最大连接数,命令为:ulim

  • 前端异常502 bad gateway的原因和解决办法

     502 Bad Gateway服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答. 解决办法是:再刷新一下网页或清理一下电脑的缓冲文件在打开你想打开的网页就好了. 一般情况下,这种办法是行得通的,但也不排除你所访问的网页被屏蔽的可能,如果你所访问的网页被屏蔽的话,就不管你怎么刷新也是没用的了. 502 bad gateway报错形成 1.什么是502 bad gateway 报错 简单来说502是报错类型代码bad gateway错误的网关 2.产生502错误的

  • 前端异常502 bad gateway的原因和解决办法

    目录 502 bad gateway报错形成 1.什么是502 bad gateway 报错 2.产生502错误的原因 第一个原因:DNS 缓冲 第二个原因:浏览器代理 第三个原因:dns 被劫持 3.502错误的HTTP周期 4.固定502错误 5.出现502 bad gateway如何解决问题 Nginx 502 Bad Gateway 错误的原因及解决方法 一.fastcgi缓冲区设置过小     二.代理缓冲区设置过小 三.默认php-cgi的进程数设置过少 四.php执行超时 五.ng

  • PHP 502bad gateway原因及解决方案

    nginx+php 出现502 bad gateway,一般这都不是nginx的问题,而是由于 fastcgi或者php的问题导致的,常见的有以下几种. 1. php.ini 的memory_limit 过小(如果有个别php程序进程需要占用极大内存时这个必须注意) 2. php-fpm.conf 中max_children或者max_requests 设置不合理(设置过小会因为没有足够的cgi进程处理请求,设置过大会出现一会儿有响应正常,一会儿等很久才有响应的情况,一般情况下children

  • Nginx 502 bad gateway错误解决的九种方案及原因

    目录 前言 502系列错误代码 5XX系列错误代码 Nginx 502 Bad Gateway 错误的原因及解决方法 1.检查PHP基础设置 2.FastCGI进程是否已经启动 3.FastCGI worker进程数是否不够 4.FastCGI执行时间过长 5.FastCGI Buffer不够 6.FastCGI 缓冲区设置过小 7.代理缓冲区设置过小(使用了nginx反向代理的情况) 8.默认php-cgi的进程数设置过少 9.其它原因 总结 前言 502 Bad Gateway 是一种HTT

  • nginx 502 Bad Gateway 错误解决办法

    一些运行在Nginx上的网站有时候会出现"502 Bad Gateway"错误,有些时候甚至频繁的出现.以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考: Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的.这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在

  • 深入探讨:Nginx 502 Bad Gateway错误的解决方法

    max_children=40 , 每个children平均占用20M-30M内存,children越多,可以同时接受的并发数量越多,一般children的值是网站最高并发数+浮动值,这值再×内存占用,就是你需要用到的内存.max_requests = N 是指当每个children接受了N次请求以后,就会把自己杀死,然后重新建立一个children.PV / max_children = 每一个children接受的request次数[ 默认预设浏览一个只调用一次PHP程序,或许异步调用呢?接

  • Nginx 502 bad gateway和Nginx 504 Gateway Time-out错误解决方法 错误解决办法

    最近服务器宕机的现象比较频繁,临下班时分,G给挂掉了,502 Bad Gateway Nginx,不由得让我想起之前的504 Gateway Time-out,两者应该有点联系,一定得弄清楚.Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-o

  • 排查服务器异常流量教程详解

    目录 引言 磁盘使用率报警 原因分析 解决方案 1. 日志迁移或清理 2. 日志清理 网站流量异常,一直在报警 通过分析日志排查异常流量 首先切换到日志目录,比如我的目录是 查看访问最频繁的前10个IP 分析结果: 解决异常流量 公网ip访问量最大: 封禁恶意ip 停掉不用的服务 统计访问最多的url 前10名 封禁了不再使用url 优化结果 总结 引言 这篇文章将介绍当WEB服务器报警,提示磁盘使用率问题和带宽满载时的一些排查思路和解决方案. 首先,我们一定要配置服务器的云监控,如果是云厂商的

随机推荐