这篇博文来记录下Nginx负载均衡与反向代理配置研发秘术。
1.1 专业术语
专业术语 | 解释 |
---|
上游服务器配置 | 使用upstream server 配置上游服务器 | 负载均衡算法 | 使用多个上游服务器时的负载均衡机制 | 失败重试机制 | 配置当超时或上游服务器不存活时是否需要重试其他上游服务器 | 服务器心跳检查 | 上游服务器的健康检查/心跳检查 |
1.2 UpStream 配置
upstream backend{
server 192.168.61.1:9080 weight=1;
server 192.168.61.1:9090 weight=2;
}
location /{
proxy_pass http://backend;
}
upstream server的主要配置如下:
- 比如上面配置,为每三次请求中,一个请求转发给9080,其余两个请求转发给9090
- 当访问Nginx时,会将请求反向代理到backend 配置的upstream server.
1.3 负载均衡算法
负载均衡算法 | 解释 |
---|
round-robin | 轮训,默认负载均衡算法,即以轮训的方式将请求转发到上游服务器 | weight | 通过weight配置可以实现基于权重的轮训。 | ip_hash | 根据客户IP进行负载均衡,即相同的IP将负载均衡到同一个upstream server | hash_key | - |
Nginx只使用ip_hash 负载均衡算法配置示例
upstream backend{
ip_hash;
server 192.168.61.1:9080;
server 192.168.61.1:9090;
}
location /{
proxy_pass http://backend;
}
Nginx配置混合使用ip_hash 和weight 负载均衡算法配置示例
upstream backend{
ip_hash;
server 192.168.61.1:9080 weight=1;
server 192.168.61.1:9090 weight=2;
}
location /{
proxy_pass http://backend;
}
1.4 失败重试
Nginx自带有健康检查模块:ngx_http_upstream_module ,可以做到基本的健康检查,配置如下:
upstream backend{
ip_hash;
server 192.168.61.1:9080 max_fails=2 fail_timeout=10s weight=1;
server 192.168.61.1:9090 max_fails=2 fail_timeout=10s weight=1;
}
location /test{
proxy_connect_timeout 5s;
proxy_read_timeout 5s;
proxy_send_timeout 5s;
proxy_next_upstream error timeout;
proxy_next_upstream_timeout 10s;
proxy_next_upstream_tries 2;
proxy_pass http://backend;
add_header upstream_addr $upstream_addr;
}
说明:
-
通过配置上游服务器的max_fails 和fail_timeout 来指定每个上游服务器,当fail_timeout 时间内失败了max_fails 次请求,则认为该上游服务器不可用/不存活,然后摘掉该上游服务器。 -
fail_timeout 时间后会再次将该服务器加入到存活上游服务器列表进行重试。 -
然后进行proxy_next_upstream 相关配置,当遇到配置的错误时,会重试下一台上游服务器。
缺点:
Nginx只有当有访问时后,才发起对后端节点探测。如果本次请求中,节点正好出现故障,Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。 所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发,而且自带模块无法做到预警。
1.5 备份上游服务器
upstream backend{
ip_hash;
server 192.168.61.1:9080 weight=1;
server 192.168.61.1:9090 weight=2 backup;
}
location /{
proxy_pass http://backend;
}
将9090端口上游服务器配置为备上游服务器,当所有主上游服务器都不存活时,请求会转发给备上游服务器。
如通过缩容上游服务器进行压测时,要摘掉一些上游服务器进行压测,但是为了保险起见会配置一些备上游服务器,当压测的上游服务器都挂掉时,流量可以转发到备用服务器,从而不影响用户请求处理。
1.6 不可用上游服务器
upstream backend{
ip_hash;
server 192.168.61.1:9080 weight=1;
server 192.168.61.1:9090 weight=2 down;
}
location /{
proxy_pass http://backend;
}
9090端口上游服务器配置为永久不可用,当测试或者机器出现故障时候,暂时通过该配置临时摘掉机器。
1.7 心跳检测
nginx 商业版本可以通过安装 health_check 模块来进行主动健康检查 nginx 社区版本可通过安装第三方开源 nginx_upstream_check_module 模块来进行主动健康检查 nginx_upstream_check_module 支持TCP 和HTTP心跳检测 Tips:
该模块完全开源,由阿里巴巴淘宝团队借鉴了https://github.com/cep21/healthcheck_nginx_upstreams 而开发的用于nginx upstream 主动心跳检测模块
Github 地址:https://github.com/yaoweibin/nginx_upstream_check_module
官网地址: http://tengine.taobao.org/document/http_upstream_check.html
使用介绍参考:
https://www.cnblogs.com/slqt/p/11088886.html
https://blog.csdn.net/a19881029/article/details/81841959
1.7.1 TCP心跳检测
upstream backend{ ip_hash; server 192.168.61.1:9080 weight=1; server 192.168.61.1:9090 weight=2; check interval=3000 rise=1 fall=3 timeout=2000 type=tcp; } location /{ proxy_pass http://backend; }
配置参数名称 解释 interval 检测间隔时间,此处配置了每隔3s检测一次 fall 检测失败多少次后,上游服务器被标识为不存活 rise 检测成功多少次后,上游服务器被标识为存活,并可以处理请求 timeout 检测请求超时时间配置
1.7.2 HTTP心跳检测
upstream backend{ ip_hash; server 192.168.61.1:9080 weight=1; server 192.168.61.1:9090 weight=2; check interval=3000 rise=1 fall=3 timeout=2000 type=http; check_http_send “HEAD /status HTTP/1.0\r\n\r\n” check_http_expect_alive http_2xx http_3xx; } location /{ proxy_pass http://backend; } Http心跳检测有如下两个需要额外配置。
配置参数名称 | 解释 |
---|
check_http_send | 即检查时发的HTTP请求内容 | check_http_expect_alive | 当上游服务器返回匹配的响应码时,则认为上游服务器存活。 |
注意:
- 检查间隔时间不能太短,否则可能因为心跳检查包太多造成上游服务器挂掉,同时要设置合理的超时时间。
- 淘宝Tengine自带该模块,如果我们没有使用Tengine,可以通过打补丁的方式把该模块加到我们自己的Nginx中。
- 本文使用的是openresty/1.11.2.1 对应nginx-1.11.2 ,安装Nginx之前需要先打nginx_upstream__check_module补丁,到Nginx目录下执行如下Shell:
patch -p0 < /usr/servers/nginx_upstream_check_module-master/check_1.9.2+.patch
如果不安装补丁那么nginx_upstream_check_module 模块是不工作的,建议使用wireshark 抓包查看其是否工作。
本篇完~
|