HTTP 响应代码 500、502、503?

use*_*603 6 web-applications nginx httpresponse http-response-codes nginx-reverse-proxy

浏览HTTP 响应代码.. 并了解这些响应代码(rcodes)代表什么

但我不确定在下面的情况下将向客户端/消费者(例如浏览器)发送什么 rcode。我使用 NGINX 作为反向代理,使用 Apache 作为 HTTP 服务器,在 NGINX 后面运行 Web 应用程序(例如应用程序)。

几个场景

  1. 应用程序中发生运行时错误,抛出 rcode 为 500(默认情况下运行时错误代码)。我的理解是nginx会继续抛出500而不将其转换为502?

  2. 应用程序已关闭或不可用。我的理解是 nginx 在这种情况下会抛出 503 而不是 502 ?

  3. 应用程序花费的时间比 nginx 默认连接超时时间还要长。我的理解是nginx在这种情况下会抛出504?

  4. 如果以上所有点都正确,不确定 nginx 何时会抛出 502 ?NGINX何时会认为从上游服务器收到的响应为无效响应?

Dan*_*nin 3

  1. NGINX 不会更改应用程序中的 500 ,只要它没有遇到从 Apache 联系/获取数据的问题。例如,您的应用程序完全有可能生成 500,但 NGINX 与 Apache 的通信出现问题将导致不同的 50x,因此客户端将看到 50x。

  2. 如果 Apache 完全关闭,您应该会收到 502(错误网关),因为在您的设置中,ApacheNGINX 的网关。如果 NGINX 在某种程度上不“喜欢”Apache 的响应,例如当 Apache 发送的响应的标头超出 NGINX 的标头时,也会发生同样的情况proxy_buffer_size

  3. 是的,当 Apache/app 因 NGINX 超时而超时时,您应该收到 504(网关超时)

  4. 请参见第 2 点。以及以下内容:NGINX 将简单地传递来自上游的任何响应代码(如 gateway = Apache),因此它不需要考虑给定响应在响应代码方面是否无效,通过默认。

可以让 NGINX 考虑来自 Apache 的错误响应代码,并通过使用 来采取不同的行为proxy_intercept_errors,它与 结合使用error_page,可以允许您“重写”来自 Apache 的响应代码/错误消息,例如将应用程序故障“伪装”为Service Unavailable

error_page 500 =503 /503.html;
proxy_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)