当前位置: 首页 > 知识库问答 >
问题:

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

小牛23057
2024-05-13

背景:我有两台机器,分别是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大神解答一下!

共有2个答案

黄景胜
2024-05-13

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 次数。

公羊曜灿
2024-05-13
  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 则是在请求处理级别上工作。它们各自按照定义的时间间隔和条件独立工作,以确保服务的可用性和性能。

 类似资料:
  • 我需要改变频率来检查springboot执行器中的DB运行状况。默认DB运行状况检查查询每毫秒执行一次。我想让这个查询每1分钟后执行一次,而不是毫秒。有什么方法可以自定义它吗?

  • 在设置ELB健康检查的对话框中,它会声明: 如果实例未通过健康检查,它将自动从负载均衡器中删除。自定义健康检查以满足您的特定需要。 当健康检查失败时,将从ELB后面删除实例。我的问题是围绕“健康门槛”设置。当你悬停在帮助上时,它会说: 在声明EC2实例健康之前连续运行状况检查成功的次数。 如果实例声明为健康的,它是否被拉回负载平衡组?

  • SOFABoot 为 Spring Boot 的健康检查能力增加了 Readiness Check 的能力。如果你需要使用 SOFA 中间件,那么建议使用 SOFABoot 的健康检查能力的扩展,来更优雅的上线应用实例 引入健康检查扩展 要引入 SOFABoot 的健康检查能力的扩展,只需要引入以下的 Starter 即可: <dependency> <groupId>com.alipay

  • 因此,我将Spring引导执行器添加到我的应用程序中,并在应用程序中指定。属性管理。endpoint。健康隐藏物生存时间=120秒,以缓存健康检查结果。因此,当我调用执行器/健康时,结果被缓存,效果很好。 当我调用执行器/健康/就绪或自定义创建的组时,问题开始出现。该请求结果不会被缓存。我查阅了Spring文档,只找到了主要健康终点的信息,没有找到特定人群的信息。 所以我的问题是:我错过了什么吗?

  • 21. 健康检查 上节课我们和大家一起学习了Pod中容器的生命周期的两个钩子函数,PostStart与PreStop,其中PostStart是在容器创建后立即执行的,而PreStop这个钩子函数则是在容器终止之前执行的。除了上面这两个钩子函数以外,还有一项配置会影响到容器的生命周期的,那就是健康检查的探针。 在Kubernetes集群当中,我们可以通过配置liveness probe(存活探针)和

  • 健康检查配置概述。 filter.http.HealthCheck filter.http.HealthCheck proto { "pass_through_mode": "{...}", "endpoint": "...", "cache_time": "{...}" } pass_through_mode (BoolValue, REQUIRED) 指定过滤器是否在传递模式下运