HTTP 状态码 502 与 504 的区别

线上偶尔会有502或者504的报错. 我们访问网页的时候也经常会有. 那么它们到底有什么区别呢?
今天就查了一些资料, 来学习一下.

先来看释义:

  • 502: Bad Gateway. 表示web server 做为了一个gateway 或者 proxy 的时候, 从上游接受到了无效的 response.
  • 504: Gateway Timeout. 表示web server 做为一个gateway 或者 proxy 的时候, 无法即时的从上游得到一个response, 来完成请求.

看起来好像差不多. 但在实际开发中, 凭经验, 好像502, 504都是因为超时.

LNMP 下来看一下502, 504

下面结合 LNMP 的情形下来来看一下.

Nginx 产生 502 的原因

  • PHP-FPM 没有运行
  • Nginx 无法连接 PHP-FPM

PHP-FPM 没有启动

如果因为这些原因, Nginx 无法连上 PHP-FPM, 那么将会导致 502. access.log 中:

1
127.0.0.1 - - [22/May/2021:17:36:19 +0800] "GET / HTTP/1.1" 502 158 "-" "curl/7.76.1" "-"

这时候 error.log 中为:
1
connect() to unix:/run/php/php7.2-fpm.sock failed (2: No such file or directory) while connecting to upstream

这可能是因为没有启动 PHP-FPM, 启动就好了.

PHP-FPM 处理超时

如果你的应用反应时间太长, 将会产生一个超时的错误. 如果 PHP-FPM 的超时设置比 Nginx 的超时设置小. Nginx 将会返回 502.
这是因为 PHP-FPM 关闭了连接.

error.log 将会显示:

1
recv() failed (104: Connection reset by peer) while reading response header from upstream

这个时候, 如果有 php-fpm 日志, 将会显示:

1
ARNING: [pool mypool] child 2120, script '/var/www/html/index.php' (request: "GET /index.php") execution timed out (25.755070 sec), terminating

PHP-FPM 没有超时, Nginx 超时

如果这个时候你调高了 php-fpm 的超时时间, 这将引发另一个问题, nginx 可能会没有接收到 PHP-FPM 的响应而超时, 这个时候 Nginx 会返回 504.

参考

  1. (502)[https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/502]
  2. (504)[https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/504]