本文介绍了nginx反向代理多虚拟主机节点服务器配合keepalived实现高可用和负载均衡,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。采用 nginx+keepalived,它是一个高性能的服务器高可用或者热备解决方案,Keepalived主要来防止服务器 单点故障的发生问题,可以通过其与Nginx的配合实现Web服务器端的高可用。使用keepalived可以保 证nginx的高可用,他能监控nginx的健康状态,当nginx出现宕机时自动主备切换
配置有点像:基于keepalived实现haproxy高可用站点-CSDN博客
环境准备:
4台Linux Rocky8.10虚拟机,两台提供nginx的web服务器:192.168.118.131/129。本项目采用非keepalived的非抢占模式,两台keepalived的互为backup服务器:192.168.118.128/130
配置nginx服务器
下载:
yum install nginx -y
配置:vim /etc/nginx/conf.d/vhost.conf
server {listen 80;server_name bbs.test.com;location /{root /usr/share/nginx/html/bbs;index index.html index.htm;}access_log /usr/share/nginx/html/bbs/logs/access_bbs.log main;
}server {listen 80;server_name www.test.com;location /{root /usr/share/nginx/html/www;index index.html index.htm;}access_log /usr/share/nginx/html/www/logs/access_www.log main;
}
关闭selinux和防火墙:setenforce 0 && systemctl stop firewalld
在两台服务器上面执行以下命令:
mkdir -p /usr/share/nginx/html/{www,bbs}
touch /usr/share/nginx/html/www/index.html
touch /usr/share/nginx/html/bbs/index.html
echo "bbs: This is a test page which from: IP:$(hostname -I)" > /usr/share/nginx/html/bbs/index.html
echo "www: This is a test page which from: IP:$(hostname -I)" > /usr/share/nginx/html/www/index.htmltouch /usr/share/nginx/html/bbs/logs/access_bbs.log
touch /usr/share/nginx/html/www/logs/access_www.log
chown -R nginx:nginx /usr/share/nginx/
拓扑结构:
[root@localhost ~]# tree /usr/share/nginx/html/
/usr/share/nginx/html/
├── 404.html
├── 50x.html
├── bbs
│ ├── index.html
│ └── logs
│ └── access_bbs.log
├── index.html
├── nginx-logo.png
├── poweredby.png
└── www
├── index.html
└── logs
└── access_www.log
启动nginx:systemctl start nginx
测试
echo "192.168.118.129 www.test.com bbs.test.com" >> /etc/hosts
[root@localhost conf.d]# curl www.test.com
www: This is a test page which from 192.168.118.129
[root@localhost conf.d]# curl bbs.test.com
bbs: This is a test page which from 192.168.118.129
配置nginx代理
vim /etc/nginx/conf.d/vtest.conf
upstream server_pools {server 192.168.118.129:80 weight=1; server 192.168.118.131:80 weight=1;
} server { listen 80; server_name www.test.com;location / {proxy_pass http://server_pools; #传递原始的host头部信息proxy_set_header Host $host;}
} server {listen 80; server_name bbs.test.com;location / {proxy_pass http://server_pools;#传递原始的host头部信息proxy_set_header Host $host;}
}
在这段配置中,当请求的server_name匹配到bbs.test.com或者www.test.com时,location /会捕获所有对www.test.com或者bbs.test.com的请求,无论请求的URL是什么。这些请求都会被转发到上游服务器池server_pools中
然后在/etc/hosts中写入域名
#130主机
[root@localhost conf.d]# tail -1 /etc/hosts
192.168.118.130 www.test.com bbs.test.com
#128主机
[root@localhost conf.d]# tail -1 /etc/hosts
192.168.118.128 www.test.com bbs.test.com
测试
[root@localhost ~]# for ((i=1;i<=4;i++));do curl www.test.com;done
www: This is a test page which from 192.168.118.129
www: This is a test page which from 192.168.118.131
www: This is a test page which from 192.168.118.129
www: This is a test page which from 192.168.118.131
[root@localhost ~]# for ((i=1;i<=4;i++));do curl bbs.test.com;done
bbs: This is a test page which from 192.168.118.129
bbs: This is a test page which from 192.168.118.131
bbs: This is a test page which from 192.168.118.129
bbs: This is a test page which from 192.168.118.131
配置keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id LVS_1
}
vrrp_script chk_nginx {script "killall -0 nginx"#检查是否开启了nginx代理
}vrrp_instance VI_1 {state BACKUP#备份模式interface ens160mcast_src_ip 192.168.118.130#基于这个源IP的健康检查nopreempt#非抢占模式virtual_router_id 51priority 100#优先级advert_int 1#间隔时间authentication {#认证auth_type PASSauth_pass 1111}track_script {#调用脚本chk_nginx
}virtual_ipaddress {#VIP192.168.118.110}
}
systemctl start keepalived
效果
单开两个进程去时刻检查日志:tail -f /var/log/messages
当拥有VIP的一方停止nginx服务时,立刻就会移除VIP,另一方获得VIP
当其恢复时,VIP也不会回到自己这台主机上面,减少主从交换频率,提高稳定性。这就是非抢占模式
最后测试是否依旧可以通过这个虚拟IP访问:curl -H表示携带head信息
以上访问被分流,且更具访问的URL到不同页面