情况:高并发下,请求a所在的php-fpm进程顺利访问到资源,但是还没有执行完毕,请求b一直没能获得可用的php-fpm进程,此时请求b就会被返回504的错误,
如果此时过多的504和其他问题导致整个fpm、nginx出现问题,那么还没有执行完毕的php-fpm进程所在的请求a就会出现502错误(因为进程被终止了)
Nginx 502 Bad Gateway的含义是请求的PHP-CGI(这里使用的是php-fpm)已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止(执行中php-fpm进程挂掉了的意思)。
一般Nginx 502 Bad Gateway和php-fpm.conf和php-fpm.conf的设置有关,例如:
1.FastCGI进程是否已经启动
2.FastCGI worker进程数是否不够
3.FastCGI执行时间过长
fastcgi_connect_timeout 300; #连接时间
fastcgi_send_timeout 300; #发送时间
fastcgi_read_timeout 300; #读取时间
4.FastCGI Buffer不够
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
5.Proxy Buffer不够(如果你用了Proxying)
6.https转发配置错误
7.php脚本执行时间过长(request_terminate_timeout选项值)
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI(等很久了还是没有可用的php-cgi进程了的意思)。
一般Nginx 504 Gateway Time-out则是与nginx.conf和php-fpm.conf的设置有关
1.FastCGI执行时间过长:(该选项也会导致502错误,选项是在nginx.conf的http、server、location域中设置,单位为秒)
fastcgi_connect_timeout 300; #连接时间
fastcgi_send_timeout 300; #发送时间
fastcgi_read_timeout 300; #读取时间
Nginx 413错误的排查:修改上传文件大小限制
在上传时nginx返回了413错误,查看log文件,显示的错误信息是:”413 Request Entity Too Large”, 于是在网上找了下“nginx 413错误”发现需要做以下设置:
在nginx.conf增加 client_max_body_size的相关设置, 这个值默认是1m,可以增加到8m以增加提高文件大小限制;
如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。
post_max_size = 8M
upload_max_filesize = 2M
Nginx 400错误排查:HTTP头/Cookie过大
今天有人汇报nginx的HTTP400错误,而且这个HTTP400错误并不是每次都会出现的,查了一下发现nginx400错误是由于request header过大,通常是由于cookie中写入了较长的字符串所引起的。
解决方法是不要在cookie里记录过多数据,如果实在需要的话可以考虑调整在nginx.conf中的client_header_buffer_size(默认1k)
若cookie太大,可能还需要调整large_client_header_buffers(默认4k),该参数说明如下:
请求行如果超过buffer,就会报HTTP 414错误(URI Too Long)
nginx接受最长的HTTP头部大小必须比其中一个buffer大,否则就会报400的HTTP错误(Bad Request)。
php-fpm的一些可优化的配置项:
pm = dynamic #对于专用(线上)服务器,pm可以设置为static。#如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #子进程最大数
pm.start_servers #启动时的进程数
pm.min_spare_servers #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
ps:其中max_children的值,原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
ps:一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。正是因为这个机制,在高并发的站点中,经常导致 502 错误(因为同一个进程达到了重启的访问值后,会被强制重启,而正在使用该进程的访问们就会由于该进程的被终止而返回502错误)
request_terminate_timeout = 0 #设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。
ps:如果你的服务器性能足够好,且宽带资源足够充足,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这个错误。
相关推荐
php-fpm。放到/etc/init.d/目录。然后执行:chmod a+x php-fpm 然后就可以/etc/init.d/php-fpm start 或者systemctl start php-fpm
docker-compose php7.3.4-fpm+nginx+mysql配置
基于alpine的php-fpm nginx docker一键环境 可以手动替换所有版本 通过修改dockerfile,支持容器加载代码,或者挂载代码 也可以支持k8s做为基础环境容器,整体已经经过优化
nginx+php-fpm解决502 Bad Gateway.zip
nginx服务与php-fpm优化技巧详解,包括内存参数设置,超时参数设置等。
Windows 下使用 RunHiddenConsole 启动 nginx、php-fpm, https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/
ubuntu12.04安装Nginx+PHP5(PHP-FPM)+MySQL主机详解.pdf
解决nginx+php-fpm无法上传文件问题.docx
nginx-php-fpm-docker
docker-compose-nginx-phpfpm-源码.rar
请在上打开请求请求和问题 总览 这是一个Dockerfile / ... docker pull richarvey/nginx-php-fpm:latest 跑步 要简单地运行容器: sudo docker run -d richarvey/nginx-php-fpm 要在启动时从git动态提取代码: doc
该模板使用php-fpm为nginx创建OpenShift资源带有nginx和php-fpm的Pod的DeploymentConfig 适用于php-fpm的BuiltConfig和ImageStream(能够自定义php-fpm版本并包括自定义PHP模块) 用于nginx配置的ConfigMap 为Nginx-...
Fedora 15 安装 Nginx (PHP-FPM)+MySQL+PHP Web服务.docx
dlaravel, 使用 PHP-FPM的Laravel,MySQL和 Nginx 组成 Docker 如果你想要英文手册,请参考下面的链接。英文laravel英文手册。 laravel為什麼用D-Laravel用docker聽起來,好像比較潮。:p./console help (幫助,con
Nginx + PHP-FPM + APC=绝妙的组合 Nginx + PHP-FPM + APC=绝妙的组合 Nginx + PHP-FPM + APC=绝妙的组合 Nginx + PHP-FPM + APC=绝妙的组合
理解 Nginx 与 PHP-FPM 通信的工作机制
然后它将打印nginx Web服务器已准备就绪,如果要使用php-fpm安装/配置MySQL或PostgreSQL,请从菜单中选择。 否则,只需按Enter键即可退出。 如果选择1 ,则将安装并配置带有扩展名MySQL和PHP-FPM(MySQL根密码为: ...
Windows 下使用 RunHiddenConsole 启动 nginx、php-fpm, https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/
1、最新版 nginx-http-flv-module(windows可执行程序,含nginx 1.19.3,http-flv-module:1.2.7) 2、内含说明文档,请下载查看。 3、请勿放置于中文路径下,否则无法启动