Nginx 502错误触发条件与解决办法汇总===

合集下载

Nginxphp-fpm出现502解决办法和调优心得

Nginxphp-fpm出现502解决办法和调优心得

Nginxphp-fpm出现502解决办法和调优⼼得这⼏天web经常出现Nginx 502的问题,先开始也像很多⼈⼀样认为是Nginx的问题,从⽹上查了查原来是php-fpm在作怪。

web使⽤的是nginx+php的架构,⽹站上线还没多久,所以优化⽅⾯基本只是做了些初始的配置。

查看php-fpm.log发现有警告,这些警告和⽹站的挂了个时间基本吻合。

我就从这⾥开始⼊⼿。

先开始也是找了些⽂档,但是第⼆天还是出现问题。

后来查看配置⽂件并翻译了下(百度),英⽂底⼦不好。

pm模块类似apache的模块,是分静态和动态的。

⽹上说的很多调整都是基于动态居多,但是并没说么定义这个模块。

所以⼤家⽤动态和静态还是要仔细看看配置⽂件pm = static; The number of child processes to be created when pm is set to 'static' and the; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.; This value sets the limit on the number of simultaneous requests that will be; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP; CGI. The below defaults are based on a server without much resources. Don't; forget to tweak pm.* to fit your needs.; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'; Note: This value is mandatory.pm.max_children = 300; The number of child processes created on startup.; Note: Used only when pm is set to 'dynamic'; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2;pm.start_servers = 50; The desired minimum number of idle server processes.; Note: Used only when pm is set to 'dynamic'; Note: Mandatory when pm is set to 'dynamic';pm.min_spare_servers = 20; The desired maximum number of idle server processes.; Note: Used only when pm is set to 'dynamic'; Note: Mandatory when pm is set to 'dynamic';pm.max_spare_servers = 500; The number of seconds after which an idle process will be killed.; Note: Used only when pm is set to 'ondemand'; Default Value: 10spm.process_idle_timeout = 10s;; The number of requests each child process should execute before respawning.; This can be useful to work around memory leaks in 3rd party libraries. For; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. ; Default Value: 0pm.max_requests = 10240假如使⽤静态 pm.max_children这个参数会起作⽤,其余不会。

nginx502错误原因解决方法

nginx502错误原因解决方法

nginx502错误原因解决方法nginx502错误是指在使用nginx作为反向代理服务器时,后端服务器返回了一个502错误。

这种错误通常出现在nginx无法从后端服务器获取有效响应时。

那么,究竟是什么原因导致了nginx502错误呢?接下来,我们将详细介绍nginx502错误的常见原因,并提供解决方法。

1. 后端服务器故障。

后端服务器故障是导致nginx502错误的常见原因之一。

当后端服务器因为各种原因无法正常响应请求时,nginx就会收到502错误。

这种情况下,我们需要检查后端服务器的运行状态,确保服务器正常运行,并且能够正常响应请求。

解决方法,检查后端服务器的日志,查找可能的故障原因,并及时修复。

如果是服务器负载过高导致的故障,可以考虑增加服务器资源,或者优化后端服务程序。

2. 过载。

当nginx服务器本身负载过高时,也会导致502错误。

这种情况通常发生在nginx服务器处理大量并发请求时,或者配置不当导致资源占用过高。

解决方法,优化nginx服务器配置,增加服务器资源,或者考虑使用负载均衡来分担服务器负载。

3. 后端服务超时。

后端服务响应时间过长,超过了nginx设置的超时时间,也会导致502错误。

这种情况通常发生在后端服务处理复杂请求时,或者网络延迟较大时。

解决方法,增加后端服务的处理能力,优化服务程序,或者调整nginx的超时设置。

4. 网络问题。

网络问题也是导致nginx502错误的一个常见原因。

当nginx无法与后端服务器建立连接,或者连接断开时,就会返回502错误。

解决方法,检查网络连接,确保网络畅通。

如果是网络问题导致的502错误,需要及时排查并解决网络故障。

5. 配置错误。

配置错误也可能导致nginx502错误。

当nginx配置不当时,可能会导致无法正确转发请求到后端服务器,从而返回502错误。

解决方法,检查nginx配置文件,确保配置正确。

可以使用nginx的配置检查工具来检查配置文件的语法错误,及时修复配置问题。

nginx服务器异常502badgateway原因排查

nginx服务器异常502badgateway原因排查

nginx服务器异常502badgateway原因排查服务器进⾏公众号粉丝数据同步以及批量推送报错502根据错误信息可以判定是后端的问题,502错误的原因有很多种,但总的来说就是服务器处理不过来了1.⾸先查看服务器⽇志1)先查nginx⽇志,不熟悉的可以从nginx.conf中获取error_log的路径,找到错误如下:发现nginx进程处理的连接数不够⽤,单个进程处理的连接数超过了nginx.conf配置的worker_connections值通常worker_connections的值可以参考单个进程打开的最⼤连接数,命令为:ulimit -nulimit -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=100php-fpm主要调整⼏个参数pm = dynamic 如何控制⼦进程,选项有static和dynamicpm.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的进程多了就会处理的很快,排队的请求就会很少。

Nginx502错误原因和解决方法总结

Nginx502错误原因和解决方法总结

Nginx502错误原因和解决方法总结第一篇:Nginx 502错误原因和解决方法总结Nginx 502错误原因和解决方法总结【来源:小鸟云计算】Ps.小鸟云,国内专业的云计算服务商一.前沿不管你是做运维还是做开发,哪怕你是游客,时不时会遇到502 Bad Gateway或504 Gateway Time-out。

出现这页面,把服务重启下,再实在不行重启下服务器,问题就解决了,但是,这问题还是会困扰着你。

夜黑风高正酣睡时,一个电话响起,让你重启服务或IISRESET,肯定是极大不爽,本文总结502与504故障分析与解决方法。

二.状态码解释502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。

三.502 Bad Gateway原因分析将请求提交给网关如php-fpm执行,但是由于某些原因没有执行完毕导致php-fpm进程终止执行。

说到此,这个问题就很明了了,与网关服务如php-fpm的配置有关了。

php-fpm.conf配置文件中有两个参数就需要你考虑到,分别是max_children和request_terminate_timeout。

max_children最大子进程数,在高并发请求下,达到php-fpm 最大响应数,后续的请求就会出现502错误的。

可以通过netstat命令来查看当前连接数。

request_terminate_timeout设置单个请求的超时终止时间。

还应该注意到php.ini中的max_execution_time参数。

当请求终止时,也会出现502错误的。

当积累了大量的php请求,你重启php-fpm释放资源,但一两分钟不到,502又再次呈现,这是什么原因导致的呢?这时还应该考虑到数据库,查看下数据库进程是否有大量的locked进程,数据库死锁导致超时,前端终止了继续请求,但是SQL语句还在等待释放锁,这时就要重启数据库服务了或kill掉死锁SQL进程了。

nginx报错502

nginx报错502

nginx报错502http请求流程:⼀般情况下,提交动态请求的时候,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:51200Sep3008: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 epollSep3008:32:23.296426[NOTICE] fpm_init(), line 47: fpm is running, pid 30587在这⼏句的前⾯,是1000多⾏的关闭children和开启children的⽇志原来,php-fpm有⼀个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。

nginx502错误原因解决方法

nginx502错误原因解决方法

nginx502错误原因解决方法当我们在使用nginx作为反向代理服务器时,有时候会遇到502错误。

这种错误通常是由于后端服务器无法正常响应请求导致的。

本文将针对nginx502错误的原因进行分析,并提供相应的解决方法。

1. 后端服务器超时。

后端服务器在处理请求时,如果耗时过长,超出了nginx设置的超时时间,就会导致502错误。

解决方法是调整nginx的超时设置,可以通过修改proxy_connect_timeout和proxy_read_timeout参数来延长超时时间。

2. 后端服务器故障。

后端服务器可能由于各种原因出现故障,无法正常响应请求,这也会导致502错误。

解决方法是检查后端服务器的运行状态,确保服务器正常运行,并且没有出现过载或者其他故障情况。

3. 后端服务器连接数过载。

如果后端服务器的连接数超过了其承载能力,也会导致502错误。

解决方法是调整nginx的连接数限制,可以通过修改proxy_max_temp_file_size和proxy_busy_buffers_size参数来提高连接数限制。

4. 后端服务器响应错误。

有时候后端服务器会因为程序错误或者配置错误导致无法正常响应请求,这也会引起502错误。

解决方法是检查后端服务器的程序和配置,确保其能够正常工作,并且没有出现错误。

5. 网络问题。

502错误有时候也可能是由于网络问题导致的,比如网络延迟、丢包等。

解决方法是检查网络连接,确保网络畅通,并且没有出现异常情况。

综上所述,nginx502错误通常是由于后端服务器无法正常响应请求导致的。

解决这个问题的方法主要包括调整nginx的超时设置、检查后端服务器运行状态、调整连接数限制、检查后端服务器程序和配置、以及检查网络连接。

通过以上方法,我们可以有效地解决nginx502错误,确保网站能够正常运行。

nginx 502 Bad Gateway错误解决办法

nginx 502 Bad Gateway错误解决办法

个 后 端 主 机 取 数 据 遇 到 何 种 错 误
f a s t c g ir e a df im e o ut 3 0 0;
_
_
p h p是 把 请 求 轮 询 给 每 个 c h l i d r e n,
在 大 流 量 下 ,每 个 c h i l d r e到 达
时 会 转 到 下 一 个 后 端 主 机 ,里 头 写 上 的就是 会 出现 5 0 2的 所 有 情 况 , 默认是 e r r o r t i n l e o u t o e r o r就 是 当
是 后 端 主 机 当机 。在 u p s t r e a m 配 置 里 有这 么一 项 配置 : p r o x y _ n e x t _ u p — s r t e a m ,这 个 配 置 指 定 了 n g i n x在 从

原 来 , p h p — f p m 有 一 个 参 数 ma x r e q u e s t s ,该 参 数 指 明 了 ,每 个 c h i l re d n最 多 处 理 多 少 个 请 求 后 便 会被关闭 , 默认的设置是 5 0 0 。 因 为
网 络
计 算 机 与 网 络 创 新 生 活
n g i n x 5 0 2 B a d Ga t e wa y错误解 决办法

些 运 行 在 Ng i n x上 的 网 站 有
代码如下:
n e t s t a t— a n p o I g r e p” p h p — c g i ”1
h t t p{
f a s t c g i c 0 n n e c t _ t i me o u t 3 0 0;
f a s t c g is e n d _f im e o ut 3 0 0:

如何解决 Nginx 502 错误问题

如何解决 Nginx 502 错误问题

如何解决 Nginx 502 错误问题Nginx 是一款高性能的 Web 服务器软件,它可以用来代理前端Web 服务器,也可以进行负载均衡、反向代理等操作。

但是,有时候在使用 Nginx 的过程中,我们会遇到一些问题,其中 502 错误就是比较常见的一个。

下面,我们就来探讨一下如何解决 Nginx 502 错误问题。

一、什么是 Nginx 502 错误首先,我们需要了解一下 Nginx 502 错误的含义。

502 错误是指Nginx 作为反向代理服务器时,在代理请求时出现故障或超时,从而导致上游服务器无法正常响应请求。

这样,Nginx 无法将正确的响应返回给客户端,从而产生了 502 错误。

二、如何排查 Nginx 502 错误在遇到 Nginx 502 错误时,我们需要先进行排查。

具体可以从以下几个方面入手:1.检查上游服务器是否正常工作Nginx 作为反向代理服务器,其主要作用是将客户端请求转发给上游服务器进行处理。

因此,当遇到 502 错误时,我们需要先检查一下上游服务器是否正常工作。

可以通过访问上游服务器的IP 地址或域名,来确定其是否能够正常响应请求。

如果上游服务器无法正常工作,则需要先解决上游服务器的问题,才能消除Nginx 502 错误。

2.检查 Nginx 配置文件是否正确Nginx 的配置文件中包含了一些参数和选项,这些参数和选项决定了 Nginx 服务器的行为。

因此,在遇到 Nginx 502 错误时,我们需要先检查一下 Nginx 配置文件是否正确。

可以通过检查配置文件语法是否正确,以及配置文件中是否包含了正确的服务器、监听端口、反向代理等参数来确定配置文件是否正确。

3.检查 Nginx 日志文件是否有异常信息Nginx 的日志文件可以记录下服务器在运行过程中的一些信息,包括请求响应状态码、请求时间、错误信息等。

因此,在遇到Nginx 502 错误时,我们需要查看 Nginx 的日志文件,以了解错误信息。

Nginx502问题解决及安装

Nginx502问题解决及安装

Nginx502问题解决及安装抱 502 问题解决ps -eaf | grep nginx 查看nginx 的端⼝pidof nginxsystemctl status nginx 查看 nginx 的运⾏状态netstat -anpl | grep nginxnetstat -anpl | grep 443 查看端⼝systemctl restart nginx 重启nginxsystemctl status nginx 查看nginx 状态ps -eaf | grep nginx 查看nginx 四个端⼝下载源码包解压源码包发现错误 error the HTTP rewrite module requires the PCRE library.原因是请求重写模块的 PCRE开发没有安装或者没有正确安装,然后重新安装重新执⾏ configure发现报错 error: the HTTP gzip module requires the zlib library.(httpgzip模块需要zlib库。

)这次是因为压缩模块没有被安装或正确安装,所以我们安装zlip和zlip-devel然后重新安装重新执⾏ configure虽然预编译完成,但是最后的提⽰信息,OpenSSL库没有被使⽤,所以要安装预编译完成后,我们可以看到⽂件夹⽣成makefile ⽂件,我们可以查看makefile ⽂件可以得到nginx 的安装规则然后我们基于第⼀步⽣成的Makefile ⽂件开始编译(执⾏gcc命令)View code 之后我们进⾏安装最后我们运⾏nginx 主程序nginx 看⽇志 error_log正向代理是在⽤户端的,⽐如需要访问某些国外⽹站,我们可能需要购买vpn并且 vpn 是在我们的⽤户浏览器端设置的 (并不是在远端的服务器设置)浏览器先访问vpn地址,vpn地址转发请求,并最后将请求结果原路返回过来。

深入分析HTTP状态码502(nginx+php-fpm)

深入分析HTTP状态码502(nginx+php-fpm)

深⼊分析HTTP状态码502(nginx+php-fpm)我们的⼀个web项⽬,由于新上城市增多,导致访问量增⼤,DB压⼒增⼤,作为提供接⼝的业务⽅,最近被下游反馈⼤量请求“502”。

502,bad gateway,⼀般都是upstream(这⾥就是php)出错,对于php,造成502的原因常见的就是脚本执⾏超过timeout设置时间,或者timeout设置过⼤,导致php进程长时间不能被释放,没有空闲worker进程来接客。

我们的项⽬就是php执⾏时间设置过短导致的,对于这种情况,可以先适当增⼤php的执⾏时间,先保证清除502,优化的事情毕竟要花更多的时间。

控制php执⾏时间的选项有两个,在php.ini中 max_execution_time 和php-fpm中 request_terminate_timeout,其中request_terminate_timeout 可以覆盖 max_execution_time,所以如果不想改全局的php.ini,那只改php-fpm的配置就可以了。

下边我就来详细的分析⼀下为什么php脚本执⾏超出设置时间会导致nginx返回502。

先来布景,让问题复现:nginx和php分别只启动⼀个worker,⽅便追踪。

php-fpm的request_terminate_timeout设置为3S。

测试脚本test.phpsleep(20);echo 'ok';go go go:在浏览器访问/test.php,3S后如期出现...404what出师不利啊,赶紧看看nginx的配置⽂件这个location配置是当发⽣5xx错误时跳转到⼀个好看点的界⾯,但是我在/usr/share/nginx/html下并没有50x.html这个⽂件。

所以搞了个404出来。

这不是很影响我判断问题的准确性?直接注释掉!再次访问,等待3S,终于'正常'的界⾯出来了。

分享nginx 502的解决方法

分享nginx 502的解决方法
在一台windows机器上运行nginx做代理,代理一台lnmp环境的linux服务器上的php网站。出现502错误后,通过排查发现问题不在windows机器上,而是linux服务器的问题。查看windows上nginx的错误日志,发现很多连接被远程主机强制关闭的错误。回忆起之前类似问题的解决方法,于是到linuxБайду номын сангаас务器上修改nginx配置文件中的worker_connections参数值,将其从51200改为4096,并重启nginx服务,问题得到解决。事后想到应该调整linux服务器上error日志的级别为debug,以便获取更多信息。这个案例说明了nginx 502错误可能由被代理服务器引起,并通过调整配置文件参数可以有效解决。

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

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

详解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-fpm restart 然后重启⼀下.Nginx 502错误情况2:CPU占⽤率、内存占⽤率⾮常⾼,遭到CC攻击.解决⽅法请参考:LinuxVPS简单解决CC攻击Nginx 502错误情况3:CPU占⽤率不⾼,内存溢出。

检查⼀下⽹站程序有没有问题?⼀般⼩偷站点常常会出现内存溢出。

检查⼀下/var/log/⽬录下的⽇志,看看是不是有⼈爆破SSH和FTP端⼝?SSH、FTP遭到穷举也会占⽤⼤量内存。

是的话改掉SSH端⼝和FTP端⼝即可将⽹上找到的⼀些和502 Bad Gateway错误有关的问题和排查⽅法列⼀下,先从FastCGI配置⼊⼿:1.查看FastCGI进程是否已经启动NGINX 502错误的含义是sock、端⼝没被监听造成的。

我们先检查fastcgi是否在运⾏2.检查系统Fastcgi进程运⾏情况除了第⼀种情况,fastcgi进程数不够⽤、php执⾏时间长、或者是php-cgi进程死掉也可能造成nginx的502错误运⾏以下命令判断是否接近FastCGI进程,如果fastcgi进程数接近配置⽂件中设置的数值,表明worker进程数设置太少netstat -anpo | grep "php-cgi" | wc -l3.FastCGI执⾏时间过长根据实际情况调⾼以下参数值fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;4.头部太⼤nginx和apache⼀样,有前端缓冲限制,可以调整缓冲参数fastcgi_buffer_size 32k;fastcgi_buffers 8 32k;如果你使⽤的是nginx的负载均衡Proxying,调整proxy_buffer_size 16k;proxy_buffers 4 16k;5.https转发配置错误正确的配置⽅法server_name ; location /myproj/repos{set $fixed_destination $http_destination;if ( $http_destination ~* ^https(.*)$ ){set $fixed_destination http$1;}proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Destination $fixed_destination;proxy_pass http://subversion_hosts;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

详解php+nginx服务发生500502错误排查思路

详解php+nginx服务发生500502错误排查思路

详解php+nginx服务发⽣500502错误排查思路概述当线上的服务中访问中出现500或者502错误时,需要紧急处理,排查问题,该怎么做?可以通过分析⼀些错误⽇志或者跟踪php-fpm 进程来进⾏问题定位。

nginx error_lognginx的error_log在nginx的配置⽂件中定义的server {listen 80;server_name localhost;root /var/www;access_log /Users/jiao/logs/default.access.log;error_log /Users/jiao/logs/default.error.log;location / {index index.html index.htm index.php;autoindex on;}location = /info {allow 127.0.0.1;deny all;rewrite (.*) /.info.php;}location ~ \.php$ {root /var/www;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;include /usr/local/etc/nginx/fastcgi_params;}}查看error_log➜ tail /Users/jiao/logs/default.error.log2019/07/17 11:08:18 [error] 77416#0: *76 kevent() reported about an closed connection (54: Connection reset by peer)while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream:"fastcgi://127.0.0.1:9000", host: "localhost"发现出现了Connection reset by peer,连接被重置了,此时可以再查看php-fpm的error_log进⼀步分析问题php-fpm error_logphp-fpm的error_log在php-fpm.conf⽂件中配置中定义的; Error log file; If it's set to "syslog", log is sent to syslogd instead of being written; in a local file.; Note: the default prefix is /usr/local/var; Default Value: log/php-fpm.logerror_log = log/php-fpm.logerror_log⾥⾯的内容是这样的➜ tail /usr/local/var/log/php-fpm.log[17-Jul-2019 10:49:54] NOTICE: [pool www] child 81948 started[17-Jul-2019 11:08:18] WARNING: [pool www] child 77537, script '/var/www/index.php' (request: "GET /index.php") execution timed out (3.801267 sec), terminating [17-Jul-2019 11:08:18] WARNING: [pool www] child 77537 exited on signal 15 (SIGTERM) after 1503.113967 seconds from start[17-Jul-2019 11:08:18] NOTICE: [pool www] child 94339 started可以看到是请求/var/www/index.php⽂件出现了超时dtrussdtruss是动态跟踪命令,可以根据PID,name跟踪进程mac环境下使⽤dtruss,linux环境可以使⽤strace,pstack➜ dtrussUSAGE: dtruss [-acdefholLs] [-t syscall] { -p PID | -n name | command | -W name }-p PID # examine this PID-n name # examine this process name-t syscall # examine this syscall only-W name # wait for a process matching this name-a # print all details-c # print syscall counts-d # print relative times (us)-e # print elapsed times (us)-f # follow children-l # force printing pid/lwpid-o # print on cpu times-s # print stack backtraces-L # don't print pid/lwpid-b bufsize # dynamic variable buf sizeeg,dtruss df -h # run and examine "df -h"dtruss -p 1871 # examine PID 1871dtruss -n tar # examine all processes called "tar"dtruss -f test.sh # run test.sh and follow children跟踪php-fpm:sudo dtruss -a -n php-fpm此时访问web页⾯,就可以看到跟踪内容21416/0x3479b6: 1559 63 3 getrusage(0x0, 0x7FFEE1EC0760, 0x0) = 0 021416/0x3479b6: 1561 4 0 getrusage(0xFFFFFFFFFFFFFFFF, 0x7FFEE1EC0760, 0x0) = 0 021416/0x3479b6: 1627 77 17 poll(0x7FFEE1EC08C0, 0x1, 0x1388) = 1 0dtrace: error on enabled probe ID 2174 (ID 159: syscall::read:return): invalid kernel access in action #13 at DIF offset 68 dtrace: error on enabled probe ID 2174 (ID 159: syscall::read:return): invalid kernel access in action #13 at DIF offset 68 dtrace: error on enabled probe ID 2174 (ID 159: syscall::read:return): invalid kernel access in action #13 at DIF offset 68 dtrace: error on enabled probe ID 2174 (ID 159: syscall::read:return): invalid kernel access in action #13 at DIF offset 68 dtrace: error on enabled probe ID 2174 (ID 159: syscall::read:return): invalid kernel access in action #13 at DIF offset 68 21416/0x3479b6: 1872 29 24 lstat64("/var/www/index.php\0", 0x7FFEE1ECFF38, 0x0) = 0 021416/0x3479b6: 1884 9 6 lstat64("/var/www\0", 0x7FFEE1ECFDF8, 0x0) = 0 021416/0x3479b6: 1889 6 3 lstat64("/var\0", 0x7FFEE1ECFCB8, 0x0) = 0 021416/0x3479b6: 1899 12 8 readlink("/var\0", 0x7FFEE1ED0090, 0x400) = 11 021416/0x3479b6: 1905 6 4 lstat64("/private/var\0", 0x7FFEE1ECFB78, 0x0) = 0 021416/0x3479b6: 1917 6 3 lstat64("/private\0", 0x7FFEE1ECFA38, 0x0) = 0 021416/0x3479b6: 2178 18 14 stat64("/var/www/.user.ini\0", 0x7FFEE1ED0240, 0x0) = -1 Err#221416/0x3479b6: 2217 5 1 setitimer(0x2, 0x7FFEE1ED07E0, 0x0) = 0 021416/0x3479b6: 2225 4 0 sigaction(0x1B, 0x7FFEE1ED0788, 0x7FFEE1ED07B0) = 0 021416/0x3479b6: 2237 5 1 sigprocmask(0x2, 0x7FFEE1ED0804, 0x0) = 0x0 021416/0x3479b6: 3643 48 40 open_nocancel(".\0", 0x0, 0x1) = 5 021416/0x3479b6: 3648 7 3 fstat64(0x5, 0x7FFEE1ED0110, 0x0) = 0 021416/0x3479b6: 3653 7 2 fcntl_nocancel(0x5, 0x32, 0x10F252158) = 0 021416/0x3479b6: 3661 12 7 close_nocancel(0x5) = 0 021416/0x3479b6: 3670 10 7 stat64("/usr/local/var\0", 0x7FFEE1ED0080, 0x0) = 0 021416/0x3479b6: 3681 11 8 chdir("/var/www\0", 0x0, 0x0) = 0 021416/0x3479b6: 3698 4 0 setitimer(0x2, 0x7FFEE1ED02D0, 0x0) = 0 021416/0x3479b6: 3710 6 3 fcntl(0x3, 0x8, 0x10F3FD858) = 0 021416/0x3479b6: 3733 9 6 stat64("/private/var/www/index.php\0", 0x7FFEE1ECFF10, 0x0) = 0 074904/0x332630: 723125 1073381 19 kevent(0x9, 0x0, 0x0) = 0 074902/0x332629: 770666 1073387 17 kevent(0x8, 0x0, 0x0) = 0 074904/0x332630: 723165 1061954 20 kevent(0x9, 0x0, 0x0) = 0 074902/0x332629: 770709 1061954 20 kevent(0x8, 0x0, 0x0) = 0 074904/0x332630: 723201 1074786 16 kevent(0x9, 0x0, 0x0) = 0 074902/0x332629: 770747 1074783 16 kevent(0x8, 0x0, 0x0) = 0 074904/0x332630: 723229 1069141 13 kevent(0x9, 0x0, 0x0) = 0 074902/0x332629: 770777 1069145 11 kevent(0x8, 0x0, 0x0) = 0 021416/0x3479b6: 3942 3902233 7 __semwait_signal(0x703, 0x0, 0x1) = -1 Err#474902/0x332629: 770814 103 25 kill(21416, 15) = 0 0dtrace: error on enabled probe ID 2172 (ID 161: syscall::write:return): invalid kernel access in action #13 at DIF offset 68 dtrace: error on enabled probe ID 2172 (ID 161: syscall::write:return): invalid kernel access in action #13 at DIF offset 68 74902/0x332629: 771325 7 2 sigreturn(0x7FFEE1ECFC40, 0x1E, 0xC1A4B78E0404663A) = 0 Err#-274902/0x332629: 771336 7 3 kevent(0x8, 0x0, 0x0) = 1 0dtrace: error on enabled probe ID 2174 (ID 159: syscall::read:return): invalid kernel access in action #13 at DIF offset 68 74902/0x332629: 771352 11 7 wait4(0xFFFFFFFFFFFFFFFF, 0x7FFEE1ED0748, 0x3) = 21416 0dtrace: error on enabled probe ID 2172 (ID 161: syscall::write:return): invalid kernel access in action #13 at DIF offset 68 74902/0x332629: 773511 1957 1899 fork() = 28060 028060/0x3754c5: 125: 0: 0 fork() = 0 028060/0x3754c5: 128 9 2 bsdthread_register(0x7FFF6774C418, 0x7FFF6774C408, 0x2000) = -1 Err#22dtrace: error on enabled probe ID 2172 (ID 161: syscall::write:return): invalid kernel access in action #13 at DIF offset 68 74902/0x332629: 773737 4 1 wait4(0xFFFFFFFFFFFFFFFF, 0x7FFEE1ED0748, 0x3) = 0 074902/0x332629: 773742 6 3 read(0x5, "\0", 0x1) = -1 Err#3528060/0x3754c5: 320 4 0 getpid(0x0, 0x0, 0x0) = 28060 028060/0x3754c5: 328 7 2 __mac_syscall(0x7FFF67758A17, 0x4, 0x7FFEE1ED0208) = -1 Err#4528060/0x3754c5: 332 5 2 csops(0x6D9C, 0xB, 0x7FFEE1ED0248) = -1 Err#2228060/0x3754c5: 755 14 11 dup2(0x1, 0x2, 0x0) = 2 028060/0x3754c5: 797 89 22 close(0x4) = 0 028060/0x3754c5: 806 11 6 dup2(0x7, 0x0, 0x0) = 0 028060/0x3754c5: 817 4 0 geteuid(0x0, 0x0, 0x0) = 501 028060/0x3754c5: 820 3 0 close(0x5) = 0 028060/0x3754c5: 821 3 0 close(0x6) = 0 028060/0x3754c5: 824 5 1 sigaction(0xF, 0x7FFEE1ED0688, 0x0) = 0 028060/0x3754c5: 825 3 0 sigaction(0x2, 0x7FFEE1ED0688, 0x0) = 0 028060/0x3754c5: 827 3 0 sigaction(0x1E, 0x7FFEE1ED0688, 0x0) = 0 028060/0x3754c5: 828 3 0 sigaction(0x1F, 0x7FFEE1ED0688, 0x0) = 0 028060/0x3754c5: 829 3 0 sigaction(0x14, 0x7FFEE1ED0688, 0x0) = 0 028060/0x3754c5: 830 3 0 sigaction(0x3, 0x7FFEE1ED0688, 0x0) = 0 028060/0x3754c5: 1043 3 0 close(0x7) = 0 0可以看到系统底层执⾏的函数,如lstat64获取⽂件内容信息,kill(21416, 15)kill掉php-fpm进程,fork()出新的php-fpm进程,有兴趣可以深⼊研究每个指令的作⽤参考以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

nginx502的原理

nginx502的原理

当nginx返回502 Bad Gateway错误时,它通常表示nginx作为代理服务器无法从上游服务器(如应用服务器或负载均衡器)获取有效的响应。

以下是一般情况下nginx返回502错误的原理:
1.代理请求:当nginx作为代理服务器时,接收到客户端的请求后会将请求转发给上游服
务器。

这可以是HTTP、HTTPS或其他协议。

2.上游服务器响应问题:当上游服务器处理请求时,发生了一些问题,导致无法正常响应。

可能的原因包括上游服务器故障、连接超时、资源不足等。

3.错误状态码:当上游服务器未能提供有效的响应时,上游服务器会返回一个错误状态码
(如502 Bad Gateway)。

nginx接收到这个错误状态码后,会将其作为自己的响应传递给客户端。

4.错误页面显示:nginx会根据配置文件中设定的错误页面规则,在客户端的浏览器上显
示相应的错误页面,告知用户发生了502错误。

需要注意的是,502错误并不一定始终指示上游服务器的问题。

它可能还与nginx自身的配置有关,例如超时设置、缓冲区大小等。

因此,进行排查和解决502错误时,需要综合考虑nginx配置以及上游服务器的运行状况,并逐步排除问题。

Nginx常见502错误

Nginx常见502错误

Nginx常见502错误1.配置错误因为nginx找不到php-fpm了,所以报错,⼀般是fastcgi_pass后⾯的路径配置错误了,后⾯可以是socket或者是ip:port2.资源耗尽lnmp架构在处理php时,nginx直接调取后端的php-fpm服务,如果nginx的请求量偏⾼,我们⼜没有给php-fpm配置⾜够的⼦进程,那么php-fpm就会资源耗尽,⼀旦资源耗尽nginx找不到php-fpm就会出现502错误,解决⽅案去调整php-fpm.conf中的pm.max_children数值,使其增加,但是也不能⽆限增加,毕竟资源有限,⼀般4G内存机器如果跑php-fpm和nginx,不跑mysql可以设置为150,8G为300以此类推3.其他原因除了上⾯的两种错误还有其他的原因,很少有,我们可以借助nginx的错误⽇志来进⾏排查vim /usr/local/nginx/logs/nginx_error.log 我们也可以给⽇志定义级别vim/usr/local/nginx/conf/nginx.conf 找到error_log,默认是crit最严谨的就⾏,也可以改成debug显⽰的信息最全⾯,但是很容易撑爆我们的磁盘。

⾸先我们需要让浏览器进⾏访问修改nginx的配置⽂件[root@wqslinux ~]# vim/usr/local/nginx/conf/vhosts/111.confserver{listen 80;server_name ; //域名地址index index.html index.htm index.php;root /data/www/;location ~ .phpfastcgi_script_name;}}检查语法是否正常[root@wqslinux ~]#/usr/local/nginx/sbin/nginx -t重新加载配置⽂件[root@wqslinux ~]# /usr/local/nginx/sbin/nginx-s reload[root@wqslinux ~]# /etc/init.d/nginx reload检查nginx是那个⽤户跑的[root@wqslinux ~]# ps aux |grep nginx编辑php-fpm⽂件我们要在这个php-fpm⽂件⾥⾯设置nginx的⽤户主,跟组这样才不会显⽰502[root@wqslinux ~]# vim/usr/local/php/etc/php-fpm.conf[global]pid = /usr/local/php/var/run/php-fpm.piderror_log =/usr/local/php/var/log/php-fpm.log[www]listen = /tmp/user = php-fpmgroup = php-fpmlisten.owner = nobody //定义属主listen.group = nobody //定义属组pm = dynamicpm.max_children = 50pm.start_servers = 20pm.min_spare_servers = 5pm.max_spare_servers = 35pm.max_requests = 500rlimit_files = 1024配置完之后重启php-fpm[root@wqslinux ~]# /etc/init.d/php-fpm restartps:再补充⼀个,是近期很多同学遇到的问题这种情况下,使⽤的是socket,版本⾼于5.4(含5.4)默认监听的socket⽂件权限是所有者只读,属组和其他⽤户没有任何权限。

nginx502BadGateway错误解决办法

nginx502BadGateway错误解决办法

nginx502BadGateway错误解决办法nginx出现502有很多原因,但⼤部分原因可以归结为资源数量不够⽤,也就是说后端PHP-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题导致不能正确解析php代码,最终返回给了客户端502错误。

nginx+php出现502 bad gateway,⼀般这都不是nginx的问题,⽽是由于 fastcgi或者php的问题导致的,常见的有以下⼏种(其实解决问题的最好的⽅式还是⾃⼰去看nginx和fastcgi的errorlog):1. php.ini的memory_limit 过⼩(如果有个别php程序进程需要占⽤极⼤内存时这个必须注意)2. php-fpm.conf中max_children或者max_requests 设置不合理(设置过⼩会因为没有⾜够的cgi进程处理请求,设置过⼤会出现⼀会⼉有响应正常,⼀会⼉等很久才有响应的情况,⼀般情况下children按照内存计算,⽐如说1G设置64,2G128。

这个根据实际情况⾃⾏调整。

另外查看当前的PHP FastCGI进程数是否够⽤的命令为:netstat -anpo |grep “php-cgi” | wc -l 如果实际使⽤的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够⽤,需要增⼤。

)3. 查看nginx错误⽇志,发现 pstream sent too big header while reading response headerfrom upstream ,则检查client headbuffer,fastcgi buffer size是否过⼩,可设置为32K。

4. php程序执⾏时间过长⽽超时,检查nginx和fastcgi中各种timeout设置。

(nginx 中的 fastcgi_connect_timeout 300;fastcgi_send_timeout 300 :fastcgi_read_timeout300; keepalive_timeout ; php-fpm中的request_terminate_timeout,php.ini中的max_execution_time)5. php-fpm有⼀个参数 max_requests ,该参数指明了每个children最多处理多少个请求后便会被关闭。

nginx +apache 502 bad gateway 排查

nginx +apache 502 bad gateway 排查

nginx +apache 502 bad gateway 排查502 bad gateway一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。

以下是小编搜集整理的一些Nginx 502错误的排查方法,供参考:Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。

这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件502错误最通常的出现情况就是后端主机当机。

在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。

error 就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。

我一般是全写上的:proxy_next_upstream error timeout invalid_header http_500 http_503;不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆stacktrace的错误信息,现在被502取代了。

但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理了……503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin 死机,仅仅是503,所以还是有必要保留的。

Nginx502badgateway的解决方案

Nginx502badgateway的解决方案

Nginx502badgateway的解决⽅案⼀、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 upstream查阅了⼀下资料,⼤意是nginx缓冲区有⼀个bug造成的,我们⽹站的页⾯消耗占⽤缓冲区可能过⼤。

⽹上查找了⼀下解决⽅法,在国外⽹站看到了⼀个增加缓冲区的⽅法,彻底解决了Nginx 502 Bad Gateway的问题。

⽅法如下:1 2 3 4 5 6http {...fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; ...}请根据服务器已经⽹站的情况⾃⾏增⼤上述两个配置项。

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16server {listen 80;server_name *.lxy.me;location / {###############添加这3⾏proxy_buffer_size 64k;proxy_buffers 32 32k;proxy_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 值适当增加。

502状态码排查思路 -回复

502状态码排查思路 -回复

502状态码排查思路-回复502状态码是指网关错误,它表示服务器作为网关或代理时,从上游服务器接收到无效的响应。

在这篇文章中,我将详细介绍502状态码的排查思路,以及解决该问题的步骤。

首先,我们需要了解502状态码的背景和原因。

当客户端发送请求给服务器时,服务器会充当网关或代理,将请求转发给上游服务器。

上游服务器返回的响应将通过服务器返回给客户端。

当服务器无法从上游服务器获得有效的响应时,就会返回502状态码。

接下来,我们将讨论502状态码的常见原因和排查思路。

第一步是检查上游服务器是否正常运行。

502状态码通常表示上游服务器无法提供有效的响应。

您可以尝试从浏览器直接访问上游服务器,看看是否能够成功获取响应。

如果无法访问或收到错误响应,您需要与该服务器的管理员或运维团队联系,以解决服务器问题。

第二步是检查代理服务器设置。

如果您使用代理服务器作为网关,您需要确保代理服务器的设置正确。

检查代理服务器的配置文件或管理界面,查看是否有任何错误或配置问题。

您也可以尝试使用不同的代理服务器或禁用代理服务器,以查看是否可以解决502状态码问题。

第三步是检查网络连接。

502状态码有时也可以由网络连接问题引起。

请确保服务器和上游服务器之间的网络连接是稳定和可靠的。

您可以尝试通过ping上游服务器或使用网络分析工具,如traceroute或Wireshark,来诊断网络连接问题。

第四步是检查服务器负载和资源使用情况。

如果服务器负载过高或资源不足,它可能无法及时处理来自上游服务器的响应。

检查服务器的CPU、内存和磁盘使用情况,确保它们在正常范围内。

如果需要,您可以添加更多的资源或优化服务器配置,以提高性能和稳定性。

第五步是检查DNS设置。

502状态码有时也会由于DNS设置问题引起。

确保服务器的DNS配置正确,并且可以解析上游服务器的域名。

您可以尝试使用命令行工具,如nslookup或dig,来测试DNS解析是否正常。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Nginx 502错误触发条件与解决办法汇总
一些运行在Nginx上的网站有时候会出现502 Bad Gateway错误,有些时候甚至频繁的出现。

有些站长是在刚刚转移到Nginx之后就出现了这个问题,所以经常会怀疑这是不是Nginx的问题,但事实上这是个误区。

以...
一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。

有些站长是在刚刚转移到Nginx之后就出现了这个问题,所以经常会怀疑这是不是Nginx的问题,但事实上这是个误区。

以下是从张宴和Ayou的博客搜集整理的一些Nginx 502错误的排查方法,供大家参考:
Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。

这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件
502错误最通常的出现情况就是后端主机当机。

在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。

error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。

我一般是全写上的:
proxy_next_upstream error timeout invalid_header http_500 http_503;
不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆stacktrace的错误信息,现在被502取代了。

但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理了……
503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin死机,仅仅是503,所以还是有必要保留的。

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

1、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep "php-cgi" | wc -l
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
......
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
......
php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP 的内存不足了。

如果这样修改了还解决不了问题,可以参考下面这些方案:
一、max-children和max-requests
一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右
最近经常会出现这样的情况: php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。

这种情况只持续数秒钟就恢复了
检查php-fpm的日志文件发现了一些线索
Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200
Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″
Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll
Sep 30 08: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
调大以下两个参数(根据服务器实际情况,过大也不行)
<value name=”max_children”>5120</value>
<value name=”max_requests”>600</value>
然后重启php-fpm。

二、增加缓冲区容量大小
将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。

查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。

参考老外写的修改办法增加了缓冲区容量大小设置,502问题彻底解决。

后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

三、request_terminate_timeout
如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:
request_terminate_timeout
这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s
0s为关闭,就是无限执行下去。

(当时装的时候没仔细看就改了一个数字)
发现,问题解决了,执行很长时间也不会出错了。

优化fastcgi中,还可以改改这个值5s 看看效果。

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

如果您还有其他的解决方法,欢迎与编辑沟通!当然,如果你的网站并发量的确很大,那么最终也许需要寻求系统级的解决办法……。

相关文档
最新文档