使用php + nginx环境调试时遇到网关错误的解决流程步骤
技术  /  管理员 发布于 1年前   596
当你调试时有时会遇到网关错误,通常是 502 Bad Gateway 或 504 Gateway Timeout。
当 Nginx 向 PHP 发送请求,但 PHP 返回错误信息说无法处理请求时,Nginx 就会返回这些错误。
通常情况下,这些错误不是应用程序中发生的错误,而是(通常)在应用程序处理请求之前发生的错误。
什么是网关
网关是位于网络服务器(通常是 Nginx)和应用程序之间的东西。
对于大多数人来说,这就是 PHP-FPM。
Nginx 会使用 fastcgi 协议将网络请求转换为 PHP-FPM 可以理解的内容。
然后,PHP-FPM 运行应用程序,用它需要的信息设置 PHP(设置超全局 $_GET、$_POST、$_SESSION、$_SERVER 等)。
如果 PHP-FPM 返回错误,Nginx 会给出网关错误。
网关错误
当 PHP-FPM 返回错误时,会返回 Bad Gateway。
通常是以下情况之一
PHP-FPM 未运行(可能是由于错误太多)
PHP-FPM 已达到其 max_children 限制,无法处理更多请求
某种 PHP 错误,如 segfault
网关超时
网关超时错误通常发生在应用程序处理过多流量时。这可能与 PHP-FPM 的 max_children 错误(配置处理的请求过多)相对应,但主要发生在数据库超载,无法处理更多查询连接时。返回查询需要花费太多时间。
如果应用程序的任何网络连接没有及时返回响应,也会出现这种情况,但数据库是最常见的瓶颈。
调试网关错误
调试网关错误的关键是日志。我从网络请求堆栈的顶层开始向下检查。这意味着我检查日志的顺序是
Nginx
PHP-FPM
服务器资源使用情况
应用程序日志
Nginx 日志中的数据通常最无用,尽管它可能会提示 PHP-FPM 未运行的问题(如果它找不到 PHP-FPM 的套接字文件,例如 /var/run/php-fpm.sock)。
FPM 日志通常是最有用的,因为 PHP-FPM 是返回错误的网关!
通常你会看到一个关于达到(或接近)max_children 限制的错误。
比较少见的是设置错误(setfault)(如果出现这种情况,可能是代码中出现了递归)。
接下来我会检查服务器资源使用情况。
你可以使用 htop 或类似软件来检查 CPU/RAM 的使用情况,以及哪些进程在使用它们。
你还应该通过 df -h 检查磁盘使用情况,看看磁盘空间是否用完。
Inodes 也可能用完!Inodes 是 "索引节点",用来跟踪 Linux 系统中文件的使用情况。
因为所有东西都是文件(包括 Linux 如何处理打开的网络连接!),所以 Inodes 用完可能是个问题。
你可以运行 df -i 查看每个磁盘驱动器的索引节点使用情况。
最后,我会检查应用程序日志。
这些日志可能会显示与超时或数据库错误有关的错误,但有时问题并不是应用程序代码库特有的。
这些日志对网关错误的有用程度各不相同。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号