目录
实验环境
本次nginx环境是在 VM16 下的两台分别装好Tomcat服务器的 CentOS 7.9 虚拟机下搭建完成的
以下是主服务器的IP
以下是备份服务器的IP
以下是我用Xmind画的nginx工作示意图
而在阅读以下内容之前,需要先在两台虚拟机都安装配置好 nginx 。
反向代理
nginx的第一个特性就是反向代理,能够隐藏集群内部真实的Tomcat服务器IP地址。
为了测试效果,我启动了 192.168.182.133 上的Tomcat服务器,姑且将这台服务器称作服务器B。
注意此时Tomcat使用的端口号为8080 ,一定要先开放8080端口号。
然后我们启动 192.168.182.132 这台虚拟机上的nginx,称作服务器A(我这里是已经自己配置过环境变量了,所以直接就使用nginx这条指令)
以下是nginx.conf的配置内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.182.132;
location / {
root html;
proxy_pass http://192.168.182.133:8080;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
可以发现,我通过访问 192.168.182.132 可以获取到 192.168.182.133:8080 的tomcat页面,所以192.168.182.133:8080 该套接字(socket)被隐藏,用户并不知晓该HTTP请求被nginx转发。用户只需要关注 192.168.182.132 这个IP地址即可,并不需要注意集群内部服务器IP地址变化。
而正向代理则是用户在请求服务器的HTTP报文,例如 www.google.com ,则需要借助一个中间服务器(梯子)来转发请求,但用户此时浏览器输入的域名仍然是目标服务器域名而不是这个中间服务器的域名或者IP。
负载均衡
nginx负载均衡指的是用户在请求一个服务时,由nginx来决定该请求应转发给集群中的哪一个服务器最为合适。
而nginx负载均衡选择策略依赖于很多种算法,这里推荐一个讲的比较详细的博客。
Nginx负载均衡的几种常见策略 - Mr_伍先生 - 博客园 (cnblogs.com)
以下是我的服务器A的nginx.conf配置内容,很明显这里采取的策略是轮询机制
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myserver1 {
server 192.168.182.132:8080;
server 192.168.182.133:8080;
}
server {
listen 80;
server_name 192.168.182.132;
location / {
root html;
proxy_pass http://myserver1;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
动静分离
nginx的动静分离其实就是将用户请求的静态资源(例如HTML、img、mp4等)和动态资源(例如js、php等)分别转发不同的服务器进行处理。也就是至少需要有两台服务器进行操作,一台服务器专门存放静态资源,一台服务器专门存放动态资源,然后通过nginx服务器进行反向代理请求转发。
这里有兴趣的大家可以自己去尝试(其实是我懒_(:з」∠)_)
再推荐一个我觉得写的不错博客
Nginx动静分离实现_云水之路的博客-CSDN博客_nginx动静分离
高可用性
nginx的高可用性是在使用keepalived的基础上体现的,keepalived会为nginx服务器提供一个虚拟IP,客户端只需要输入该虚拟IP地址,即可访问到nginx服务器进而进行负载均衡和反向代理转发请求。我这里就简单的搭建一下主备服务器模式。
keepalived 安装配置
直接通过yum命令进行keepalived的安装
yum -y install keepalived
然后可以修改一下主机IP映射以便待会进行配置
vim /etc/hosts
备份服务器keepalived.conf
进入 /etc/keepalived/keepalived 编辑 keepalived.conf (没有就自己创建一个,实测Ubuntu就没有)
global_defs {
router_id LVS_DEVEL # 主机名
}
vrrp_script chk_nginx {
script "/usr/local/src/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 5 # 要比check_nginx.sh 中的 sleep 值大
weight -20 # 每执行脚本失败一次,优先级权重减20
}
vrrp_instance VI_1 {
state BACKUP # 主节点为 MASTER,备份节点为 BACKUP
interface ens33 # 网卡
virtual_router_id 50 # 虚拟路由id,主从节点必须保持一致
priority 90 # 节点优先级,直范围0-254,MASTER 要比 BACKUP 高
advert_int 1 # 心跳检测间隔
mcast_src_ip 192.168.182.133
authentication { # 设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx # 执行 Nginx 监控,这个不能少,否则脚本不运行
}
virtual_ipaddress {
192.168.182.50 # VIP,两个节点必须设置一样(可设置多个)
}
}
以下是 nginx_check.sh shell脚本代码
#!/bin/bash
#1、判断Nginx是否存活
counter=`ps -C nginx --no-header | wc -l`
echo '11' >> /usr/local/src/a.txt # 我用于调试脚本是否进行,实际可删去
if [ $counter -eq 0 ]; then
#2、如果不存活则尝试启动Nginx
/usr/local/nginx/sbin/nginx
sleep 2
#3、等待2秒后再次获取一次Nginx状态
counter=`ps -C nginx --no-header | wc -l`
#4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移
if [ $counter -eq 0 ]; then
killall keepalived
fi
fi
主服务器keepalived.conf
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/src/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 5
weight -20
}
vrrp_instance VI_1 {
state MASTER ##主节点为 MASTER,备份节点为 BACKUP
interface ens33 ##绑定 VIP 的网络接口,与本机IP地址所在网络接口相同
virtual_router_id 50 ##虚拟路由id,主从节点必须保持一致
priority 100 ##节点优先级,直范围0-254,MASTER 要比 BACKUP 高
advert_int 1
mcast_src_ip 192.168.182.132
authentication { ##设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx ##执行 Nginx 监控
}
virtual_ipaddress {
192.168.182.50 ##VIP,两个节点必须设置一样(可设置多个)
}
}
而主服务器的 nginx_check.sh 脚本代码和备份服务器相同
为了便于测试脚本运行情况,我将shell脚本和a.txt都执行了 chmod 777(实际项目别这么干),
而且我将 nginx 文件夹和该shell脚本都指定了用户和组
为了正常运行脚本,我们还需要关闭 selinux。selinux是Linux的一个进程保护机制,为了防止某些进程恶意浪费内存。在这里vrrp的运行脚本会被selinux当成恶意进程从而被阻止执行。
vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
修改完后需要重启,然后输入 getenforce 确保 selinux 为 Disabled 模式
配置防火墙加入VRRP协议防止脑裂
这步十分关键!!!如果没有向防火墙加入VRRP协议,则会出现脑裂现象:即备份服务器虽然能收到来自master服务器的VRRP包(ping的通),但心跳检测异常,过了3-4秒后自动从BACKUP升级为MASTER,相当于此时主备服务器都占据虚拟IP。
而且由于各自没有对应的备份服务器,无论是否关闭nginx,nginx_check.sh脚本会一直 exited due to signal 15 而无法执行,当时我一直以为是internal的值设置小了造成心跳检测异常。
这问题困扰了我两天,最后发现是防火墙搞的鬼_(:з」∠)_ ,配置一般是没有问题的。而且网络上提出这个问题的人非常少,真的无语。而且大家不要贪图便利随便关闭防火墙,这在实际工作中是一大忌。
所以在开启keepalived服务之前,还需要执行以下指令来启动VRRP协议
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
# 224.0.0.18 是VRRP组播地址
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload # 更新防火墙
其中 ens33 是我的 CentOS7.9 网卡名称,要根据ifconfig的值进行自定义更改,不要直接复制!
如果防火墙在这步配置错误参数,并发现reload失败,就将上面的 --add-rule 改成 --remove-rule 把刚刚错误指令删除,重新输入。
我这里的warning是指我之前已经启动过VRRP协议了,正常执行的话是三步都只有 success 提示
还需要配置IP转发服务
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
至此准备工作都已经完毕~
启动nginx和keepalived服务
首先需要启动nginx再启动keepalived,而且是先启动主服务器的keepalived再启动从服务器的keepalived。这里我以tomcat作为nginx的反向代理。
nginx
systemctl start keepalived
再通过 tail -f /var/log/messages 监控 keepalived 日志
先让我们试试nginx有无问题
主服务器的nginx启动成功
从服务器的nginx也启动成功
万事俱备只欠东风
输入以下指令分别启动主从服务器的 keepalived (注意是先启动主服务器再启动从服务器,避免心跳异常而产生的脑裂现象,这真的会让我脑子裂开)
systemctl start keepalived.service
以下是主服务器的keepalived日志以及IP绑定情况
可以发现此时主服务器以及在不停地转发ARP包,而且在红框内 192.168.182.50 这个虚拟IP已经顺利绑定
以下是备份服务器keepalived启动情况,可以发现脚本也在稳定运行(不停追加 "11")
虚拟IP并没有被备份服务器绑定
这时候我重启备份服务器的keepalived服务,发现日志也只会卡在脚本执行成功这一阶段,而且只有Entering BACKUP STATE 没有出现 Entering MASTER STATE。也再次证明脑裂没有出现。
此时我们打开浏览器输入 192.168.182.50 (虚拟IP)
发现tomcat页面成功在浏览器上打开,证明服务正常。
这时关闭主服务器上的nginx服务,从服务器下出现了以下情况
发现并没有出现VIP漂移,这时候我关闭了主服务器上的keepalived
发现备份服务器已经进入MASTER模式、开始转发ARP包,并且 192.168.192.50 又能继续访问
以上说明 keepalived 的VIP漂移没有问题,但是 vrrp_script 却没有正常启动,而我单独执行 /usr/local/src/nginx_check 发现可以启动 nginx,说明shell脚本也没有问题。这里面的原理等我以后研究深入再来补充。
所以我这里建议使用crontab调度来执行nginx_check脚本而不要使用vrrp_script,同时也要把nginx和keepalived同时设置成自启动。
以上内容只研究了一周,均属于个人理解,如有误,望大佬指出_(:з」∠)_