线上偶尔会有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.