有时您会遇到网关错误,通常502 Bad Gateway
是 或504 Gateway Timeout
。
这些是 Nginx 在向 PHP 发送请求时返回的错误,但 PHP 返回一些错误,表示它无法处理该请求。通常,这些不是应用程序中发生的错误,而是(通常)在应用程序处理请求之前发生的错误。
什么是网关
网关是位于 Web 服务器(通常是 Nginx)和应用程序之间的东西。对于我们大多数人来说,这就是 PHP-FPM。Nginx 将使用 fastcgi 协议将 Web 请求转换为 PHP-FPM 可以理解的内容。然后 PHP-FPM 运行您的应用程序,使用 PHP 所需的信息设置 PHP(设置 superglobals $_GET
、$_POST
、$_SESSION
、$_SERVER
等)。
如果 PHP-FPM 返回并出错,Nginx 会给我们一个网关错误。
错误的网关
当 PHP-FPM 返回错误时,将返回 Bad Gateway。这通常是以下之一:
- PHP-FPM 未运行(可能是由于错误太多)
- PHP-FPM 已达到限制
max_children
,无法处理更多请求 - 某种 PHP 错误,例如段错误
网关超时
当您的应用程序处理过多流量时,通常会发生网关超时错误。这可能对应于 PHP-FPMmax_children
错误(配置为处理的请求过多),但主要发生在数据库过载并且无法处理进行查询的其他连接时。返回查询需要太多时间。
如果您的应用程序建立的任何网络连接未及时返回响应,也可能会发生这种情况,但数据库是最常见的瓶颈。
调试网关错误
用于tl;dr
调试网关错误的是日志。我从网络请求堆栈的顶部开始,然后向下移动。这意味着我检查的日志顺序是:
- nginx
- PHP-FPM
- 服务器资源使用情况
- 应用程序日志
Nginx 日志通常包含最不有用的数据,尽管它可能会提示您 PHP-FPM 未运行的问题(如果它找不到 PHP-FPM 的套接字文件,例如)/var/run/php-fpm.sock
。
FPM 日志通常是最有用的,因为 PHP-FPM 是返回错误的网关!通常您会看到有关达到(或接近)限制的错误max_children
。您可能很少会看到设置错误(如果您看到这种情况,则可能在代码中的某处存在一些递归)。
服务器资源使用情况是我接下来要检查的。您可以使用htop
或类似命令来检查 CPU/RAM 使用情况,以及哪些进程正在使用它们。您还应该通过检查磁盘使用情况df -h
来检查磁盘是否空间不足。
您也可能用完索引节点!inode 是“索引节点”,用于跟踪 Linux 系统上的文件使用情况。由于一切都是文件(包括 Linux 如何处理开放的网络连接!),索引节点耗尽可能会成为一个问题。您可以运行df -i
来查看每个磁盘驱动器的 inode 使用情况。
最后我检查应用程序日志。这些可能会显示与超时或数据库错误相关的错误,但有时问题并不特定于应用程序代码库。这些日志的有用程度因网关错误而异。
via https://laravel-news.com/debugging-gateway-errors