登 录
注 册
< 系统运维
Linux
计算机系统
系统工具
常用特殊命令
常用shell脚本
Nginx基本概念
Nginx多端口代理
Nginx负载均衡配置
Nginx负载均衡策略
Nginx动静分离
Nginx高可用
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Linux
>>
Nginx高可用
Nginx高可用
2021-12-25 15:45:04 星期六 阅读:891
![](/static/images/article_images/1693146972.887455.png) 前几偏文章配置存在的问题是,即使你Tomcat服务是多机器部署的, 如果Nginx服务器挂掉,则用户还是无法访问Tomcat服务。所以`存在Nginx单点故障问题` Nginx高可用解决的就是,即使`Nginx所在服务器挂掉,也能正常对外提供服务` Nginx高可用架构下图 ![](/static/images/article_images/1640417920.6568341.jpeg) Nginx主备的IP都不对用户暴露,而是绑定一个虚拟IP(VIP),用户访问的时候通过访问虚拟IP,再通过keepalived将请求路由到主Nginx上。 keepalived会定时向主备Nginx发送心跳,检测Nginx服务是否正常,如果当前主Nginx服务宕机,则自动将备份Nginx切换为主Nginx。 ###配置实例 -------------------------------------------------------------------------------- #### 实现效果 1、配置主备Nginx服务器,实现通过指定的虚拟IP访问Nginx服务; 2、将主Nginx服务停止后,还能正常访问Nginx服务 #### 环境准备 1、需要两台Nginx服务器 | ip | 域名 | 角色 | | ------------ | ------------ | ------------ | | 192.168.1.6 | local1.libins.cn | 主 | | 192.168.1.7 | local2.libins.cn | 备 | 安装并正常启动两台的Nginx后,在浏览器输入 `local1.libins.cn`与`local2.libisn.cn`应该能正常访问, 如下图: ![](/static/images/article_images/1640418096.582904.jpeg) 2、在两台Nginx服务器安装keepalived ``` # 主服务器 yum -y install keepalived # 备用服务器 yum -y install keepalived ``` 可通过rpm命令查看是否安装成功 ``` rpm -q -a keepalived # keepalived-1.3.5-19.el7.x86_64 ``` #### 高可用配置 1、配置两台机器的keepalived的配置文件 ``` cd /etc/keepalived vim keepalived.conf ``` 两台机器更改后的内容分别为: 主Nginx ``` # 全局配置 global_defs { notification_email { # 配置提醒的邮箱,可配置多个 libins.cn@gmail.com libins@163.smtp_connect_timeout } notification_email_from libins.cn@gmail.com # 配置发件人及邮箱服务器 smtp_server 192.168.1.1 smtp_connect_timeout 30 router_id localhost # 访问到的主机 } # 检测脚本配置 vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" # 用于检测Nginx服务是否正常,如果不正常,则执行下面的语句 interval 2 # 检测时间间隔2秒 weight 2 # 如果上面脚本中的条件成立,则本机的权重增加2 } # 虚拟IP配置 vrrp_instance VI_1 { state MASTER # 当前服务器是主还是备,如果是主则写MASTER,如果是备则写BACKUP interface ens32 # 当前服务器需要绑定虚拟IP的网卡名称,通过ifconfig命令获得 virtual_router_id 100 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 # 每隔一秒发送一个心跳,检测服务器是否还活着 authentication { # 认证方式为密码,且密码是1111 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 对外暴露的虚拟IP地址(可以填多个) 192.168.1.100 } } ``` 备Nginx 其实只修改了第23行的角色为备份,和26行的优先级 ``` # 全局配置 global_defs { notification_email { # 配置提醒的邮箱,可配置多个 libins.cn@gmail.com libins@163.smtp_connect_timeout } notification_email_from libins.cn@gmail.com # 配置发件人及邮箱服务器 smtp_server 192.168.1.1 smtp_connect_timeout 30 router_id localhost # 访问到的主机 } # 检测脚本配置 vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" # 用于检测Nginx服务是否正常,如果不正常,则执行下面的语句 interval 2 # 检测时间间隔2秒 weight 2 # 如果上面脚本中的条件成立,则本机的权重增加2 } # 虚拟IP配置 vrrp_instance VI_1 { state BACKUP # 当前服务器是主还是备,如果是主则写MASTER,如果是备则写BACKUP interface ens32 # 当前服务器需要绑定虚拟IP的网卡名称,通过ifconfig命令获得 virtual_router_id 100 # 主、备机的 virtual_router_id 必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 # 每隔一秒发送一个心跳,检测服务器是否还活着 authentication { # 认证方式为密码,且密码是1111 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 对外暴露的虚拟IP地址(可以填多个) 192.168.1.100 } } ``` 2、编写检测脚本 上面的配置文件中指定了shell脚本用来检测Nginx服务是否正常,该shell脚本的内容如下 注意:两台机器都需要新建该shell文件 ``` cd /usr/local/src/ vim nginx_check.sh ``` 添加如下内容 ``` #!/bin/bash A=`ps -C nginx ¨Cno-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 ``` 3、重启两台Nginx服务器 ``` cd /usr/local/nginx/ sbin/nginx -s stop sbin/nginx ``` 4、两台服务器启动keepalived服务 ``` systemctl start keepalived.service ``` 测试验证 浏览器输入虚拟IP:192.168.1.100,能够正常访问Nginx欢迎页面。 ![](/static/images/article_images/1640418247.2945511.jpeg) 将主Nginx服务器的Nginx进程停止,keepalived进程停止,浏览器再次访问虚拟IP,还能正常访问,说明高可用配置成功。 ``` cd /usr/local/nginx/ sbin/nginx -s stop systemctl stop keepalived.service ```