搜索
首页运维Nginxnginx+php-fpm服务HTTP状态码502怎么解决

nginx+php-fpm服务HTTP状态码502怎么解决

May 21, 2023 am 08:07 AM
phpnginxfpm

我们的一个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.php

sleep(20);
echo 'ok';

go go go:

在浏览器访问www.v.com/test.php,3s后如期出现...404???what???

nginx+php-fpm服务HTTP状态码502怎么解决

出师不利啊,赶紧看看nginx的配置文件

nginx+php-fpm服务HTTP状态码502怎么解决

这个location配置是当发生5xx错误时跳转到一个好看点的界面,但是我在/usr/share/nginx/html下并没有50x.html这个文件。所以搞了个404出来。这不是很影响我判断问题的准确性?直接注释掉!再次访问,等待3s,终于'正常'的界面出来了。

nginx+php-fpm服务HTTP状态码502怎么解决

环境好了,下边就上套路,按照web问题的排查套路走一遍,先看看错误日志吧:

nginx:

nginx+php-fpm服务HTTP状态码502怎么解决

报错都是 recv() failed (104: connection reset by peer。

recv时失败了,连接被重置了。为啥连接被重置了?难道一言不合。

我们在看看php-fpm的错误日志:

(注意php-fpm中php_admin_value[error_log]选项指定php的错误日志,会覆盖php.ini中的。但是这里不是看php的错误,而是看php-fpm的错误。php-fpm的错误日志由php-fpm.conf中的error_log选项指定。)

nginx+php-fpm服务HTTP状态码502怎么解决

每一次请求都是产生2个warning和1个notice:

warning:脚本执行超时了,终止了。

warning:子进程收到sigterm信号退出了。

notice:启了一个新的子进程(因为我设置的pm.min_spare_servers = 1)

看来如果php的worker进程执行超时,不仅终止脚本执行,而且worker进程也会退出。看来nginx的报错连接被重置是因为php的worker进程退出了(在tcp连接中一方如果断掉的话会发送rst给另一方)

通过日志已经可以知道php脚本执行超时,worker子进程退出,导致nginx报错connection reset by peer,下边我们通过strace来看看php和nginx的情况:

php:

nginx+php-fpm服务HTTP状态码502怎么解决

1.accept一个nginx的连接请求(socket,bind,listen都在master中完成 ),可以看到nginx的端口是47039,从fd0中读取数据,就是从标准输入中,这个是fast-cgi协议规定的。accept之后的已连接描述符是3。

2.从fd3中读取nginx传递过来的数据,fastcgi协议格式,接收了856字节。为什么read5次呢?

因为fastcgi协议数据包是8字节对齐,由包头和包体组成。并且都是会先发一个request数据包,包含一些请求id,版本,typpe等信息(包头包体各占8字节),再发一个params数据包,传递get参数和环境变量(包头8字节,包体变长),最后发送一个没有包体只有包头的params数据包,表示参数发送结束(包头8字节)。所以前3个read用来读出request包的包头和包体,还有params包的包头,第四个read是读取真正的数据,最后一个read是读取最后一个params包的包头。所以nginx传递的数据应该是8+8+8+856+8=896字节(和下边nginx的传输bytes能对应上)。注意如果是post方式,还会发送stdin数据包。

3.设置休眠20s,就是php程序中的sleep(20),之后由于进程被终止了,所以后边就没啦。strace程序也退出啦。

nginx:

nginx+php-fpm服务HTTP状态码502怎么解决

1.accept到浏览器的请求,可以看到浏览器端的端口是56434,ip是192.168.1.105,已建立连接的fd是3。

2.从fd3中接收数据,http协议。

3.创建一个socket,fd21,用于和php建立连接。

4.连接到fd21,可以看到连接的是本机的9000端口,这里nginx和php-fpm使用ip socket连接方式,nginx和php-fpm部署在一台机器上可以考虑unix domain socket。

5.向fd21写入数据,fast-cgi协议格式,我们看到写入的长度是896,和上边的php接收的长度是对应的。

6.recvfrom函数从fd21中返回 econnreset (connection reset by peer)

7.向fd9中写入错误信息,可以推断fd9就是nginx错误日志的文件描述符。

8.关闭和fd21的连接。

9.向fd3写入502 bad gateway,就是返回给浏览器的信息。

10.向fd8写入一条访问日志,可以推断fd8就是nginx访问日志的文件描述符。

来验证一下nginx访问日志和错误日志的推断。可以看到的确是fd8,fd9,并处于写入模式。

nginx+php-fpm服务HTTP状态码502怎么解决

那么在这个过程中整个网络包的传输我们不妨也看一下:

通过tcpdump抓包,用神器看比较方便。

因为只想看nginx和php的通讯,在上边又知道nginx的端口是47039,可以通过tcp.srcport==47039过滤出对应的包。

nginx+php-fpm服务HTTP状态码502怎么解决

可以看到nginx和php-fpm数据交互的过程:47039->9000建立三次握手,接着向9000发送数据,9000回复ack,3s后9000回复rst。没毛病。

注意:

syn,fin各占一个序列号

ack,rst不占序列号(28,29两个包的reqnum和acknum都是相同的)

序列号是每一字节加1(29包发送896字节,同时29包seq为4219146879,30包的ack为4219147775,正好相差896)

rst不需要回复。

以上是nginx+php-fpm服务HTTP状态码502怎么解决的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:亿速云。如有侵权,请联系admin@php.cn删除
NGINX的优点:速度,效率和控制NGINX的优点:速度,效率和控制May 12, 2025 am 12:13 AM

NGINX受欢迎的原因是其在速度、效率和控制方面的优势。1)速度:采用异步、非阻塞处理,支持高并发连接,静态文件服务能力强。2)效率:内存使用低,负载均衡功能强大。3)控制:通过灵活的配置文件管理行为,模块化设计便于扩展。

NGINX与Apache:社区,支持和资源NGINX与Apache:社区,支持和资源May 11, 2025 am 12:19 AM

NGINX和Apache在社区、支持和资源方面的差异如下:1.NGINX的社区虽然规模较小,但活跃度和专业性高,官方支持通过NGINXPlus提供高级功能和专业服务。2.Apache拥有庞大且活跃的社区,官方支持主要通过丰富的文档和社区资源提供。

NGINX单元:应用程序服务器简介NGINX单元:应用程序服务器简介May 10, 2025 am 12:17 AM

NGINXUnit是一个开源的应用服务器,支持多种编程语言和框架,如Python、PHP、Java、Go等。1.它支持动态配置,可以在不重启服务器的情况下调整应用配置。2.NGINXUnit支持多语言应用,简化了多语言环境的管理。3.通过配置文件,可以轻松部署和管理应用,如运行Python和PHP应用。4.它还支持高级配置,如路由和负载均衡,帮助管理和扩展应用。

使用NGINX:优化网站性能和可靠性使用NGINX:优化网站性能和可靠性May 09, 2025 am 12:19 AM

NGINX可通过以下方式提升网站性能和可靠性:1.作为Web服务器处理静态内容;2.作为反向代理服务器转发请求;3.作为负载均衡器分配请求;4.作为缓存服务器减轻后端压力。通过配置优化如启用Gzip压缩和调整连接池,NGINX能显着提高网站性能。

NGINX的目的:服务Web内容等NGINX的目的:服务Web内容等May 08, 2025 am 12:07 AM

nginxserveswebcontentandactsasareverseproxy,loadBalancer和more.1)效率高效的servesstaticContentLikeHtmlandImages.2)itfunctionsasareverseproxybalancer,and andginxenhanceperforfforfforfforfforfforffrenfcaching.4)

NGINX单元:简化应用程序部署NGINX单元:简化应用程序部署May 07, 2025 am 12:08 AM

NGINXUnit通过动态配置和多语言支持简化应用部署。1)动态配置无需重启服务器即可修改。2)支持多种编程语言,如Python、PHP、Java。3)采用异步非阻塞I/O模型,提升高并发处理性能。

NGINX的影响:Web服务器及其他NGINX的影响:Web服务器及其他May 06, 2025 am 12:05 AM

NGINX起初解决C10K问题,现已发展为处理负载均衡、反向代理和API网关的全能选手。1)它以事件驱动和非阻塞架构闻名,适合高并发。2)NGINX可作为HTTP和反向代理服务器,支持IMAP/POP3。3)其工作原理基于事件驱动和异步I/O模型,提升了性能。4)基本用法包括配置虚拟主机和负载均衡,高级用法涉及复杂负载均衡和缓存策略。5)常见错误包括配置语法错误和权限问题,调试技巧包括使用nginx-t命令和stub_status模块。6)性能优化建议包括调整worker参数、使用gzip压缩和

NGINX故障排除:诊断和解决常见错误NGINX故障排除:诊断和解决常见错误May 05, 2025 am 12:09 AM

Nginx常见错误的诊断与解决方法包括:1.查看日志文件,2.调整配置文件,3.优化性能。通过分析日志、调整超时设置和优化缓存及负载均衡,可以有效解决404、502、504等错误,提高网站稳定性和性能。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!