upstream配置
updtream backend {
server 192.168.1.1:8080 weight=1;
server 192.168.1.2:8080 weight=2;
}
upstream server 的主要配置如下:
- ip + 端口:配置上游服务器的IP 和 端口
- 权重:weight用来配置权重,默认是1,权重越高,分配给这台服务器的请求数就越多,实际生产中,需要根据服务器的实际处理能力来分配权重。
然后,配置如下配置来处理请求:
location / {
proxy_pass http://backend;
}
当访问nginx时,会将请求反向代理到backend配置的upstream server。
负载均衡算法
round-robin: 轮询算法
默认负载均衡的算法,通过配合weight权重,以轮询的方式将请求转发到上游服务器。
ip_hash
根据客户Ip进行负载均衡,相同的ip将负载均衡到同一个upstream server,如下:
updtream backend {
ip_hash;
server 192.168.1.1:8080 weight=1;
server 192.168.1.2:8080 weight=2;
}
hash key [consistent]
对某一个key进行hash或者使用一致性hash算法进行负载均衡。使用Hash算法存在的问题是:当添加/删除一台服务器时,将导致很多key被重新负载到不同的服务器,从而导致后端可能会出现问题,因此考虑使用一致性哈希算法,这样当添加/删除一台服务器时,只有少量的key会被重新负载到新的服务器。
哈希算法:
可以根据uri进行负载均衡,也可以使用nginx变量,因为,可以实现复杂的算法:
updtream backend {
hash $uri;
server 192.168.1.1:8080 weight=1;
server 192.168.1.2:8080 weight=2;
}
一致性哈希 consistent_key 动态指定:
updtream backend {
hash $consistent_key consistent;
server 192.168.1.1:8080 weight=1;
server 192.168.1.2:8080 weight=2;
}
实际一般使用lua设置一致性hash_key,
set_by_lua_file $consistent_key "lua_balancing.lua"
least_conn
将请求负载均衡到最少活跃的上游服务器。如果配置的服务器较少,则使用基于权重的轮询。
失败重试
updtream backend {
hash $uri;
server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s;
}
通过配置上游服务器的max_fails 和 fail_timeout ,来指定每个上游服务器,当在fail_timeout时间内,失败了max_fails次数,则认为该上游服务器不可用,然后摘掉该上游服务器,等到fail_timeout时间后,再次将该上游服务器加入到列表中进行重试。
location / {
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_next_upstream,当遇到错误的配置时,会尝试下一台上游服务器。
健康检查
nginx对上游服务器的健康检查,默认采用的是惰性策略,也可以集成nginx_upstream_check_module
模块主动进行健康检查。
TCP心跳检查
updtream backend {
hash $uri;
server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s;
check interval=3000 rise=1 fail=3 timeout=2000 type=tcp;
}
此处配置使用tcp进行健康检查,
- interval:检测间隔时间,此处配置每隔3s检测一次
- fail:检测失败多少次后,上游服务器被标记为不存活
rise:检测成功多少次后,上游服务器被标记为存活,并用来处理请求
HTTP心跳检查
updtream backend {
hash $uri;
server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s;
check interval=3000 rise=1 fail=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;
}
check_http_send:检查时发出的http请求内容
- check_http_expect_alive:当上游服务器返回匹配的http状态码时,认为上游服务器存活
- 需要设置合理的间隔时间,不能太短,否则太频繁会导致上游服务器挂掉。
不可用上游服务器
永久摘掉192.168.1.2:8080这台机器,设置为不可用。updtream backend {
hash $uri;
server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s down;
check interval=3000 rise=1 fail=3 timeout=2000 type=http;
}
长链接
```nginx updtream backend { hash $uri; server 192.168.1.1:8080 weight=1 max_fails=2 fail_timeout=10s; server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=10s; check interval=3000 rise=1 fail=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; keepalive 16; }
location / {
支持keepalive
proxy_http_version 1.1; proxy_set_header Connection “”; proxy_pass http://backend; } ``` 通过keepalive指令配置长链接数量。配置每个worker进程与上游服务器之间可缓存的空闲连接的最大数量。当超出这个数量时,最近最少使用的连接将被关闭。