1、按照以下模型准备了3台主机,如下图所示
主机名称 | ip地址 | 服务端口 |
nginx服务器 | 10.1.60.80 | 8081 |
应用服务器1 | 10.1.60.112 | 8081 |
应用服务器2 | 10.1.60.113 | 8081 |
![](https://i-blog.csdnimg.cn/blog_migrate/0aa0429ee37808335d35626434b50793.png)
2、轮询模式,即nginx代理转发的请求会轮替的分配到两个应用服务器上,默认方式,挂掉的服务可自动剔除
2.1在nginx配置文件进行如下配置
upstream demo_server {
server 10.1.60.112:8081;
server 10.1.60.113:8081;
}
server {
listen 8081;
server_name 10.1.60.80;
lcation / {
proxy_pass http://demo_server;
}
}
2.2写入以上配置后重启nginx服务
systemctl restart nginx
2.3在client端执行curl http://10.1.60.80:8081即可看到效果
![](https://i-blog.csdnimg.cn/blog_migrate/b2045149ae0aa451925b1f1252564d77.png)
3、uri_hash算法模式,即按访问的URI的哈希结果来分配请求,每个URI定向到一台后端服务器
3.1在nginx配置文件进行如下配置
upstream demo_server {
hash $request_uri;
server 10.1.60.112:8081;
server 10.1.60.113:8081;
}
server {
listen 8081;
server_name 10.1.60.80;
location / {
proxy_pass http://demo_server;
}
}
3.2写入以上配置后重启nginx服务
systemctl restart nginx
3.3hash $request_uri 表示使用 request_uri 变量作为 hash 的 key 值,只要访问的 URL保持不变,就会一直分发给同一台服务器
4、ip_hash模式,即根据client的请求 IP 进行判断,只要 IP 地址不变就永远分配到同一台主机
4.1在nginx配置文件进行如下配置
upstream demo_server {
ip_hash;
server 10.1.60.112:8081;
server 10.1.60.113:8081;
}
server {
listen 8081;
server_name 10.1.60.80;
location / {
proxy_pass http://demo_server;
}
}
4.2写入以上配置后重启nginx服务
systemctl restart nginx
4.3在多个不同的client使用curl http://10.1.60.80:8081命令即可看出效果,对比以下两个不同的client端可以看到访问多次都转发到同一个应用服务器上
![](https://i-blog.csdnimg.cn/blog_migrate/c298dbe6a136a041a3be425e3b493c9e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c69887c2fde04873eee55782d7999ebf.png)
5、最少连接数算法模式,即各个 worker 子进程通过读取共享内存的数据,获取后端服务器的信息,来挑选一台当前已建立连接数最少的服务器进行分配请求
5.1在nginx配置文件进行如下配置
upstream demo_server {
zone test 10M; #记录后端服务器连接情况,判断哪些服务器连接数最少,一般1M可以处理5000-6000个连接
least_conn;
server 10.1.60.112:8081;
server 10.1.60.113:8081;
}
server {
listen 8081;
server_name 10.1.60.80;
location / {
proxy_pass http://demo_server;
}
}
5.2写入以上配置后重启nginx服务
systemctl restart nginx
6.负载均衡健康检查
七层代理和四层转发使用的健康检查配置是不一样的
七层代理
vi /etc/nginx/nginx.conf
http {
upstream backend {
server 10.1.60.114:8080 max_fails=3 fail_timeout=30s;
server 10.1.60.115:8080 max_fails=3 fail_timeout=30s;
server 10.1.60.118:8080 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.apex.com;
location / {
proxy_pass http://backend;
}
}
}
max_fails:该参数定义了在多少次失败尝试后,将认为后端服务器不可用。默认值为 1。
fail_timeout:该参数定义了在 max_fails 次失败后,将暂时将后端服务器标记为不可用的时间。默认值为 10秒
这些参数的作用是确保在后端服务器出现故障或不可用的情况下,Nginx 能够自动将流量转发给其他可用的后端服务器,以提高系统的可用性和稳定性
四层转发
vi /etc/nginx/nginx.conf
stream {
upstream backend {
server 10.1.60.114:8080;
server 10.1.60.115:8080;
check interval=5s rise=2 fall=3 timeout=3s;
# 使用基于 TCP 的健康检查
check_tcp_send "HELO";
check_tcp_expect_alive;
}
server {
listen 8000;
proxy_pass backend;
}
}
使用 check 参数和相关的 check_* 指令来配置健康检查。在这里,我们设置了健康检查的参数,如检查间隔为 5 秒(interval=5s),成功检查次数为 2 次(rise=2),失败检查次数为 3 次(fall=3),超时时间为 3 秒(timeout=3s)
使用基于 TCP 的健康检查:我们使用了 check_tcp_send 指令来发送一个简单的字符串 "HELO" 作为 TCP 连接请求,并使用 check_tcp_expect_alive 指令来判断后端服务器是否存活
通过以上配置,Nginx 将会周期性地发送 TCP 连接请求到后端服务器,并根据连接结果和配置的健康检查参数来判断服务器的可用性。如果某个后端服务器在健康检查中失败次数达到配置的阈值,Nginx 将会将其标记为不可用,暂时不再将新的连接请求发送给该服务器