一、Nginx+Keepalived实现站点高可用、
1、架构图
image.png
2、环境:
node01:192.168.32.132 keepalived
node02:192.168.32.128 keepalived
node03:192.168.32.131 web01
node03:192.168.32.134 web02
node03:192.168.32.135 web03
3、配置web服务
[root@node03 conf.d]# vim /etc/hosts
192.168.32.132 node01 node01.hehe.com
192.168.32.128 node02 node02.hehe.com
192.168.32.131 node03 node03.hehe.com
192.168.32.134 node03 node03.hehe.com
192.168.32.135 node03 node03.hehe.com
192.168.32.133 node04 node04.hehe.com
[root@node03 ~]# yum install -y httpd
[root@node03 conf.d]# vim vhosts.conf
<VirtualHost 192.168.32.131:80>
ServerName 192.168.32.131
DocumentRoot "/data/web/vhost1"
<Directory "/data/web/vhost1">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.32.134:80>
ServerName 192.168.32.134
DocumentRoot "/data/web/vhost2"
<Directory "/data/web/vhost2">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.32.135:80>
ServerName 192.168.32.135
DocumentRoot "/data/web/vhost3"
<Directory "/data/web/vhost3">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
[root@node03 conf.d]# mkdir -pv /data/web/vhost{1,2,3}
[root@node03 conf.d]# vim /data/web/vhost1/index.html
<h1>Vhost2</h1>
[root@node03 conf.d]# vim /data/web/vhost2/index.html
<h1>Vhost2</h1>
[root@node03 conf.d]# vim /data/web/vhost3/index.html
<h1>Vhost3</h1>
[root@node03 conf.d]# systemctl start httpd
4、配置node01keepalived服务
[root@node01 ~]# yum install -y keepalived
[root@node01 ~]# yum install -y nginx
[root@node01 ~]# vim /etc/hosts
192.168.32.132 node01 node01.hehe.com
192.168.32.128 node02 node02.hehe.com
192.168.32.131 node03 node03.hehe.com
192.168.32.134 node03 node03.hehe.com
192.168.32.135 node03 node03.hehe.com
192.168.32.133 node04 node04.hehe.com
[root@node01 keepalived]# ls
keepalived.conf keepalived.conf.bak keep_down.sh notify.sh
[root@node01 keepalived]# keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node01
vrrp_mcast_group4 224.1.101.33
}
vrrp_script chk_down {
script "/etc/keepalived/keep_down.sh"
weight -10
interval 1
fall 1
rise 1
}
vrrp_instance VI_1 {
state MASTER
priority 100
interface ens33
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass IGsPtR1X3w
}
virtual_ipaddress {
192.168.32.188/16 dev ens33 label ens33:0
}
track_script {
chk_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
}
vrrp_instance VI_2 {
state BACKUP
priority 96
interface ens33
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass IGsPt3w
}
virtual_ipaddress {
192.168.32.166/16 dev ens33 label ens33:1
}
track_script {
chk_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
}
[root@node01 keepalived]# vim notify.sh
#!/bin/bash
#
contact='root@localhost'
notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
systemctl start nginx
;;
backup)
systemctl start nginx
notify backup
;;
fault)
systemctl stop nginx
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
[root@node01 keepalived]# vim keep_down.sh
#!/bin/bash
if [ -f /etc/keepalived/down ];then
exit 1
else
exit 0
fi
5、配置node02keepalived服务
[root@node02 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node02
vrrp_mcast_group4 224.1.101.33
}
vrrp_script chk_down {
script "/etc/keepalived/keep_down.sh"
weight -10
interval 1
fall 1
rise 1
}
vrrp_instance VI_1 {
state BACKUP
priority 96
interface ens33
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass IGsPtR1X3w
}
virtual_ipaddress {
192.168.32.188/16 dev ens33 label ens33:0
}
track_script {
chk_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
priority 100
interface ens33
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass IGsPt3w
}
virtual_ipaddress {
192.168.32.166/16 dev ens33 label ens33:1
}
track_script {
chk_down
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
}
[root@node02 keepalived]# vim notify.sh
#!/bin/bash
#
contact='root@localhost'
notify() {
local mailsubject="$(hostname) to be $1, vip floating"
local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
systemctl start nginx
notify master
;;
backup)
systemctl start nginx
notify backup
;;
fault)
systemctl stop nginx
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
[root@node02 keepalived]# vim keep_down.sh
#!/bin/bash
if [ -f /etc/keepalived/down ];then
exit 1
else
exit 0
fi
6、配置node01、node02的nginx服务
[root@node01 nginx]# vim nginx.conf
upstream websrvs {
server 192.168.32.131:80;
server 192.168.32.134:80;
server 192.168.32.135:80;
}
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://websrvs;
}
[root@node02 nginx]# vim nginx.conf
upstream websrvs {
server 192.168.32.131:80;
server 192.168.32.134:80;
server 192.168.32.135:80;
}
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://websrvs;
}
7、启动node01、node02的keepalived、nginx服务
[root@node01 ~]# systemctl start keepalived
[root@node02 ~]# systemctl start keepalived
[root@node01 ~]# systemctl start nginx
[root@node02 ~]# systemctl start nginx
8、验证
[40796.DESKTOP-Q4O3FV5] ➤ curl http://192.168.32.188
<h1>Vhost1</h1>
[40796.DESKTOP-Q4O3FV5] ➤ curl http://192.168.32.188
<h1>Vhost2</h1>
[40796.DESKTOP-Q4O3FV5] ➤ curl http://192.168.32.188
<h1>Vhost1</h1>
[40796.DESKTOP-Q4O3FV5] ➤ curl http://192.168.32.166
<h1>Vhost1</h1>
[40796.DESKTOP-Q4O3FV5] ➤ curl http://192.168.32.166
<h1>Vhost2</h1>
[40796.DESKTOP-Q4O3FV5] ➤ curl http://192.168.32.166
<h1>Vhost3</h1>