更改上游独角兽忙时Nginx返回的状态代码

Mac*_*sel 5 ruby nginx unicorn

我在独角兽面前使用Nginx.当应用程序处于高负载且所有unicorn工作人员都忙时,nginx将返回502响应,表示网关配置错误.我对这种行为没问题,但在这种情况下,我希望nginx返回503响应代码(服务器忙,稍后再试),这是一个更合适的响应.

我看到了这个答案: 是否可以更改在nginx中关闭proxy_pass网关时返回的HTTP状态代码?

其中描述了如何重写从上游代理返回的一些状态代码:

location / {
    proxy_pass http://backend;
    proxy_intercept_errors on;
    error_page 502 503 504 =503 @proxyisdown; # always reply with 503
}

location @proxyisdown {
    add_header Retry-After 500;
    index my_pretty_error_page.html; 
}
Run Code Online (Sandbox Code Playgroud)

但是这有两个问题:

  1. 对于应保留的有效情况,上游应用程序有时会返回502响应代码
  2. 我不相信上游代理实际上正在返回这个错误的状态代码,更有可能nginx不能将该项放在(tcp?)缓冲区上,然后nginx返回误导状态代码.

有没有什么办法可以控制nginx在这种情况下返回的状态码,这样它就是503而不是502?

Mar*_*erg 0

您是否考虑过通过后端服务器解决这个问题?调整后端服务器接受的客户端数量,以便对后端服务器的请求通常成功或失败,并且不会陷入返回 503 的糖蜜状态。理想情况下,您将能够调整后端服务器当可用客户端耗尽时返回 503,而当后端服务器实际宕机时,Nginx 将继续返回 502。