OPS Nginx 主从模式
环境准备
实验内容
只有一台Nginx服务器时,如果该服务器宕机,则Nginx的所有功能将失效。
这意味着业务不得不暂停,直到排除掉Nginx服务器宕机的原因。
所以在实际生产中,我们应当至少具备2台Nginx服务器,当一台Nginx宕机后另一台进行接管。
除此之外,我们还需要keepalived来做一个虚拟IP供application进行链接:
准备2台服务器,每台服务器上安装Nginx与tomcat。
准备keepalived软件,提供vip地址,2台服务器都需要。
keepalived
2台服务器都需要,所以统一进行下载:
$ yum install -y keepalived
安装完成之后,node2在/etc/keepalived/keepalived.conf中填入以下配置项:
$ vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 定义利用什么邮箱发送邮件
notification_email_from Alexandre.Cassen@firewall.loc
# 定义邮件服务器信息
smtp_server smtp.163.com
# 定义邮件发送超时时间
smtp_connect_timeout 30
# 添加Nginx机的IP,2个节点不一样
router_id 192.168.0.110
# 添加运行健康检查脚本的用户
script_user root
# 添加运行健康检查脚本的组
enable_script_security
}
vrrp_script chk_http_port {
# 心跳检测脚本
script "/usr/local/src/nginx_check.sh"
# 检测脚本执行的间隔
interval 2
# 监测失败,则相应的vrrp_instance的优先级会减少20个点
weight -20
}
vrrp_instance VI_1 {
# 主备身份、node1是MASTER,node2是BACKUP
state MASTER
# 虚拟ip绑定的网卡,ifconfig查看
interface ens33
# 主、备机的 virtual_router_id 必须相同
virtual_router_id 51
# 主、备机取不同的优先级,主机值较大,备份机值较小
priority 100
# 主服务器组播包发送间隔时间
advert_int 1
# 主备主机之间的认证表示信息
authentication {
# 采用明文认证机制
auth_type PASS
# 编写明文密码
auth_pass 1111
}
virtual_ipaddress {
# 设置虚拟ip地址信息,此参数备节点设置和主节点相同
192.168.0.51
}
track_script {
# 调用执行脚本
chk_http_port
}
}
同理,node2的keepalived配置文件:
$ vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
# 定义利用什么邮箱发送邮件
notification_email_from Alexandre.Cassen@firewall.loc
# 定义邮件服务器信息
smtp_server smtp.163.com
# 定义邮件发送超时时间
smtp_connect_timeout 30
# 添加Nginx机的IP,2个节点不一样
router_id 192.168.0.120
# 添加运行健康检查脚本的用户
script_user root
# 添加运行健康检查脚本的组
enable_script_security
}
vrrp_script chk_http_port {
# 心跳检测脚本
script "/usr/local/src/nginx_check.sh"
# 检测脚本执行的间隔
interval 2
# 监测失败,则相应的vrrp_instance的优先级会减少20个点
weight -20
}
vrrp_instance VI_1 {
# 主备身份、node1是MASTER,node2是BACKUP
state BACKUP
# 虚拟ip绑定的网卡,ifconfig查看
interface ens33
# 主、备机的 virtual_router_id 必须相同
virtual_router_id 51
# 主、备机取不同的优先级,主机值较大,备份机值较小
priority 90
# 主服务器组播包发送间隔时间
advert_int 1
# 主备主机之间的认证表示信息
authentication {
# 采用明文认证机制
auth_type PASS
# 编写明文密码
auth_pass 1111
}
virtual_ipaddress {
# 设置虚拟ip地址信息,此参数备节点设置和主节点相同
192.168.0.51
}
track_script {
# 调用执行脚本
chk_http_port
}
}
脚本准备
2个节点中都创建keepalived心跳检测脚本:
$ vim /usr/local/src/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
systemctl stop keepalived.service
fi
fi
# 注意,如果是centos6,则改为service stop keepalived
权限设置为775:
$ chmod 775 /usr/local/src/nginx_check.sh
最后启动keepalived:
$ systemctl start keepalived.service
tomact
2个节点下载tomcat:
$ cd ~
$ mkdir -p /project/tomcat808{0,1}
$ wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.tar.gz
2个节点解压tomcat,解压两份:
$ tar -zxvf apache-tomcat-7.0.70.tar.gz -C /project/tomcat8080
2个节点安装Java环境:
$ yum install -y java-1.8.0-openjdk.x86_64
node1上创建balanced文件夹:
$ mkdir -p /project/tomcat8080/apache-tomcat-7.0.70/webapps/balanced
在node1的balanced文件夹中书写内容:
$ cat > /project/tomcat8080/apache-tomcat-7.0.70/webapps/balanced/index.html<<EOF
<h1> node1 </h1>
EOF
node2上创建balanced文件夹:
$ mkdir -p /project/tomcat8080/apache-tomcat-7.0.70/webapps/balanced
在node2的balanced文件夹中书写内容:
$ cat > /project/tomcat8080/apache-tomcat-7.0.70/webapps/balanced/index.html<<EOF
<h1> node2 </h1>
EOF
启动两个节点上的tomact:
$ /project/tomcat8080/apache-tomcat-7.0.70/bin/startup.sh
尝试进行访问:
http://192.168.0.110:8080/balanced/index.html
http://192.168.0.120:8080/balanced/index.html
Nginx配置
配置过程
2台节点沿用负载均衡的配置:
$ vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
upstream TestServer{
server 192.168.0.110:8080;
server 192.168.0.120:8080;
}
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.0.110;
location / {
proxy_pass http://TestServer;
proxy_connect_timeout 10;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
然后2个节点进行重载Nginx配置文件:
$ nginx -s reload
效果测试
查看虚拟VIP:
$ systemctl status keepalived
4月 07 06:17:58 node1 Keepalived_vrrp[3321]: Sending gratuitous ARP on ens33 for 192.168.0.50
在MAC上使用虚拟VIP访问以下路径,访问2次发现node1:tomact与nod2:tomact都能成功到达:
$ http://192.168.0.50/balanced/index.html
此时的每次访问都会被node1的Nginx所处理,尝试停止node1的Nginx服务,再次进行访问。
$ nginx -s stop
如果配置成功,则依旧是可以访问的。