nginx的健康检查机制的执行进程关系?

背景:我有两台机器,分别是backend1(主机器)backend2(backup),大致如下:

 upstream backend {
        server backend1.example.com:8080;
        server backend2.example.com:8080 backup;
    }

我想实现的是 在服务backend1机器如果链接超时或者5xx那么就直接到backend2这台机器上,等backend1机器如果恢复可以正常访问backend1。以下是我在网上找的资料本地配置的

...
http {
    ...

    upstream nuxt_upstream {
        server backend1.example.com:8080 max_fails=3 fail_timeout=10s;
        server backend2.example.com:8080 backup;
    }

    server {
        listen       80;
        server_name  api;

         location / {
            # 配置响应服务器的错误类型
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; 
            proxy_next_upstream_timeout 5s;  # 重试总共的时间
            proxy_next_upstream_tries 3; # 重试几次,包含第一次

            proxy_pass http://nuxt_upstream;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            
            # 配置相应服务器的超时时间
            proxy_connect_timeout 2s; # 连接后台服务器的超时时间
            proxy_read_timeout 2s; # 从后台服务器读取数据的超时时间
            proxy_send_timeout 2s; # 向后台服务器发送数据的超时时间

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

但是我不是很清楚的有几个点:

  1. 当一个请求进入nginx的时候我通过proxy_next_upstream捕获了当前错误的类型进行上游服务的轮询,设置的proxy_next_upstream_timeout 5s 具体作用在哪?包含 proxy_xx_timeout的时间吗?
  2. 我在网上查询得知proxy_xx_timeout配置是跟 upstream 其中一个sever相关的?那么如果我在设置backend1.example.com:8080 max_fails=3 fail_timeout=10s; 里面的fail_timeout 对外面设置的proxy_xx_timeout 有冲突吗?他们的关系是什么?

总结
就是我在upstream 设置了 fail_timeout=10s 和在外面设置的 proxy_next_upstream_timeout 5s加上proxy_xx_timeout 2s 他们执行的顺序是什么?什么冲突吗?

辛苦相关的linux大神解答一下!

阅读 669
avatarAI BotBETA
  1. proxy_next_upstream_timeout 的具体作用是设置了在尝试将请求切换到下一个上游服务器之前等待当前上游服务器响应的最大时间。它仅与 proxy_next_upstream 指令结合使用,当 proxy_next_upstream 判定当前上游服务器应该被绕过时,proxy_next_upstream_timeout 会限制等待当前上游服务器响应的时间。如果在该时间内没有收到响应,Nginx 将尝试将请求转发到下一个可用的上游服务器(如果有的话)。这个超时时间并不包括 proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout,它们是分别控制连接上游服务器、读取响应数据和发送请求数据的超时时间。
  2. proxy_xx_timeout 配置(如 proxy_connect_timeoutproxy_read_timeoutproxy_send_timeout)是与单个上游服务器交互时设置的超时时间,与 upstream 块中针对单个服务器设置的 max_failsfail_timeout 没有直接冲突。这些超时时间定义了Nginx与上游服务器通信的各个阶段的最大等待时间。

    max_failsfail_timeout 定义了上游服务器连续失败尝试的次数和在这些失败之后将服务器标记为不可用之前的时长。一旦服务器被标记为不可用,它将在 fail_timeout 指定的时间段内不会被用于处理请求。

    proxy_xx_timeoutfail_timeout 关注的点不同:前者关注单次请求与上游服务器的交互时间,后者关注上游服务器的健康状态。

总结

  • fail_timeout 是在 upstream 块中定义的,用于控制上游服务器在失败一定次数后被认为不可用的时间长度。
  • proxy_next_upstream_timeout 是与 proxy_next_upstream 一起使用的,用于控制等待当前上游服务器响应的最大时间,以便决定是否切换到下一个上游服务器。
  • proxy_xx_timeout 是与单个上游服务器的单次交互相关的超时设置。

这些设置之间没有直接的冲突,它们各自关注不同的方面,共同确保Nginx能够高效、稳定地与上游服务器交互。fail_timeout 是在服务器健康检查级别上工作,而 proxy_xx_timeoutproxy_next_upstream_timeout 则是在请求处理级别上工作。它们各自按照定义的时间间隔和条件独立工作,以确保服务的可用性和性能。

1 个回答

1、 server backend1.example.com:8080 max_fails=3 fail_timeout=10s, 表示backend1在失败3次以后就被标记为不可用,标记为不可用后Nginx将在10秒内不再尝试连接它;

2、proxy_next_upstream_timeout 5s, nginx反代到upstream里面的server如果出现失败会继续重试连接下一个server,直到proxy_next_upstream_timeout的超时时间或者到达proxy_next_upstream_tries 次数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题