nginx+docker+nfs部署
云計(jì)算
一.體系架構(gòu)
在Keepalived + Nginx高可用負(fù)載均衡架構(gòu)中,keepalived負(fù)責(zé)實(shí)現(xiàn)High-availability (HA) 功能控制前端機(jī)VIP(虛擬網(wǎng)絡(luò)地址),當(dāng)有設(shè)備發(fā)生故障時(shí),熱備服務(wù)器可以瞬間將VIP自動(dòng)切換過來,實(shí)際運(yùn)行中體驗(yàn)只有2秒鐘切換時(shí)間,dns服務(wù)可以負(fù)責(zé)前端VIP的負(fù)載均衡。
nginx負(fù)責(zé)控制后端web服務(wù)器的負(fù)載均衡,將客戶端的請(qǐng)求按照一定的算法轉(zhuǎn)發(fā)給后端Real Server處理,而Real Server將響應(yīng)直接返回給客戶端。
nfs服務(wù)器做實(shí)時(shí)備份,給web服務(wù)器提供web界面。
二.簡(jiǎn)單原理
NGINX_MASTER、NGINX_BACKUP兩臺(tái)服務(wù)器均通過keepalived軟件把ens33網(wǎng)卡綁上一個(gè)虛擬IP(VIP)地址192.168.1.40,此VIP當(dāng)前由誰(shuí)承載著服務(wù)就綁定在誰(shuí)的ens32上,當(dāng)NGINX_MASTER發(fā)生故障時(shí),NGINX_BACKUP會(huì)通過/etc/keepalived/keepalived.conf文件中設(shè)置的心跳時(shí)間advert_int 1檢查,無法獲取NGINX_MASTER正常狀態(tài)的話,NGINX_BACKUP會(huì)瞬間綁定VIP來接替nginx_master的工作,當(dāng)NGINX_MASTER恢復(fù)后keepalived會(huì)通過priority參數(shù)判斷優(yōu)先權(quán)將虛擬VIP地址192.168.1.40重新綁定給NGINX_MASTER的ens33網(wǎng)卡。
使用此方案的優(yōu)越性
1.實(shí)現(xiàn)了可彈性化的架構(gòu),在壓力增大的時(shí)候可以臨時(shí)添加web服務(wù)器添加到這個(gè)架構(gòu)里面去;
2.upstream具有負(fù)載均衡能力,可以自動(dòng)判斷后端的機(jī)器,并且自動(dòng)踢出不能正常提供服務(wù)的機(jī)器;
3.相對(duì)于lvs而言,正則分發(fā)和重定向更為靈活。而Keepalvied可保證單個(gè)nginx負(fù)載均衡器的有效性,避免單點(diǎn)故障;
4.用nginx做負(fù)載均衡,無需對(duì)后端的機(jī)器做任何改動(dòng)。
5.nginx部署在docker容器里,即大量地節(jié)約開發(fā)、測(cè)試、部署的時(shí)間,又可以在出現(xiàn)故障時(shí)通過鏡像快速恢復(fù)業(yè)務(wù)。
三、系統(tǒng)環(huán)境
兩臺(tái)負(fù)載機(jī)器安裝:,nginx+docker+nfs 分別命名為:NGINX_MASTER,NGINX_BACKUP。
后端web服務(wù)器,可以是提供web服務(wù)的任何架構(gòu),分別命名為:WEB_1,WEB_2。
后端數(shù)據(jù)庫(kù)機(jī)器可任意架構(gòu),只要能提供數(shù)據(jù)庫(kù)服務(wù)即可。
NGINX_MASTER
192.168.1.10
nginx+keepalived
NGINX_BACKUP
192.168.1.20
nginx+keepalived
WEB_1
192.168.1.11
docker+nginx
WEB_2
192.168.1.13
docker+nginx
nfs_MASTER
192.168.1.30
nfs+rsync+inotify
nfs_BACKUP
192.168.1.10
nfs+rsync+inotify
nginx部署(兩臺(tái)都是)
安裝nginx
[root@nginx01 ~]# tar zxf nginx-1.14.0.tar.gz
//解壓nginx安裝包
[root@nginx01 ~]# cd nginx-1.14.0/
[root@nginx01 nginx-1.14.0]# yum -y install openssl-devel pcre-devel zlib-devel
//安裝nginx依賴包
[root@nginx01 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx1.14 --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx && make && make install
//編譯安裝nginx
[root@nginx01 nginx-1.14.0]# useradd nginx -s /sbin/nologin -M
//創(chuàng)建所需用戶
[root@nginx01 nginx-1.14.0]# ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/
//鏈接命令
[root@nginx01 nginx-1.14.0]# nginx
//開啟nginx
[root@nginx01 nginx-1.14.0]# netstat -anpt | grep nginx
//查看nginx是否開啟
部署nginx
[root@nginx01 ~]# cd /usr/local/nginx1.14/conf/
[root@nginx01 conf]# vim nginx.conf
? http模塊加
upstream backend {
server 192.168.1.11:90 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.13:90 weight=1 max_fails=2 fail_timeout=10s;
}
location / {
# root html;
# index index.html index.htm;
proxy_pass http://backend; #添加
}
高可用環(huán)境
安裝keepalived
[root@nginx02 nginx-1.14.0]# yum -y install keepalived
配置keepalived
修改主和備nginx服務(wù)器上的keepalived 配置文件 /etc/keepalived/keepalived.conf 文件
主nginx
修改主nginx下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.40
}
}
備nginx
修改備nginx下 /etc/keepalived /keepalived.conf文件
配置備nginx時(shí)需要注意:需要修改state為BACKUP , priority比MASTER低,virtual_router_id和master的值一致
! Configuration File for keepalived
global_defs {
router_id TWO
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.40
}
}
測(cè)試(在做完docker的時(shí)候)
主備nginx都啟動(dòng)keepalived
systemctl start keepalived
[root@nginx01 conf]# curl 192.168.1.40
wsd666
nfs部署(兩臺(tái)都是)
nfs操作
[root@localhost ~]# yum -y install nfs-utils
//下載nfs服務(wù)
[root@nfs ~]# mkdir /database
//創(chuàng)建共享目錄
[root@nfs02 ~]# chmod 777 /database/
//設(shè)置權(quán)限
[root@nfs ~]# vim /etc/exports
//設(shè)置權(quán)限如下
/database *(rw,sync,no_root_squash)
開啟各項(xiàng)服務(wù)
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server
docker01和docker02測(cè)試nfs
[root@nfs01 ~]# vim /etc/rsyncd.conf
//建立rsync配置文件
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.1.30
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.1.0/24
[wwwroot]
path = /database
read only = no
dont compress = *.gz *.bz2 *.rar *.zip
[root@nfs01 ~]# mkdir /database
//創(chuàng)建共享目錄
[root@nfs01 ~]# rsync --daemon
//啟動(dòng)rsync
[root@nfs01 ~]# netstat -anpt | grep rsync
//查看端口
如果需要重啟rsync服務(wù),需要:
[root@localhost ~]# kill $(cat /var/run/rsyncd.pid)
//停止服務(wù)
[root@localhost ~]# rsync --daemon
//啟動(dòng)服務(wù)
[root@localhost ~]# kill -9 $(cat /var/run/rsyncd.pid)
或者直接使用“netstat -anpt | grep rsync”命令查出進(jìn)程號(hào),使用“kill 進(jìn)程號(hào)”一樣。
使用第一種方法停止rsync服務(wù)必須刪除存放rsync服務(wù)進(jìn)程的文件:
[root@localhost ~]# rm -rf /var/run/rsyncd.pid
使用rsync備份工具
配置好rsync同步源服務(wù)器之后,客戶端就可以使用rsync工具來執(zhí)行遠(yuǎn)程同步了。
與rsync主機(jī)同步
rsync命令的選項(xiàng):
-r:遞歸模式,包含目錄及子目錄中所有文件
-l:對(duì)于符號(hào)鏈接文件仍然復(fù)制為符號(hào)鏈接文件
-p:保留文件的權(quán)限標(biāo)記
-t:保留文件的時(shí)間標(biāo)記
-g:保留文件的屬組標(biāo)記(僅超級(jí)用戶使用)
-o:保留文件的屬主標(biāo)記(僅超級(jí)用戶使用)
-D:保留設(shè)備文件及其他特殊文件
-a:歸檔模式,遞歸并保留對(duì)象屬性,等同于 -rlptgoD
-v:顯示同步過程的詳細(xì)(verbose)信息
-z:在傳輸文件時(shí)進(jìn)行壓縮(compress)
-H:保留硬連接文件
-A:保留ACL屬性信息
--delete:刪除目標(biāo)位置有而原始位置沒有的文件
--checksum:根據(jù)對(duì)象的校驗(yàn)和來決定是否跳過文件
rsync是一款快速增量備份工具,支持:
(1)本地復(fù)制;
(2)與其他SSH同步;
(3)與rsync主機(jī)同步。
手動(dòng)與rsync主機(jī)同步
[root@localhost ~]# rsync -avz 192.168.1.1::wwwroot /root
或者
[root@localhost ~]# rsync -avz rsync://192.168.1.1/wwwroot /root
[root@nfs01 database]# vim index.html
xgp666
//創(chuàng)建測(cè)試目錄
配置inotify+rsync實(shí)時(shí)同步(兩臺(tái)都是)
(1)、軟件安裝
rpm -q rsync //查詢r(jià)sync是否安裝,一般為系統(tǒng)自帶安裝
yum install rsync -y //若沒有安裝,使用yum安裝
安裝inotify軟件包
[root@nfs02 ~]# tar zxf inotify-tools-3.14.tar.gz
[root@nfs02 ~]# cd inotify-tools-3.14/
[root@nfs02 inotify-tools-3.14]# ./configure && make && make install
(2)調(diào)整inotify內(nèi)核參數(shù)
[root@nfs02 ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@nfs02 ~]# sysctl -p
//生效
(3) 編寫觸發(fā)式同步腳本
#!/bin/bash
A=inotifywait -mrq -e modify,move,create,delete /database/
B=rsync -avz /database/ 192.168.1.40::wwwroot
$A | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -gt 0 ] ; then
$B
fi
done
此處需要注意,在兩臺(tái)服務(wù)器需要同步的目錄之間,也需要將目錄權(quán)限放到最大,避免因目錄本身權(quán)限報(bào)錯(cuò)。
[root@nfs01 inotify-tools-3.14]# chmod +x /opt/ino.sh
設(shè)置腳本開機(jī)自啟
[root@nfs01 database]# vim /etc/rc.d/rc.local
/opt/ino.sh &
/usr/bin/rsync --daemon
源服務(wù)器端測(cè)試
執(zhí)行腳本后,當(dāng)前終端會(huì)變成實(shí)時(shí)監(jiān)控界面,需要重新打開終端操作。
在源服務(wù)器端共享模塊目錄下進(jìn)行文件操作,然后去備份服務(wù)器下,可觀察到文件已經(jīng)被實(shí)時(shí)同步。
docker部署(兩臺(tái)都是)
[root@docker01 ~]# docker pull nginx
[root@docker01 ~]# mkdir -p /www
//創(chuàng)建掛載目錄
nfs創(chuàng)建好之后docker上掛載目錄
[root@docker01 ~]# mount -t nfs 192.168.1.30:/database /www
[root@docker01 ~]# docker run -itd --name nginx -p 90:80 -v /www/index.html:/usr/share/nginx/html/index.html nginx:latest
測(cè)試
1、當(dāng)NGINX_MASTER、NGINX_BACKUP服務(wù)器nginx均正常工作時(shí)
在NGINX_MASTER上:
在NGINX_BACKUP上:
master服務(wù)器ens32網(wǎng)卡正常綁定VIP,而backup卻沒有綁定,通過瀏覽器可正常訪問網(wǎng)站。
2、關(guān)閉NGINX_MASTER的nginx容器
當(dāng)nginx容器停止后,馬上就又啟起來了,nginx啟動(dòng)腳本沒問題
3、關(guān)閉NGINX_MASTER的keepalived服務(wù)
在NGINX_MASTER上:
在NGINX_BACKUP上:
NGINX_BACKUP的ens32網(wǎng)卡已瞬間綁定VIP,通過瀏覽器訪問網(wǎng)站正常。
4、將NGINX_MASTER的keepalived服務(wù)啟動(dòng)
在NGINX_MASTER上:
在NGINX_BACKUP上:
NGINX_MASTER的ens32網(wǎng)卡重新綁定VIP,通過瀏覽器訪問網(wǎng)站正常。
5、關(guān)閉WEB_1服務(wù)器,通過瀏覽器訪問網(wǎng)站正常。
排錯(cuò)
首先查看nginx配置文件是否有問題
兩臺(tái)keepakived的各項(xiàng)參數(shù)是否正常
docker上nginx是否映射端口,掛載nfs的共享目錄。
nfs是否設(shè)置目錄權(quán)限。是否配置rsync+inotify,寫一個(gè)shell來做實(shí)時(shí)備份。
總結(jié):
首先是鏡像,就是拉取nginx的鏡像。然后再把nginx鏡像重建一下,就是變成我們需要的,主要就是改配置文件。然后把所有鏡像push到harbor上
搭建nginx,做反向代理。
搭建docker,安裝nginx鏡像做測(cè)試做頁(yè)面,測(cè)試面是從nfs共享來的。
搭建NFS,為了實(shí)現(xiàn)數(shù)據(jù)共享,包括數(shù)據(jù)庫(kù),就是持久化的。還要通過rsync+inotify,做到實(shí)時(shí)備份。
總結(jié)
以上是生活随笔為你收集整理的nginx+docker+nfs部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络设备配置
- 下一篇: win服务器中安装开源电子邮箱服务端