Nginx健康检查模块,生产还能这样配置


Nginx健康检查模块,生产还能这样配置

文章插图
 
Nginx作为生产的公网访问入口,起到负载均衡、分流、限流、安全限制等作用,合理的配置可以在不更改代码、架构的前提下,获得意想不到的收获 。
本文我们将讨论下Nginx的健康检查模块,通过本文的了解可以知道Nginx的故障转移和健康检查的检测机制,以便我们更好的应用到生产环境中 。
Nginx原生模块我们在使用nginx做反向代理都会使用到以下两个模块:
1 .ngx_http_proxy_module定义允许将请求传递到另一台服务器 。此模块下常用指令如下:
proxy_passproxy_cacheproxy_connect_timeoutproxy_read_timeoutproxy_send_timeoutproxy_next_upstream
  1. ngx_http_upstream_module
用于定义可由proxy_pass,fastcgi_pass等指令引用的服务器组 。此模块下常用指令如下:
upstreamserverip_hash默认负载均衡配置http {upstream myApp1 {server srv1.example.com;server srv2.example.com;server srv3.example.com;}server {listen 80;location / {proxy_pass http://myapp1;}}}此时nginx默认的负载均衡策略是轮询外,还有其他默认参数,如下:
http {upstream myapp1 {server srv1.example.com weight=1 max_fails=1 fail_timeout=10;server srv2.example.com weight=1 max_fails=1 fail_timeout=10;server srv3.example.com weight=1 max_fails=1 fail_timeout=10;}server {listen 80;proxy_send_timeout=60;proxy_connect_timeout=60;proxy_read_timeout=60;proxy_next_upstream=error timeout;location / {proxy_pass http://myapp1;}}}其中涉及到两个功能点:
  1. 故障转移
Syntax:proxy_read_timeout time;Default:proxy_read_timeout 60s;Context:http, server, location定义从代理服务器读取响应的超时 。仅在两个连续的读操作之间设置超时,而不是为整个响应的传输 。如果代理服务器在此时间内未传输任何内容,则关闭连接 。Syntax:proxy_connect_timeout time;Default:proxy_connect_timeout 60s;Context:http, server, location定义与代理服务器建立连接的超时 。应该注意,此超时通常不会超过75秒 。Syntax:proxy_send_timeout time;Default:proxy_send_timeout 60s;Context:http, server, location设置将请求传输到代理服务器的超时 。仅在两个连续的写操作之间设置超时,而不是为整个请求的传输 。如果代理服务器在此时间内未收到任何内容,则关闭连接Syntax:proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;Default:proxy_next_upstream error timeout;Context:http, server, location指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:error和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误timeout和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时invalid_header后端服务器返回空响应或者非法响应头http_500后端服务器返回的响应状态码为500http_502后端服务器返回的响应状态码为502http_503后端服务器返回的响应状态码为503http_504后端服务器返回的响应状态码为504http_404后端服务器返回的响应状态码为404off停止将请求发送给下一台后端服务器从以上几个指令可以看出,在默认配置下,后端节点一旦出现error和timeout情况时,nginx会通过proxy_next_upstream进行故障转移,将发往不健康节点的请求,自动转移至健康节点 。其中timeout设置和proxy_send_timeout time、proxy_connect_timeout time、proxy_read_timeout time有关 。除了error、timeout,我们可以设置更详细的触发条件,如http_502、http_503等 。
注意:只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的 。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的 。
  1. 健康检查
Syntax:server address [parameters];Default:—Context:upstreammax_fails=number设定Nginx与服务器通信的尝试失败的次数 。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用 。此时在接下来的fail_timeout时间段,服务器不会再被尝试 。失败的尝试次数默认是1 。设为0就会停止统计尝试次数,即不对后端节点进行健康检查 。认为服务器是一直可用的 。fail_timeout=time设定服务器被认为不可用的时间段以及统计失败尝试次数的时间段 。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用 。默认情况下,该超时时间是10秒 。


推荐阅读