keepalived+nginx實現(xiàn)雙服務(wù)器主備方案
一、keepalived + nginx 主備方案
1. 架構(gòu)圖
服務(wù)器為CentOS 7系統(tǒng)

2. nginx 部署
兩臺服務(wù)器應(yīng)用同樣的配置,僅HTML文件不一樣。
2.1 服務(wù)器環(huán)境初始化
(1)時間同步
# 安裝時間同步工具ntpdata yum -y install ntp ntpdate # 同步網(wǎng)絡(luò)時間 ntpdate cn.pool.ntp.org
(2)創(chuàng)建一個cron任務(wù),設(shè)置每天同步服務(wù)器時間
# 打開cron作業(yè)任務(wù)列表的編輯器 crontab -e # 每天0點同步一次 * 00 * * * /usr/sbin/ntpdate cn.pool.ntp.org
(3)關(guān)閉防火墻
在 windows 系統(tǒng)中訪問 linux 中 nginx,默認不能訪問的,因為防火墻問題 (1)關(guān)閉防火墻 (2)開放訪問的端口號.
iptables和firewalld是兩種不同的防火墻,兩個都關(guān)閉,有哪個關(guān)哪個。
systemctl stop iptables systemctl stop firewalld # 兩種防火墻,個人比較習(xí)慣使用iptables,后面做策略也是使用iptables;沒有的話可以安裝一個; yum install iptables-services #安裝這個比較方便管理。
或者,設(shè)置開放訪問端口號
# 查看開放的端口號 firewall-cmd --list-all # 設(shè)置開放的端口號 firewall-cmd --add-service=http –permanent firewall-cmd --add-port=80/tcp --permanent # 重啟防火墻 firewall-cmd -reload
2.2 安裝 nginx
(1)安裝依賴包
pcre-8.3.7.tar.gz, openssl-1.0.1t.tar.gz, zlib-1.2.8.tar.gz
- nginx的http模塊使用pcre來解析正則表達式,需要在linux上安裝
pcre庫 - nginx使用zlib對http包的內(nèi)容進行g(shù)zip,需要在linux上安裝安裝
zlib庫 - 安裝
openssl庫,讓 nginx 支持 https(即在ssl協(xié)議上傳輸http)
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
(2)下載并解壓安裝包
# 創(chuàng)建一個nginx文件夾 cd /usr/local mkdir nginx cd nginx # 下載tar包 wget http://nginx.org/download/nginx-1.22.1.tar.gz # 解壓 tar -xvf nginx-1.22.1.tar.gz # 進入nginx-1.22目錄 cd nginx-1.22.1
(2)添加 ssl 證書模塊
./configure --with-http_stub_status_module --with-http_ssl_module
(3)編譯安裝
- -j 4 : 此參數(shù)代表用4核心編譯
make -j 4 && make install
(4)配置 nginx.conf
- 如果可以正常啟動,正常訪問頁面的話可以忽略此步驟
# root html; 改成自己的路徑 /usr/local/nginx/html;
# index 后面加一個 index.php 否則無法顯示網(wǎng)頁內(nèi)容,報403錯誤的。
location / {
root /usr/local/nginx/html;
index index.html index.php index.htm,;
- 關(guān)閉顯示nginx版本號(此內(nèi)容在http模塊下找個地方寫)
server_tokens off;
(5)校驗配置文件是否正確
/usr/local/nginx/sbin/nginx -t # 看到如下顯示代表正常: # nginx.conf syntax is ok # nginx.conf test is successful
(6)啟動nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 重新加載配置命令: /usr/local/nginx/sbin/nginx -s reload
(7)驗證
瀏覽器頁面輸入自己的服務(wù)器地址出現(xiàn)nginx字樣的網(wǎng)頁,表示安裝成功:
(8)修改環(huán)境變量
添加環(huán)境變量,使nginx在任意目錄都可以執(zhí)行啟動操作;
# 編輯/etc/profile文件在最后添加如下命令: vim /etc/profile # 添加命令 PATH=$PATH:/usr/local/nginx/sbin export PAT # 保存退出 :wq # 執(zhí)行生效命令 source /etc/profile
所有的服務(wù)器部署方法相同
3. keepalived 部署
(1)安裝依賴
yum install -y gcc openssl-devel libnl3-devel net-snmp-devel
(2)安裝keepalived
yum install keepalived -y
- 配置文件的位置:
/etc/keepalived/
3.1 主 keepalived 配置文件解析
- 需要設(shè)置一個VIP的地址,作為虛擬IP地址
cd /etc/keepalived/ vim keepalived.conf
# --- ---- keepalived.conf --- ----
! Configuration File for keepalived
# 管理員郵箱(系統(tǒng)故障通知)
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc # 郵件發(fā)件人郵箱
smtp_server 127.0.0.1 # SMTP服務(wù)器地址(郵箱服務(wù)器地址)
smtp_connect_timeout 30 #超時時間
router_id NGINX # 路由器標識,一般不用改,也可改成應(yīng)用名,主從服務(wù)器要一致
}
#一個vrrp_instance就是定義一個虛擬路由器的,實例名稱
vrrp_script check_nginx { #腳本模塊
script "/etc/keepalived/check_nginx.sh" #腳本模塊
interval 2 #每2秒鐘檢測一次腳本
#weight 10 #優(yōu)先級
}
vrrp_instance VI_1 {
state MASTER # 定義初始狀態(tài),可以是MASTER或者BACKUP
interface eth0 #當(dāng)前使用的網(wǎng)卡名
virtual_router_id 51 #虛擬路由id號
priority 100 #當(dāng)前服務(wù)器優(yōu)先級,數(shù)字越大越優(yōu)先
advert_int 1 #檢測心跳時間為1秒
authentication { #身份驗證方式通信認證機制,這里是明文認證還有一種是加密認證
auth_type PASS #密碼驗證
auth_pass 1111 #密碼為1111
## 如果使用加密認證(所有節(jié)點必須一致)
# auth_type AH
# auth_pass <key> # 通常為一個長度為8或者16的字符串
}
virtual_ipaddress {
192.168.10.100 #VIP地址
}
track_script{ #添加監(jiān)控條件
check_nginx #腳本模塊后邊定義的名稱
}
}
3.2 監(jiān)控nginx狀態(tài)
新建一個腳本文件,并打開
vim /etc/keepalived/check_nginx.sh
編寫監(jiān)控腳本
#!/bin/bash #1、判斷 Nginx 是否存活 counter=`ps -C nginx --no-header | wc -l` if [ $counter -eq 0 ]; then #2、如果不存活則嘗試啟動 Nginx /usr/local/nginx/sbin/nginx sleep 5 #3、等待 5 秒后再次獲取一次 Nginx 狀態(tài) counter=`ps -C nginx --no-header | wc -l` #4、再次進行判斷,如 Nginx 還不存活則停止 Keepalived,讓地址進行漂移 if [ $counter -eq 0 ]; then systemctl stop keepalived #停用keepalived服務(wù) fi fi
注意,這里的重啟nginx命令/usr/local/nginx/sbin/nginx被注釋掉,測試時關(guān)閉才能看到效果。
3.3 從 keepalived配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX
}
vrrp_script check_nginx { #這個地方名字不能亂改,系統(tǒng)不認識,
script "/etc/keepalived/check_nginx.sh"
interval 2 #每2秒鐘檢測一次腳本
}
vrrp_instance VI_1 {
state BACKUP #改這里
interface eth0
virtual_router_id 51
priority 80 #改這里
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.28.127.100
}
track_script {
check_nginx
}
}
keepalived相關(guān)命令
啟動:systemctl start keepalived
重啟:systemctl restart keepalived
動態(tài)持續(xù)查看日志:tail -f /var/log/messages
二、nginx 端口轉(zhuǎn)發(fā)/反向代理
1. nginx 端口轉(zhuǎn)發(fā)
1.1 修改nginx.conf
server {
listen 19100; # 監(jiān)聽19180端口
server_name 192.168.248.10;
location / {
# 請求頭轉(zhuǎn)發(fā)
proxy_set_header Host $host;
# 獲得真實ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 轉(zhuǎn)發(fā)到目標地址
proxy_pass http://192.168.0.100:60080;
# 還可以寫root和index字段,只不過端口默認優(yōu)先轉(zhuǎn)發(fā),當(dāng)轉(zhuǎn)發(fā)不成功時,才會選擇走root字段下的目錄和html
# root /usr/local/nginx/html;
# index index.html index.php index.htm;
}
# ... ...
}
# 這個60086端口,目前沒有服務(wù),訪問是被拒絕的!
保存退出
nginx -s reload; # 輸入vip地址訪問 192.168.248.10:19180
1.2 分離nginx中的server模塊為單獨的文件
# 在nginx配置的最后一個中括號上方添加如下命令 include /usr/local/nginx/conf/conf.d/*.conf;
另外在conf.d文件夾下新建conf文件,單獨編寫server模塊。
到這里配置就告一段落了,后面算是補充的 nginx 配置
2. nginx 多端口轉(zhuǎn)發(fā)
2.1 配置文件
- 每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當(dāng)于一個虛擬主機。
- 而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
server {
listen 8001;
server_name 208.208.128.122;
location ~/vod/ {
proxy_pass http://127.0.0.1:8081;
}
location ~/edu/ {
proxy_pass http://127.0.0.1:8082;
}
}
2.1 匹配規(guī)則
- = :用于不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配 成功,就停止繼續(xù)向下搜索并立即處理該請求。
- ~:用于表示 uri 包含正則表達式,并且區(qū)分大小寫。
- ~*:用于表示 uri 包含正則表達式,并且不區(qū)分大小寫。
- ^~:用于不含正則表達式的 uri 前,要求 Nginx 服務(wù)器找到標識 uri 和請求字 符串匹配度最高的 location 后,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。
2.3 實現(xiàn)效果
- 如果請求
208.208.128.122:8001/vod/,就會自動跳轉(zhuǎn)到127.0.0.1:8081 - 如果請求
208.208.128.122:8001/edu/,就會自動跳轉(zhuǎn)到127.0.0.1:8082
四、nginx 負載均衡
1. 配置說明
1.1 修改 nginx.conf
# 定義myserver結(jié)構(gòu)體
upstream myserver {
server 208.208.128.122:8081;
server 208.208.128.122:8082;
}
server {
listen 80;
server_name 208.208.128.122;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
# 在這里調(diào)用
#proxy_pass http://myserver;
proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
1.2 實現(xiàn)效果
- 請求
208.208.128.122:80/edu/,負載均衡平均到127.0.0.1:8081/edu/和127.0.0.1:8082/edu/當(dāng)中。
2. 修改負載均衡分配策略
- 輪詢(默認):按時間順序逐一分配,如果down掉,自動剔除
- weight:默認為1,權(quán)重越高分配客戶越多。
upstream myserver {
server 208.208.128.122:8081 weight=10; # 在這兒
server 208.208.128.122:8082 weight=10;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
- ip_hash:每個請求按訪問 ip 的 hash 結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器。
upstream myserver {
ip_hash; # 在這兒
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
- fair(第三方):按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。
upstream myserver {
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
fair; # 在這兒
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
五、架構(gòu)
1. 動靜分離

Nginx 動靜分離簡單來說就是把動態(tài)跟靜態(tài)請求分開,不能理解成只是單純的把動態(tài)頁面和 靜態(tài)頁面物理分離。嚴格意義上說應(yīng)該是動態(tài)請求跟靜態(tài)請求分開,可以理解成使用 Nginx 處理靜態(tài)頁面,Tomcat 處理動態(tài)頁面。動靜分離從目前實現(xiàn)角度來講大致分為兩種:
- 一種是純粹把靜態(tài)文件獨立成單獨的域名,放在獨立的服務(wù)器上,也是目前主流推崇的方案;
- 另外一種方法就是動態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過 nginx 來分開。

2. 高可用集群
keepalived + nginx 模式

3. 其他
- master-worker架構(gòu),只能有一個master,其他worker通過爭搶獲取請求。
- worker數(shù)和CPU數(shù)相等最為適宜。
- 發(fā)送請求,占用了worker的幾個連接數(shù):2~4個
- 普通靜態(tài)訪問最大并發(fā)數(shù)是:
worker_connections * worker_processes / 2 - HTTP做反向代理,最大并發(fā)數(shù)
worker_connections * worder_processes / 4
這個值是表示每個 worker 進程所能建立連接的最大值,所以,一個 nginx 能建立的最大連接 數(shù),應(yīng)該是 worker_connections * worker_processes。當(dāng)然,這里說的是最大連接數(shù),對于 HTTP 請 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 并 發(fā) 數(shù) 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要占兩個連接,所以普通的靜態(tài)訪 問最大并發(fā)數(shù)是: worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代 理來說,最大并發(fā)數(shù)量應(yīng)該是 worker_connections * worker_processes/4。因為作為反向代理服務(wù)器,每個并發(fā)會建立與客戶端的連接和與后端服 務(wù)的連接,會占用兩個連接。
到此這篇關(guān)于keepalived+nginx實現(xiàn)雙服務(wù)器主備方案的文章就介紹到這了,更多相關(guān)keepalived nginx雙服務(wù)器主備內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx指令add_header和proxy_set_header的區(qū)別及說明
這篇文章主要介紹了Nginx指令add_header和proxy_set_header的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03

