Nginx通过 Upstream
模块实现负载均衡
upstream 支持的负载均衡算法:
- 轮询(默认):可以通过weight指定轮询的权重,权重越大,被调度的次数越多
- ip_hash:可以实现会话保持,将同一客户的IP调度到同一样后端服务器,可以解决session的问题,不能使用weight
- fair:可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块
- url_hash:按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的url_hash模块
###1. 准备工作
准备四台虚拟机
全部配置安装nginx
关闭防火墙以及selinux
- 选择两台nginx服务器作为代理服务器
192.168.181.134
192.168.181.128
vip:192.168.181.188 - 另外两台nginx服务器配置文件可以不一致方便查看
192.168.181.129
192.168.181.130
###2. 修改两台代理服务器的nginx配置文件
[root@master ~]# vim /etc/nginx/conf.d/default.conf
upstream index {
server 192.168.181.129:80 weight=1 max_fails=2 fail_timeout=2;
server 192.168.181.130:80 weight=1 max_fails=2 fail_timeout=2;
}
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://index;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 另一台代理服务器改为相同配置
[root@slave ~]# cd /etc/nginx/conf.d/
[root@slave conf.d]# rm -rf *
[root@master ~]# scp /etc/nginx/conf.d/default.conf 192.168.181.134:/etc/nginx/conf.d/
[root@slave conf.d]# ls
default.conf
###3. Keepalived实现调度器HA
# 安装keppalived
[root@master ~]# yum -y install keepalived
[root@slave ~]# yum -y install keepalived
# 编辑keepalived配置文件
[root@master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为directory2
}
vrrp_instance VI_1 {
state MASTER #定义主还是备
interface ens33 #VIP绑定接口(网卡名称)
virtual_router_id 80 #整个集群的调度器一致
priority 100 #优先级 50一间隔
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.181.188/24 #设置VIP
}
}
[root@slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory2
}
vrrp_instance VI_1 {
state BACKUP #设置为backup
interface ens33
nopreempt #设置到back上面,不抢占资源
virtual_router_id 80
priority 50 #辅助改为50
advert_int 1 #检测间隔1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.181.188/24
}
}
# 启动服务
[root@master ~]# systemctl start keepalived
[root@master ~]# systemctl enable keepalived
[root@slave ~]# systemctl start keepalived
[root@slave ~]# systemctl enable keepalived
# 查看ip
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:01:30:e0 brd ff:ff:ff:ff:ff:ff
inet 192.168.181.128/24 brd 192.168.181.255 scope global dynamic ens33
valid_lft 1038sec preferred_lft 1038sec
inet 192.168.181.188/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::2cd7:d24:f917:70b0/64 scope link
valid_lft forever preferred_lft forever
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:48:1a:fe brd ff:ff:ff:ff:ff:ff
inet 192.168.181.134/24 brd 192.168.181.255 scope global dynamic ens33
valid_lft 1042sec preferred_lft 1042sec
inet6 fe80::9db3:1c86:27b7:1225/64 scope link
valid_lft forever preferred_lft forever
###4. 访问 vip:192.168.181.188 进行测试
此时可以正常访问
将keepalived主节点关机测试vip是否漂移
[root@master ~]# init 0
[root@slave ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:48:1a:fe brd ff:ff:ff:ff:ff:ff
inet 192.168.181.134/24 brd 192.168.181.255 scope global dynamic ens33
valid_lft 1583sec preferred_lft 1583sec
inet 192.168.181.188/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::9db3:1c86:27b7:1225/64 scope link
valid_lft forever preferred_lft forever
###5. 对调度器Nginx健康检查(可选)两台都设置
思路:
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
#(1) script
[root@master ~]# vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stop
systemctl stop keepalived
fi
[root@master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh
#(2). keepalived使用script
[root@master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id director1
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx_status.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.181.188/24
}
track_script {
check_nginx
}
}
注:必须先启动nginx,再启动keepalived
测试访问:
将keepalived集群的主节点的nginx服务关闭,查看vip是否漂移,如果漂移,即成功