在Nginx热配置重新加载(SIGHUP)期间,正在进行的HTTP请求失败

时间:2015-06-01 14:40:08

标签: nginx keep-alive

我们最近从HAProxy迁移到Nginx,因为它支持真正的零停机配置重新加载。但是,在部署期间,我们偶尔会从监控系统中收到502和504错误。考虑到这一点,我能够始终如一地复制502和504错误。我相信这是Nginx处理飞行中请求的错误,但是如果我遗漏了一些明显的东西,我想问社区。

注意Nginx的设置如下: * Ubuntu 14.04 * Nginx版本1.9.1 * HTTP侦听器的配置:

   map $http_upgrade $connection_upgrade {
     default upgrade;
     ''      close;
   }

   server {
    listen 8080;
     # pass on real client's IP
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
     access_log /var/log/nginx/access.ws-8080.log combined;

     location / {
      proxy_pass http://server-ws-8080;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }
  }

  upstream server-ws-8080 {
    least_conn;
    server 172.17.0.51:8080 max_fails=0;
  }
  1. 在正在侦听的HTTP端口上Telnet到Nginx服务器。

  2. 向上游服务器发送HTTP / 1.1请求(172.17.0.51):

    GET / health HTTP / 1.1 主持人:localhost 连接:Keep-Alive

  3. 此请求成功,响应有效

    1. 启动新的HTTP / 1.1请求但未完成请求,即使用telnet发送以下行:

      GET / health HTTP / 1.1

    2. 虽然该请求现在已在飞行中有效,因为它尚未完成并且Nginx正在等待请求完成,请使用SIGHUP信号重新配置Nginx。 SIGHUP信号之前配置的唯一区别是上游服务器已经改变,即我们故意希望所有新请求都转到新的上游服务器。

    3. 终止旧的上游服务器172.17.0.51

    4. 完成上面第3点开始的正在进行的HTTP / 1.1请求:

      主持人:localhost 连接:Keep-Alive

    5. 如果旧的上游服务器拒绝请求,Nginx将始终响应502,如果该IP和端口没有响应,则返回504。

    6. 我认为这种行为是不正确的,因为Nginx一旦收到完整的请求,就应该将请求定向到当前可用的上游服务器。但是,似乎Nginx决定在请求完成之前将请求发送到哪个上游服务器,因此将请求定向到不再存在的服务器。

      关于如何解决这个问题的任何建议都会非常有用!

1 个答案:

答案 0 :(得分:0)

proxy_next_upstream指令可能会完成您正在寻找的内容。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream