Nginx通过Upstream模块实现负载均衡
配置安装 nginx, 所有的机器,关闭防火墙和selinux
[root@nginx-proxy ~]# cd /etc/yum.repos.d/
[root@nginx-proxy yum.repos.d]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@nginx-proxy yum.repos.d]# yum install nginx -y
一、实施过程
1、选择两台nginx服务器作为代理服务器。
2、给两台代理服务器安装keepalived制作高可用生成VIP
3、配置nginx的负载均衡
以上两台nginx服务器配置文件一致
根据站点分区进行调度
配置upstream文件
[root@nginx-proxy ~]# cd /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http{
upstream static{
server 192.168.86.149:80;
server 192.168.86.147:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://static;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
二、Keepalived实现调度器HA
注:主/备调度器均能够实现正常调度
1. 主/备调度器安装软件
[root@nginx-proxy-master ~]# yum install -y keepalived
[root@nginx-proxy-slave ~]# yum install -y keepalived
[root@nginx-proxy-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为directory2
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx_status.sh"
interval 5 #每隔 5 秒检查一次
}
vrrp_instance VI_1 {
state MASTER #定义主还是备
interface ens33 #VIP绑定接口
virtual_router_id 80 #整个集群的调度器一致
priority 100 #back改为50
advert_int 1 #检查间隔,默认为1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.86.100/32
}
track_script {
check_nginx
}
}
[root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id directory2
}
vrrp_instance VI_1 {
state BACKUP #设置为backup
interface ens33
virtual_router_id 80
priority 50 #辅助改为50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.86.100/32
}
}
[root@nginx-proxy-master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:44:92:0d brd ff:ff:ff:ff:ff:ff
inet 192.168.86.145/24 brd 192.168.86.255 scope global noprefixroute dynamic ens33
valid_lft 1719sec preferred_lft 1719sec
inet 192.168.86.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::b2b4:4249:705d:4ff7/64 scope link noprefixroute
valid_lft forever preferred_lft forever
到此:
可以解决因为 master keepalived 服务不可用①,或者 master 主机宕机②导致的负载均衡服务不可用的情况,但是 keepalived 不能解决因为负载均衡服务(Nginx/LVS)本身不可用导致的服务中断的问题
①因为目前对外服务的 VIP 是 keepalived 维护的,假如 master keepalived 服务本身不可用,BACKUP 就会把 VIP 配置到自己的机器上。
② master 这个机器整个挂掉,相应的 BACKUP 也会把 VIP 配置到自己的机器上。
- 扩展对调度器Nginx健康检查(可选)两台都设置
思路:
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
[root@nginx-proxy-master ~]# vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
[root@nginx-proxy-master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh
(2). keepalived使用script
! Configuration File for keepalived
global_defs {
router_id director1
}
#定义脚本, check_nginx 是自定义的名称,需要在下方的配置中使用
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx_status.sh"
interval 5 #每隔 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.246.16/24
}
# 使用检测脚本
track_script {
check_nginx
}
}
注:必须先启动nginx,再启动keepalived,如果 keepalived已经启动,则重启 keepalived 服务
测试
- 先在 master 上手动关闭 nginx 服务
- 之后观察 keepalived 服务是否停止, VIP 是否已经释放;
- 最后观察 backup 服务器上是否已经自动绑定了 VIP
- 上面的结果正常后,再来到 master 服务器上依次启动 nginx 和 keepalived 服务
- 服务启动成功后,观察 VIP 是否已经回到 master 服务器。