【问题标题】:In-flight HTTP requests fail during Nginx hot configuration reload (SIGHUP)在 Nginx 热配置重新加载 (SIGHUP) 期间进行中的 HTTP 请求失败
【发布时间】:2015-08-15 02:01:08
【问题描述】:

我们最近从 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. Telnet 到它正在侦听的 HTTP 端口上的 Nginx 服务器。

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

    GET /health HTTP/1.1 主机:本地主机 连接:保持活动状态

本次请求成功,响应有效

  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 请求:

    主机:本地主机 连接:保持活动状态

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

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

任何有关如何解决此问题的建议都会非常有帮助!

【问题讨论】:

    标签: nginx keep-alive


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2018-12-04
      • 2014-02-13
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2018-12-30
      相关资源
      最近更新 更多