引言
当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用 Nginx 做反向代理。并且多台服务器可以根据策略分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。Nginx为我们提供了几种种负载均衡策略:轮询、权重、ip_hash、最少连接数
启动2个Netty服务
server 192.168.233.111:8080;
server 192.168.233.112:8081;
轮询(默认策略)
将客户端发起的请求,平均分配给每一台服务器
配置轮询
vi /usr/local/docker/docker-nginx/nginx/conf.d/default.conf
upstream test-server{
server 192.168.233.111:8080;
server 192.168.233.112:8081;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://test-server/;
}
}
备注:
- 使用 upstream 声明模块,location 引用声明的 test-server
注意:
- upstream 不能存在下划线
-
否则会出现各种不可预期的问题。- 在轮询中,如果服务器down掉了,会自动剔除该服务器。
- 缺省配置就是轮询策略。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
配置文件重新加载
如果在运行的过程中需要调整配置,可以使用如下两个命令重新加载配置文件
- 检查配置文件
docker exec -it nginx service nginx check-reload
- 重新加载配置文件
docker exec -it nginx service nginx reload
请求访问结果
第一次访问结果
第二次访问结果
权重
会将客户端的请求,根据服务器的权重值不同,分配不同的数量
配置权重
vi /usr/local/docker/docker-nginx/nginx/conf.d/default.conf
upstream test-server{
server 192.168.233.111:8080 weight=1;
server 192.168.233.112:8081 weight=2;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://test-server/;
}
}
备注:
- 轮询的基础上使用
weight
关键字,weight和访问几率成正比,也就是说访问3次2次会落在8081上- 使用 upstream 声明模块,location 引用声明的 test-server
注意:
- upstream 不能存在下划线
-
否则会出现各种不可预期的问题。- 权重越高分配到需要处理的请求越多。
- 此策略可以与least_conn和ip_hash结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况。
配置文件重新加载
如果在运行的过程中需要调整配置,可以使用如下两个命令重新加载配置文件
- 检查配置文件
docker exec -it nginx service nginx check-reload
- 重新加载配置文件
docker exec -it nginx service nginx reload
请求响应结果
第一次访问结果
第二次访问结果
第三次访问结果
IP Hash
基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上 就是说如果这个客户端的请求的ip地址不变,那么处理请求的服务器将一直是同一个
配置权重
vi /usr/local/docker/docker-nginx/nginx/conf.d/default.conf
upstream test-server{
ip_hash;
server 192.168.233.111:8080;
server 192.168.233.112:8081;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://test-server/;
}
}
备注:
- 在upstream模块中,添加
ip_hash
关键字,同一个IP地址请求,在服务器不出问题的情况下,会一直落到同一个服务器上- 使用 upstream 声明模块,location 引用声明的 test-server
注意:
- upstream 不能存在下划线
-
否则会出现各种不可预期的问题。- 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
- ip_hash不能与backup同时使用。
- 此策略适合有状态服务,比如session。
- 当有服务器需要剔除,必须手动down掉。
配置文件重新加载
如果在运行的过程中需要调整配置,可以使用如下两个命令重新加载配置文件
- 检查配置文件
docker exec -it nginx service nginx check-reload
- 重新加载配置文件
docker exec -it nginx service nginx reload
请求响应结果
第一次访问结果
第二次访问结果
第三次访问结果
附录
常见配置参数说明
upstream | 用于声明函数体 |
---|---|
weight | 根据权重分配请求,默认的权重是1,通过关键字指定权重值weight和访问几率成正比 |
ip_hash | 用于标记ip_hash,根据请求iphash到指定的服务器 |
least_conn | 最小连接数 |
fail_timeout | 定义失败后的重发间隔时间,与max_fails结合使用。 |
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了, |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务挂掉,请求会被发送到此配置节点。 |
down | 标记服务器永久停机了。 |
# 配置说明,根据自己的需要配置。此块仅作为关键字配置方式说明,非实际应用说明
upstream test-server{
ip_hash; # 根据请求IP HASH策略
least_conn; # 最小连接数
server 192.168.233.111:8080 weight=2 ; # 轮询权重配置
server 192.168.233.111:8080 max_fails=5 fail_timeout=10 ; # 最大失败5次 每次间隔10秒
server 192.168.233.111:8080 fail_time=10 ; # 停机时间 10秒
server 192.168.233.111:8080 backup; # 备用节点
server 192.168.233.111:8080 down; # 宕机节点
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://test-server/;
}
}