nginx报错502

http请求流程:一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客户端浏览器。

Nginx 502 Bad Gateway错误是FastCGI有问题

解决办法

遇到502问题,可以优先考虑按照以下两个步骤去解决。

1、查看当前的PHP FastCGI进程数是否够用(max_children值)
netstat -anpo | grep "php-cgi"| wc -l
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。
2、部分PHP程序的执行时间超过了Nginx的等待时间(php内存不足)
增加nginx.conf配置文件中FastCGI的timeout时间,例如:
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;

php.ini中的memory_limit=64M,重启nginx。
如果这样修改了还解决不了问题,可以参考下面这些方案:
3、max-children和max-requests
一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右
最近经常会出现这样的情况: php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了
检查php-fpm的日志文件发现了一些线索:

    Sep3008:32:23.289973[NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200,cur:51200
    Sep3008:32:23.290212[NOTICE] fpm_sockets_init_main(), line 371:using inherited socket fd=10,“127.0.0.1:9000″
    Sep3008:32:23.290342[NOTICE] fpm_event_init_main(), line 109: libevent:using epoll
    Sep3008:32:23.296426[NOTICE] fpm_init(), line 47: fpm is running, pid 30587

在这几句的前面,是1000多行的关闭children和开启children的日志
原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭。
在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf

调大以下两个参数(根据服务器实际情况,过大也不行)

    <valuename=”max_children”>5120</value>
    <valuename=”max_requests”>600</value>

然后重启php-fpm。
5、增加缓冲区容量大小
将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。
6、request_terminate_timeout
如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。
0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)

优化fastcgi中,还可以改改这个值5s 看看效果。
php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

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

php-fpm.conf有两个至关重要的参数,一个是max_children,另一个是request_terminate_timeout,但是这个值不是通用的,而是需要自己计算的。在安装好使用过程中出现502问题,一般是因为默认php-cgi进程是5个,可能因为php-cgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。

计算的方式如下:

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将 request_terminate_timeout设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就 是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI假死那么就建议你给 request_terminate_timeout赋一个值,这个值可以根据服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分 钟都可以。而max_children这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。 设置max_children也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右

按照官方的答案,排查了相关的可能,并结合了网友的答案,得出了下面的解决办法。

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

netstat -anpo | grep “php-cgi” | wc -l

5(假如显示5)

2、查看当前进程

top观察fastcgi进程数,假如使用的进程数等于或高于5个,说明需要增加(根据你机器实际状况而定)

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

<value name=”max_children”>10</value><value name=”request_terminate_timeout”>60s</value>max_children最多10个进程,按照每个进程20MB内存,最多200MB。request_terminate_timeout执行的时间为60秒,也就是1分钟。

原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/9193355.html

时间: 2024-10-31 18:33:13

nginx报错502的相关文章

压测引起的 nginx报错 502 no live upstreams while connecting to upstream解决

对系统的某个接口进行极限压测,随着并发量上升,nginx开始出现502 no live upstreams while connecting to upstream的报错,维持最大并发量一段时间,发现调用接口一直返回502,即nginx已经发现不了存活的后端了. 通过跟踪端口,发现nginx 跟后端创建了大量的连接.这很明显是没有使用http1.1长连接导致的.因此在upstream中添加keepalive配置. upstream yyy.xxx.web{ server 36.10.xx.107

LNMP安装后子域名访问工程报错502 Bad Gateway

LNMP安装好nginx.mysql.php后,放好代码,搭建完数据库,使用 IP/工程名 可以正常访问,但是给这个工程配置了子域名,用子域名访问就直接报错 502 Bad Gateway 解决这个问题,进入到PHP安装目录,比如/usr/local/php/conf,编辑文件php-fpm.conf,将 [www] listen = /tmp/php-cgi.sock 修改为: [www] listen = 127.0.0.1:9000 其中,这个修改的端口9000,可以从nginx的配置中获

解决nginx 报错提示:rewrite or internal redirection cycle while internally redirecting to &quot;/&quot;,

配置好nginx+php-fpm,访问首页,提示报错: 2015/01/14 23:04:39 [error] 10964#2788: *2 rewrite or internal redirection cycle while internally redirecting to "/", client: 127.0.0.1, server: bk, request: "GET / HTTP/1.1", host: "bk" 报错原因:index

nginx报错 client intended to send too large body: 1331696 bytes

1,nginx后台error日志报错 2016/02/05 16:23:56 [error] 12024#0: *441106971 connect() failed (111: Connection refused) while connecting to upstream, client: 113.214.1.10, server: localhost, request: "GET /h5teb/ugcH5/index.htm?source=android&mall=8&TG

nginx 报错 nginx: [emerg] could not build the variables_hash,

在nginx重启的时候报错了: nginx: [emerg] could not build the variables_hash, you should increase either variables_hash_max_size: 512 or variables_hash_bucket_size: 64 此时按照网上的修改 以下这些内容,根本没用! types_hash_max_size 2048;    server_names_hash_bucket_size 128; 还是别改这些

【CentOS6.5】安装nginx报错:No package nginx available. Error: Nothing to do

今天在给centos6.5安装nginx时候,提示报错No package nginx available. Error: Nothing to do, 后来百度一下,说缺少EPEL(epel是社区强烈打造的免费开源发行软件包版本库,系统包含大概有1万多个软件包) 版本寻找地址:http://fedoraproject.org/wiki/EPEL我需要的是centos6.5 64位(适用于6.x),我直接找到源后wget下载到当前目录: wget http://dl.fedoraproject.

nginx报错 连接超时问题

问题:上传excel文件解析数据并加载数据到MySql数据库表中的时候,报错(该Excel文件有13105列)最终返回给浏览器 POST http://.......404 not found nginx 解决: 原因: 后台程序处理的时间过长,但是访问后端接口走的是nginx代理 nginx使用proxy模块时,默认的读取超时时间是 60s 后来设置如下参数解决 proxy_connect_timeout 后端服务器连接的超时时间_发起握手等候响应超时时间 proxy_read_timeout

nginx 报错504 gateway time-out

使用nginx访问本地项目的时候一直报错:gateway time-out 504,在项目的gateway的控制区域可以看见数据根本没有跑进来,此时查看进程管理器可以发现有很多个nginx.exe进程,此时使用taskkill /fi "imagename eq nginx.EXE" /f这个dos命令(cmd),可以杀死所有的nginx.exe进程,之后再运行nginx.exe,重新运行就可以了. 原文地址:https://www.cnblogs.com/aiwen/p/904480

nginx报错client_body_temp permission denied

故障描述 一次新sdk发布上线后,nginx正向代理出现很多500的请求,查看error.log发现有client_body_temp permission denied报错. client_body_temp 如果客户端POST一个比较大的文件,长度超过了nginx缓冲区的大小,需要把这个文件的部分或者全部内容暂存到client_body_temp目录下的临时文件. 故障原因: 新版本sdk发布后,发起的post请求body增大,超出了nginx缓存区大小,所以需要暂存在client_body