nginx高可用
为什么要使用nginx的高可用:因为nginx作为反向代理服务器时,有可能出现宕机的情况,而由于其反向代理的特性,就会导致其他服务器(tomcat等)无法被访问,这样项目就停止工作了。但是使用了高可用后,就可以避免这种现象出现。
什么是高可用:nginx的高可用简单来说就是配置了两台(或更多)的nginx服务器,当主服务器宕机时,就会自动切换到备用服务器,从而保证项目的持续运行。
高可用的原理:nginx的实现需要借助其他工具(keepalived)来实现。在keepalived中配置一个虚拟IP(VIP),同时keepalived会定时检查主服务器的工作状态(通过脚本实现)。在主服务器正常工作时,VIP就会映射到主服务器的IP,此时,虚拟ip对应的物理地址和主服务器IP对应的物理地址是相同的,所以访问虚拟IP即访问主服务器。当主服务器失效时,脚本就会监测到,从而根据预先的配置,找到优先级最高的备用服务器,并将虚拟IP映射到该备用服务器的ip,此时,这两个ip对应的物理地址时相同的。再主服务器回复正常时,又会被检测到,又会自动切换到主服务器。这样就实现了nginx的高可用。
一个nginx高可用实现的简单案例(Docker)
一、需求准备清单
两台虚拟机
Nginx-MASTER(主服务器):安装在一台虚拟机的docker中。IP:192.168.1.117
Nginx-BACKUP(备用服务器):安装在另一台虚拟机docker中。IP:192.168.1.150
keepalived:虚拟IP设置:192.168.11.11
二、相关软件安装、配置
**虚拟机:**虚拟机安装这里不做展示,可自行查询资料(要求能连外网,相关:)
Nginx安装:
首先需要安装docker容器,( docker相关 ):
#将yum更新到最新yum update#安装需要的软件包yum install -y yum-utils device-mapper-persistent-data lvm2#设置yum源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#安装dockeryum install -y docker-ce#查看docker版本,检验是否成功docker -v#systemctl start docker(管理员权限)systemctl start docker#开机启动docker服务systemctl enable docker
下载nginx镜像
#搜索镜像docker search nginx#拉取镜像,默认最新docker pull nginx
创建nginx容器
首先:需要准备nginx中的配置文件(docker中有两个nginx.conf、default.conf),因为docker中的文件不能直接修改,需要挂载数据卷,这里直接从nginx容器中复制过来
#创建配置文件存放位置,存放在/root/nginx/mkdir ~/nginxmkdir ~/nginx/conf.dmkdir ~/nginx/html#切换目录cd ~/nginx/#创建未挂载数据卷的nginx容器,只为要其中的配置文件docker run -id --name=nginx nginx#复制其中的文件docker cp nginx:/etc/nginx/nginx.conf ./docker cp nginx:/etc/nginx/conf.d/default.conf ./conf.d/
准备好配置文件后,即可创建正式的nginx容器
#创建容器,并映射端口docker run --name=nginx-MASTER -d -p 8000:80 -v $PWD/html:/usr/share/nginx/html -v $PWD/nginx.conf:/etc/nginx/nginx.conf:ro -v $PWD/conf.d:/etc/nginx/conf.d nginx
再使用上面的命令在另一个虚拟机中实现
注意将--name=nginx-MASTER改为nginx-BACKUP 理论上不该也行,为了好区分
,注意开启端口8000
此时可以分别在浏览器使用虚拟机的ip 8000访问nginx,出现欢迎界面即为安装成功。
更多nginx相关配置信息见:
安装keepalived软件
keepalived软件安装在linux本地,而不是安装在docker中
#使用yum命令安装keepalived yum install keepalived -y #检查是否安装完成 rpm -q -a keepalived
安装位置:/etc/keepalived/keepalived.conf,后面主要修改该配置文件
修改keepalived.conf配置文件,
添加注释的为重点,其他不关键
打开配置文件
vi /etc/keepalived/keepalived.conf
Nginx-MASTER(主服务器)配置:
global_defs { notification_email { abc@qq.com } notification_email_from root@qq.com smtp_server 182.168.1.117 smtp_connect_timeout 30 router_id 127.0.0.1 #127.0.0.1}vrrp_script chk_nginx {script "/etc/keepalived/nginx_pid.sh" # 检查nginx状态的脚本 interval 2 #检查时间间隔 weight 3 #权重}vrrp_instance VI_1 {state MASTER #备份服务器上将MASTER改为BACKUP interface ens33 #网卡名称 virtual_router_id 66 #主备机virtual_router_id必须一致 priority 100 #备份服务上将100改为小于100,可配置成90 advert_int 1 authentication {auth_type PASS auth_pass 1111 } virtual_ipaddress {192.168.11.11 #有多个vip可在下面继续增加 } track_script {chk_nginx }}
Nginx-BACKUP(备用服务器):
global_defs { notification_email { 1826467987@qq.com } notification_email_from root@xuad.com smtp_server 182.168.1.117 smtp_connect_timeout 30 router_id 127.0.0.1 #127.0.0.1}vrrp_script chk_nginx {script "/etc/keepalived/nginx_pid.sh" # 检查nginx状态的脚本 interval 2 weight 3}vrrp_instance VI_1 {state BACKUP #备份服务器上将MASTER改为BACKUP interface ens33 virtual_router_id 66 #与master一致 priority 90 #备份服务上将100改为小于100,可配置成90 advert_int 1 authentication {auth_type PASS auth_pass 1111 } virtual_ipaddress {192.168.11.11 #有多个vip可在下面继续增加 } track_script {chk_nginx }}
添加脚本信息
在上面的配置文件中有一行:script “/etc/keepalived/nginx_pid.sh” 即脚本位置
#转到该目录cd /etc/keepalived/#创建文件touch nginx_pid.sh#编辑文件vi nginx_pid.sh
脚本内容:
#!/bin/bashA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then systemctl restart docker #重启docker容器 sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #如果重启失败,关闭keepalived systemctl stop keepalivedfifi
两个虚拟机中都要添加
完成以上配置后分别重启两个虚拟机中的nginx和keepalived
#重启nginxdocker stop nginx-MASTERdocker start nginx-MASTER#开启keepalivedsystemctl start keepalvied.service
测试,使用虚拟IP访问:http://192.168.11.11:8000,即可看到nginx欢迎界面,当关闭主nginx时:
docker stop nginx-MASTERsystemctl stop keepalvied.service
该访问url依然可以访问,表示高可用实现
关于url:这里需要添加端口,因为nginx是在docker容器中,在上面也可以看到,80端口映射了宿主机的8000端口,所以要添加端口;由此推导,两个nginx的映射端口也必须一致,否则无论如何只能访问其中一个nginx