有时您会遇到网关错误,通常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。这通常是以下之一:

  1. PHP-FPM 未运行(可能是由于错误太多)
  2. PHP-FPM 已达到限制max_children,无法处理更多请求
  3. 某种 PHP 错误,例如段错误

网关超时

当您的应用程序处理过多流量时,通常会发生网关超时错误。这可能对应于 PHP-FPMmax_children错误(配置为处理的请求过多),但主要发生在数据库过载并且无法处理进行查询的其他连接时。返回查询需要太多时间。

如果您的应用程序建立的任何网络连接未及时返回响应,也可能会发生这种情况,但数据库是最常见的瓶颈。

调试网关错误

用于tl;dr调试网关错误的是日志。我从网络请求堆栈的顶部开始,然后向下移动。这意味着我检查的日志顺序是:

  1. nginx
  2. PHP-FPM
  3. 服务器资源使用情况
  4. 应用程序日志

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

调试网关错误-502 Bad Gateway 或504 Gateway Timeout