本次實驗中須要使用到四臺主機:
四臺虛擬機上安裝的都是centos7.6操做系統html
主機名 | ip | 功能 |
---|---|---|
nginx_master | 192.168.8.128 | 負載均衡,健康檢查 |
nginx_backup | 192.168.8. 129 | nginx_master的小弟 |
web1 | 192.168.8.126 | 提供web服務 |
web2 | 192.168.8.127 | 提供web服務 |
說簡單點,小弟的做用就是在大哥有危難之際,替大哥挨刀的。當nginx_master出現故障時,nginx_backup就代替nginx_master正常工做。
另外還有一個虛擬 ip:192.168.8.242
keepalived能夠將多個無狀態的單點經過虛擬IP(VIP)漂移的方式搭建成一個高可用服務。nginx
1、負載均衡服務器nginx的配置
nginxmaster和nginxbackup上都須要進行如下操做c++
一、docker安裝
安裝yum-utils,它提供一個yum-config-manager單元,同時安裝的device-mapper-persistent-data和lvm2用於儲存設備映射(devicemapper)必須的兩個軟件包。web
yum install -y yum-utils device-mapper-persistent-data lvm2docker
緊接着配置一個穩定(stable)的倉庫
倉庫配置會保存到/etc/yum.repos.d/docker-ce.repo文件中。
生成元數據
安裝docker-ce
二、 配置deamon.json和nginx.conf文件
編輯daemon.json文件,填寫阿里雲鏡像倉庫的地址並指定docker數據存儲目錄
vim daemon.json。json
{ "registry-mirrors": ["你的阿里鏡像倉庫地址"], "graph": "/data/docker" }vim
從新加載daemon,重啓docker服務。centos
[root@localhost docker]# systemctl daemon-reload
[root@localhost docker]# systemctl restart docker瀏覽器
把docker加入開機啓動bash
拉取一個nginx鏡像
建立nginx配置文件目錄,啓動一個nginx-c容器並把容器裏的nginx.conf拷貝到本地
刪除容器nginx-c
這兩步就是在nginx容器的配置文件的基礎上修改參數,以實現想要的功能。
三、建立nginx容器並對其進行配置
(1)編寫建立nginx容器的腳本
#!/bin/bash
docker run --name nginx --restart=always -p 80:80 \
-v /data/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /data/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /data/docker/nginx/html:/usr/share/nginx/html \
-v /data/docker/nginx/logs:/var/log/nginx \
-d nginx:latest
注:--restart=always是重啓策略,當docker服務重啓後,容器也會自動啓動
(2) 賦予腳本執行權限 並運行
chmod +x docker_nginx.sh
sh docker_nginx.sh
(3)修改nginx主配置文件
vim /data/docker/nginx/conf/nginx.conf
修改前
修改後
(4) 建立upstream配置文件
vim /data/docker/nginx/conf/conf.d/myhost.conf
upstream xuad {
ip_hash; #會話保持
server 192.168.2.226 max_fails=1 fail_timeout=60s;
server 192.168.2.227 max_fails=1 fail_timeout=60s;
}
(5) 建立虛擬主機配置文件
vim /data/docker/nginx/conf/conf.d/xuad.conf
server {
listen 80;
server_name localhost;
#charset GB2312;
location /
{
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://lxc;
}
#查看nginx的併發鏈接數配置
location /NginxStatus
{
stub_status on;
access_log off;
auth_basic "NginxStatus"; } access_log off;
error_page 404 /404.html;
error_page 500 502 503 504 /404.html;
location = /404.html {
root html;
}
limit_conn perip 200; #同一ip併發數爲200,超過會返回503
}
(6)重啓nginx容器
docker restart nginx
2、負載均衡服務器keepalived的配置
nginxmaster和nginxbackup上都須要進行如下操做
1 下載並安裝keepalived
分別在NGINX_MASTER、NGINX_BACKUP兩臺服務器上操做
注:keepalived安裝在實體機上
yum install wget make gcc gcc-c++ openssl-devel
wget http://www.keepalived.org/software/keepalived-2.0.7.tar.gz
tar zxvf keepalived-2.0.7.tar.gz
cd keepalived-2.0.7
./configure --prefix=/data/keepalived
若是報如下警告:
WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
不用擔憂,咱們只須要用到VRRP功能,不須要用IPVS功能,因此請確保如下三項是yes就好了。
編譯
make
make install
二、將keepalived 以服務方式啓動
建立/etc/keepalived目錄並把keepalived的配置文件拷貝/etc/keepalived目錄下並加入到開機啓動。
mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ systemctl enable keepalived
三、 修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
lxc@lxc.com
}
notification_email_from root@lxc.com
smtp_server mail.lxc.com
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}vrrp_script chk_nginx {
script "/etc/keepalived/nginx_pid.sh" # 檢查nginx狀態的腳本
interval 2
weight 3
}
vrrp_instance VI_1 {
state MASTER #備份服務器上將MASTER改成BACKUP
interface ens32 virtual_router_id 51 priority 100 #備份服務上將100改成小於100,可配置成90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.242 #有多個vip可在下面繼續增長
}
track_script {
chk_nginx
}
}
四、添加檢查nginx狀態的腳本
vim /etc/keepalived/nginx_pid.sh
#!/bin/bash
#version 0.0.1
A=ps -C nginx --no-header |wc -l
if [ $A -eq 0 ];then
systemctl restart docker
sleep 3
if [ps -C nginx --no-header |wc -l
-eq 0 ];then
systemctl stop keepalived
fi
fi
腳本說明:當nginx進程不存在時,會自動重啓docker服務,docker服務啓動時會自動啓動nginx容器;再次檢查nginx進程,若是不存在,就中止keepalived服務,而後NGINX_BACKUP主機會自動接替NGINX_MASTER的工做。
chmod +x /etc/keepalived/nginx_pid.sh
五、配置firewalld防火牆容許vrrp協議
VRRP(Virtual Router Redundancy Protocol,虛擬路由器冗餘協議)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.8.129" protocol value="vrrp" accept"
firewall-cmd --reload
若是是backup服務器,source address改爲master服務器的IP
6 、啓動keepalived
systemctl start keepalived
3、 配置時間同步
在NGINX_MASTER和NGINX_BACKUP上安裝ntp
yum -y install ntp
在NGINX_MASTER上修改ntp配置文件
添加如下兩行。
vim /etc/ntp.conf
server 127.127.1.0 iburst local clock #添加使用本地時間 restrict 192.168.8.0 mask 255.255.255.0 nomodify #容許更新的IP地址段
在NGINX_MASTER上啓動ntp服務,並加入開機啓動
systemctl start ntpd systemctl enable ntpd
在NGINX_MASTER上添加防火牆策略
只容許192.168.8.129訪問ntp服務。
在NGINX_BACKUP上同步NGINX_MASTER的時間
ntpdate 192.168.8.128
在NGINX_BACKUP上設置計劃任務
天天凌晨5點01分同步時間。
crontab -e 1 5 * /usr/sbin/ntpdate 192.168.8.128 >> /var/log/upClock.log
4、負載均衡服務器測試
一、測試nginx服務器
(1)當NGINX_MASTER、NGINX_BACKUP服務器nginx均正常工做時查看VIP
在NGINX_MASTER上
在NGINX_BACKUP上
master服務器ens32網卡正常綁定VIP,而backup卻沒有綁定,經過瀏覽器可正常訪問網站。
(2)關閉NGINX_MASTER的nginx容器
當nginx容器中止後,立刻就又啓起來了,nginx啓動腳本沒問題
(3)關閉NGINX_MASTER的keepalived服務
在NGINX_MASTER上。
在NGINX_BACKUP上
NGINX_BACKUP的ens32網卡已瞬間綁定VIP,經過瀏覽器訪問網站正常。
(4)將NGINX_MASTER的keepalived服務啓動
在NGINX_MASTER上
在NGINX_BACKUP上
NGINX_MASTER的ens32網卡從新綁定VIP,經過瀏覽器訪問網站正常。
二、測試WEB服務器
關閉WEB_1服務器
經過瀏覽器訪問網站正常。