個人做網(wǎng)站需要備案嗎bt兔子磁力天堂
一、前言
1、簡介
Nginx作為一款高性能的Web服務器和反向代理服務器,被廣泛使用。且現(xiàn)如今很多高并發(fā)場景需要后端服務集群部署,因此nginx也需要支持集群部署從而避免單點故障的問題。
本文將詳細介紹使用 Keepalived+Nginx 來實現(xiàn)Nginx的高可用集群和Nginx實現(xiàn)Gateway網(wǎng)關服務集群。
2、什么是Keepalived?
Keepalived是基于VRRP協(xié)議,作用是檢測服務器的狀態(tài),如果有一臺web服務器宕機,或工作出現(xiàn)故障,Keepalived將檢測到,并將有故障的服務器從系統(tǒng)中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
簡單來講Keepalived可以在master和slave子網(wǎng)卡建立一個相同的VIP(virtual IP),然后通過同一個虛擬出來的IP地址就可以訪問兩臺服務器的Nginx。
二、實現(xiàn)步驟
實現(xiàn) Keepalived+Nginx 高可用集群共有兩種常用方案,即主從模式和雙主模式。服務安裝很簡單所以本文不介紹如何安裝Keepalived和Nginx服務,將從配置方面分別介紹如何實現(xiàn)。
1、主從模式
這種方案由兩臺服務器均部署一個Keepalived和一個Nginx服務,然后虛擬出一個VIP地址,兩臺服務器一臺做主一臺做備,但同時只有一臺機器工作,主節(jié)點宕機后由從節(jié)點自動成為主節(jié)點。當主節(jié)點不出現(xiàn)故障的時候,從節(jié)點永遠處于空閑狀態(tài)。當主節(jié)點宕機重新上線后自動再次成為主節(jié)點。
1.1 服務器規(guī)劃
角色 | ip | vip地址 | 部署服務 |
---|---|---|---|
主節(jié)點 | 10.50.7.51 | 10.50.7.100 | Keepalived+Nginx |
從節(jié)點 | 10.50.7.76 | 10.50.7.100 | Keepalived+Nginx |
1.2 服務配置
1.2.1 keepalived配置
1、主節(jié)點keepalived.conf 配置如下(我的目錄是在 /etc/keepalived/keepalived.conf如下圖):
keepalived.conf :
! Configuration File for keepalivedglobal_defs {#路由id:當前安裝keepalived節(jié)點主機的標識符,全局唯一router_id keep_51
}# 定義chk_nginx腳本,腳本執(zhí)行間隔10秒,權重-10,檢測nginx服務是否在運行。
vrrp_script chk_nginx { #這里通過腳本監(jiān)測 script "/etc/keepalived/chk_nginx.sh" #腳本執(zhí)行間隔,每2s檢測一次interval 2 #腳本結果導致的優(yōu)先級變更,檢測失敗(腳本返回非0)則優(yōu)先級 -5 weight -10 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間) fall 2 #檢測1次成功就算成功。但不修改優(yōu)先級 rise 1
}vrrp_instance VI_1 {# 表示的狀態(tài),當前服務器為nginx的主節(jié)點,MASTER/BACKUPstate MASTER# 當前實例綁定的網(wǎng)卡 可通過ip addr查詢interface ens18# 保證主備節(jié)點一致virtual_router_id 100# 優(yōu)先級/權重,誰的優(yōu)先級高,在MASTER掛掉以后,就能成為MASTERpriority 100# 主備之間同步檢查的時間間隔,默認1sadvert_int 1# 認證授權的密碼,防止非法節(jié)點的進入authentication {auth_type PASSauth_pass 1111}# 虛擬出來的VIP地址virtual_ipaddress {10.50.7.100}#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!!track_script { #引用VRRP腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換。 chk_nginx }
}
2、從節(jié)點keepalived.conf配置:
! Configuration File for keepalivedglobal_defs {#路由id:當前安裝keepalived節(jié)點主機的標識符,全局唯一router_id keep_76
}# 定義chk_nginx腳本,腳本執(zhí)行間隔10秒,權重-10,檢測nginx服務是否在運行。
vrrp_script chk_nginx { #這里通過腳本監(jiān)測 script "/etc/keepalived/chk_nginx.sh" #腳本執(zhí)行間隔,每2s檢測一次interval 2 #腳本結果導致的優(yōu)先級變更,檢測失敗(腳本返回非0)則優(yōu)先級 -5 weight -10 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間) fall 2 #檢測1次成功就算成功。但不修改優(yōu)先級 rise 1
}vrrp_instance VI_1 {# 表示的狀態(tài),當前服務器為nginx的從節(jié)點,MASTER/BACKUPstate BACKUP# 當前實例綁定的網(wǎng)卡 可通過ip addr查詢interface ens18# 保證主備節(jié)點一致virtual_router_id 100# 優(yōu)先級/權重,誰的優(yōu)先級高,在MASTER掛掉以后,就能成為MASTERpriority 99# 主備之間同步檢查的時間間隔,默認1sadvert_int 1# 認證授權的密碼,防止非法節(jié)點的進入authentication {auth_type PASSauth_pass 1111}# 虛擬出來的VIP地址virtual_ipaddress {10.50.7.100}#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!!track_script { #引用VRRP腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換。 chk_nginx }
}
3、chk_nginx.sh
vim /etc/keepalived/chk_nginx.sh,
編輯完內(nèi)容之后需要賦權限,命令:chmod +x /etc/keepalived/chk_nginx.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then /home/chnsys/ecms/nginx/sbin/nginxsleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ] thensystemctl stop keepalived fi
fi
或者
#!/bin/bashcounter=$(ps -ef|grep nginx | grep -v 'grep'|wc -l)if [ "${counter}" = "0" ]; then/home/chnsys/ecms/nginx/sbin/nginx || truesleep 3counter=$(ps -ef|grep nginx | grep -v 'grep'|wc -l)if [ "${counter}" = "0" ]; thensystemctl stop keepalivedfifi
上述腳本需要按實際修改nginx的啟動命令,兩個腳本均可推薦第二個,這兩個 Bash 腳本的主要目的是檢查 Nginx 是否正在運行,并在其未運行時啟動 Nginx。如果啟動后 Nginx 仍然未運行,那么它將停止 keepalived 服務,keepalived 停止之后,將由從節(jié)點代替為主節(jié)點,防止主節(jié)點keepalived服務運行但是nginx服務掛掉導致后續(xù)服務無法訪問的問題。
1.3 啟動服務
分別啟動兩個服務器的nginx服務和keepalived服務,命令如下:
/home/chnsys/ecms/nginx/sbin/nginx(看具體的安裝位置)
systemctl start keepalived (全局生效)
1.4 驗證效果
分別訪問主服務器和從服務器以及虛擬vip的nginx服務的默認頁面地址:
可以看到,訪問虛擬的VIP地址也可以訪問到主服務器的nginx的默認頁面。
1.5 主從切換
1、nginx
關閉主節(jié)點上的nginx服務,觀察主節(jié)點的nginx是否會被自動重啟。如果重啟則說明chk_nginx腳本執(zhí)行成功,如果nginx未能重啟,則應當執(zhí)行腳本中的命令關閉keepalived服務。
2、keepalived
關閉主節(jié)點的keepalived服務,觀察vip是否會綁定到從服務器上。
重啟主節(jié)點的keepalived服務,觀察vip是否會綁定到主服務器上。
2、互為主從模式
這種方案,使用兩個VIP地址,互為主備,輪詢請求兩個VIP地址,同時有兩臺機器工作,當其中一臺機器出現(xiàn)故障,兩臺機器的請求轉移到一臺機器負擔,非常適合于生產(chǎn)架構環(huán)境。
2.1 服務器規(guī)劃
角色 | ip | vip地址 | 部署服務 |
---|---|---|---|
主、從節(jié)點 | 10.50.7.51 | 10.50.7.100 | Keepalived+Nginx |
從、主節(jié)點 | 10.50.7.76 | 10.50.7.101 | Keepalived+Nginx |
2.2 服務配置
2.2.1 keepalived配置
? 在雙主模式中,大致內(nèi)容與主從模式一樣,需要額外添加以下內(nèi)容,新增一個新的vrrp_instance配置,state 為主從配置相反的角色,如下:
注:chk_nginx.sh腳本在1.2.1 keepalived配置的第三個
1、主節(jié)點keepalived.conf 配置如下:
! Configuration File for keepalivedglobal_defs {#路由id:當前安裝keepalived節(jié)點主機的標識符,全局唯一router_id keep_51}# 定義chk_nginx腳本,腳本執(zhí)行間隔10秒,權重-10,檢測nginx服務是否在運行。vrrp_script chk_nginx { #這里通過腳本監(jiān)測 script "/etc/keepalived/chk_nginx.sh" #腳本執(zhí)行間隔,每2s檢測一次interval 2 #腳本結果導致的優(yōu)先級變更,檢測失敗(腳本返回非0)則優(yōu)先級 -5 weight -10 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間) fall 2 #檢測1次成功就算成功。但不修改優(yōu)先級 rise 1 }vrrp_instance VI_1 {# 表示的狀態(tài),當前服務器為nginx的主節(jié)點,MASTER/BACKUPstate MASTER# 當前實例綁定的網(wǎng)卡 可通過ip addr查詢interface ens18# 保證主備節(jié)點一致virtual_router_id 100# 優(yōu)先級/權重,誰的優(yōu)先級高,在MASTER掛掉以后,就能成為MASTERpriority 100# 主備之間同步檢查的時間間隔,默認1sadvert_int 1# 認證授權的密碼,防止非法節(jié)點的進入authentication {auth_type PASSauth_pass 1111}# 虛擬出來的VIP地址virtual_ipaddress {10.50.7.100}#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!!track_script { #引用VRRP腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換。 chk_nginx }}vrrp_instance VI_2 {# 表示的狀態(tài),當前服務器為nginx的主節(jié)點,MASTER/BACKUPstate BACKUP# 當前實例綁定的網(wǎng)卡 可通過ip addr查詢interface ens18# 保證主備節(jié)點一致virtual_router_id 101# 優(yōu)先級/權重,誰的優(yōu)先級高,在MASTER掛掉以后,就能成為MASTERpriority 99# 主備之間同步檢查的時間間隔,默認1sadvert_int 1# 認證授權的密碼,防止非法節(jié)點的進入authentication {auth_type PASSauth_pass 1111}# 虛擬出來的VIP地址virtual_ipaddress {10.50.7.101}#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!!track_script { #引用VRRP腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換。 chk_nginx }}
2、從節(jié)點keepalived.conf 配置如下:
! Configuration File for keepalivedglobal_defs {router_id 76
}# 定義chk_nginx腳本,腳本執(zhí)行間隔10秒,權重-10,檢測nginx服務是否在運行。
vrrp_script chk_nginx { #這里通過腳本監(jiān)測 script "/etc/keepalived/chk_nginx.sh" #腳本執(zhí)行間隔,每2s檢測一次interval 2 #腳本結果導致的優(yōu)先級變更,檢測失敗(腳本返回非0)則優(yōu)先級 -5 weight -10 #檢測連續(xù)2次失敗才算確定是真失敗。會用weight減少優(yōu)先級(1-255之間) fall 2 #檢測1次成功就算成功。但不修改優(yōu)先級 rise 1
}vrrp_instance VI_1 {state BACKUPinterface ens18virtual_router_id 100priority 99advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.50.7.100}#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!!track_script { #引用VRRP腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換。 chk_nginx }
}vrrp_instance VI_2 {state MASTERinterface ens18virtual_router_id 101priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.50.7.101}#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!!track_script { #引用VRRP腳本,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換。 chk_nginx }
}
2.3 啟動或重啟服務
分別啟動兩個服務器的nginx服務和keepalived服務,命令如下:
/home/chnsys/ecms/nginx/sbin/nginx(看具體的安裝位置)
systemctl restart keepalived (全局生效)
2.4 驗證效果
分別訪問主服務器和從服務器的虛擬vip的nginx服務的默認頁面地址:
可以看到兩個服務器互為主從的效果
2.5 主從切換
同上述1.5中效果驗證即可
三、實現(xiàn)網(wǎng)關集群
本文通過兩種方案實現(xiàn) Keepalived+Nginx 的高可用集群。還有一些其他的特性功能,例如主備節(jié)點切換后郵件通知等也只需修改相關配置即可,本文主要實現(xiàn)主備切換的功能就不在此贅述。
一般來講會再通過nginx來路由請求后臺網(wǎng)關服務,網(wǎng)關服務同樣需要集群來解決單點故障問題,可以利用nginx的特性來反向代理網(wǎng)關集群:
1、nginx.conf配置
upstream niginx-http-cluster{server 10.50.7.51:8080;server 10.50.7.76:8080;
}server {listen 8080;server_name localhost;location / {proxy_redirect off;proxy_set_header Host $host;proxy_set_header Origin '';proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://niginx-http-cluster/hello/;}
}
按照上述配置之后,nginx會輪詢訪問兩個網(wǎng)關服務的地址,當其中一個服務掛掉之后,就會自動切換到正常的服務,從而實現(xiàn)網(wǎng)關服務集群。