使用Nginx + Keepalived 实现高可用 Web 负载均衡笔记(虚拟机)
作者:CodingPioneer
环境介绍
物理操作系统:Windows10
虚拟机软件:VMWare Workstation 16 Pro
虚拟操作系统统:CentOS7 Nginx:1.24.0Keepalived:2.2.8
资源规划
在VMWare Worksattion中安装了2台CentOS7的虚拟机,桥接方式下IP地址分别为:192.168.0.35、192.168.0.36
VIP | IP | 主机名 | Nginx端口 | 默认主从 |
---|---|---|---|---|
192.168.0.100 | 192.168.0.35 | wongoing01 | 88 | MASTER |
192.168.0.100 | 192.168.0.36 | wongoing02 | 88 | BACKUP |
一、Nginx安装
在2台虚拟机中安装Nginx,过程如下:
1.1、安装编译 Nginx 所需的依赖包
# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel ca-certificates
安装过程中有提示的时直接输入y继续就可以了。
1.2、下载Nginx
# cd /usr/local/src/# wget http://nginx.org/download/nginx-1.24.0.tar.gz
1.3、编译安装 Nginx
# cd /usr/local/src/# tar -zxvf nginx-1.24.0.tar.gz# cd nginx-1.24.0# ./configure --prefix=/usr/local/nginx# make && make install
1.4 配置 Nginx
# vi /usr/local/nginx/conf/nginx.conf
1、把第一行的#user nobody;前面的的#去掉,把nobody改为root2、把侦听的端口号由默认80改为88修改后内容如下:
user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 88; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
1.5 修改 Nginx 欢迎首页内容(用于后面测试, 用于区分两个节点的 Nginx)
# vi /usr/local/nginx/html/index.html
修改的内容为在标题内容中增加当前节点的IP地址192.168.0.35这台服务器的nginx欢迎页内容如下:
<h1>Welcome to nginx! 192.168.0.35</h1>
192.168.0.36这台服务器的nginx欢迎页内容如下:
&lt;h1&gt;Welcome to nginx! 192.168.0.36&lt;/h1&gt;
1.6 系统防火墙打开对应的端口 88
命令如下:
# firewall-cmd --zone&#61;public --add-port&#61;88/tcp --permanent#permanent永久生效,没有此参数防火墙重启便失效
相关命令1、查看防火墙状态
systemctl status firewalld //或者 firewall-cmd --state
2、启动防火墙
# systemctl start firewalld.service
3、重启防火墙
firewall-cmd --reload 或者 service firewalld restart
4、防火墙开放3306端口
firewall-cmd --zone&#61;public --add-port&#61;3306/tcp --permanent //--permanent永久生效,没有此参数防火墙重启便失效
5、防火墙关闭3306端口
firewall-cmd --zone&#61;public --remove-port&#61;3306/tcp --permanent
6、禁用防火墙
systemctl stop firewalld
7、设置开机启动防火墙
systemctl enable firewalld
8、停止并禁用开机启动防火墙
systemctl disable firewalld
9、查看端口列表
firewall-cmd --permanent --list-port
1.7 测试 Nginx 是否安装成功
# /usr/local/nginx/sbin/nginx -t
出现以下结果表示成功
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
1.8 启动 Nginx
# /usr/local/nginx/sbin/nginx
重启 Nginx
# /usr/local/nginx/sbin/nginx -s reload
1.9 设置 Nginx 开机启动
1、在系统服务目录下创建nginx.service文件
# vi /lib/systemd/system/nginx.service
内容如下:
[Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
参数解释:Description:描述服务After:描述服务类别[Service]服务运行参数的设置Type=forking是后台运行的形式ExecStart为服务的具体运行命令ExecReload为重启命令ExecStop为停止命令PrivateTmp=True表示给服务分配独立的临时空间注意:[Service]的启动、重启、停止命令全部要求使用绝对路径[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为32、设置开机自启动
systemctl enable nginx.service
3、重新载入systemd,扫描新的或有变动的单元
systemctl daemon-reload
4、查看服务状态
systemctl status nginx.service
如下图:
1.10 分别访问2个节点的Nginx
在浏览器上分别访问2个节点的Nginx如下图:
二、Keepalived安装
2.1 下载Keepalived
Keepalived的官网地址为:https://www.keepalived.org/
可以看到最新的稳定版本如下图:
如下可以在服务器上直接下载最新版本
# cd /usr/local/src/# wget https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
2.2 解压与安装Keepalived
tar -xzvf keepalived-2.2.8.tar.gzcd keepalived-2.2.8/./configure --prefix&#61;/usr/local/keepalived --sysconf&#61;/etcmake &amp;&amp; make install
安装完成后有3部分内容1、/usr/local/keepalived目录内容
2、/etc/keepalived目录内容3、/etc/sysconfig目录下有keepalived
2.3 修改keepalived配置
1、把2个节点服务器上的/etc/keepalived/keepalived.conf.sample复制(或者直接重命名)一份命名为keepalived.conf
cd /etc/keepalivedcp keepalived.conf.sample keepalived.conf
如下图:
2、编辑/etc/keepalived/keepalived.conf(1)MASTER节点(192.168.0.35)的内容如下(可以把原来的内容全部删除):
! Configuration File for keepalived global_defs { ## keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP router_id wongoing01 ## 标识本节点的字条串,通常为 hostname } ## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径 interval 2 ## 检测时间间隔 weight -20 ## 如果条件成立,权重-20 } ## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称 vrrp_instance VI_1 { state MASTER ## 主节点为 MASTER, 对应的备份节点为 BACKUP interface ens33 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同, 虚拟机里面一般是ens33,物理主机通常是eth0 virtual_router_id 51 ## 虚拟路由的 ID 号, 两个节点设置必须一样, 可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址 priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高 nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题 advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s ## 设置验证信息,两个节点必须一致 authentication { auth_type PASS auth_pass 1111 ## 真实生产,按需求对应该过来 } ## 将 track_script 块加入 instance 配置块 track_script { chk_nginx ## 执行 Nginx 监控的服务 } ## 虚拟 IP 池, 两个节点设置必须一样 virtual_ipaddress { 192.168.0.100 ## 虚拟 ip,可以定义多个 } }
(2)BACKUP节点(192.168.0.36)的内容如下(可以把原来的内容全部删除):
! Configuration File for keepalived global_defs { router_id wongoing02 } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111!i! } track_script { chk_nginx } virtual_ipaddress { 192.168.0.100 } }
2.4 编写 Nginx 状态检测脚本
编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。
# vi /etc/keepalived/nginx_check.sh
内容如下:
#!/bin/bash A=`ps -C nginx –no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
保存后,给脚本赋执行权限:
# chmod &#43;x /etc/keepalived/nginx_check.sh
##2.5 启动 Keepalived
# systemctl start keepalived.service
查看keepalived服务状态
# systemctl status keepalived.service
如下图:
2.6 设置Keepalived开启自启动
systemctl enable keepalived.service
2.7 Keepalived+Nginx 的高可用测试
同时启动192.168.0.35和192.168.36上的Nginx和Keepalived,我们通过VIP(192.168.0.100)来访问Nginx如下:
我们关闭192.168.0.35上的Keepalived和Nginx
systemctl stop keepalived.servicesystemctl stop nginx.service
此时,再通过VIP(192.168.0.100)来访问Nginx,如下
我们再开启192.168.0.35上的Keepalived和Nginx在192.168.0.100执行如下命令:
systemctl start nginx.servicesystemctl start keepalived.service
或者只执行
systemctl start keepalived.service
因为我们写了脚本 nginx_check.sh,这个脚本会为我们自动自动Nginx。此时,我们再通过VIP(192.168.50.130)来访问Nginx,如下
至此,Keepalived + Nginx 实现高可用 Web 负载均衡搭建完毕!