keepalived+nginx實(shí)現(xiàn)雙服務(wù)器主備方案
一、keepalived + nginx 主備方案
1. 架構(gòu)圖
服務(wù)器為CentOS 7系統(tǒng)
2. nginx 部署
兩臺(tái)服務(wù)器應(yīng)用同樣的配置,僅HTML文件不一樣。
2.1 服務(wù)器環(huán)境初始化
(1)時(shí)間同步
# 安裝時(shí)間同步工具ntpdata yum -y install ntp ntpdate # 同步網(wǎng)絡(luò)時(shí)間 ntpdate cn.pool.ntp.org
(2)創(chuàng)建一個(gè)cron任務(wù),設(shè)置每天同步服務(wù)器時(shí)間
# 打開cron作業(yè)任務(wù)列表的編輯器 crontab -e # 每天0點(diǎn)同步一次 * 00 * * * /usr/sbin/ntpdate cn.pool.ntp.org
(3)關(guān)閉防火墻
在 windows 系統(tǒng)中訪問 linux 中 nginx,默認(rèn)不能訪問的,因?yàn)榉阑饓栴} (1)關(guān)閉防火墻 (2)開放訪問的端口號(hào).
iptables和firewalld是兩種不同的防火墻,兩個(gè)都關(guān)閉,有哪個(gè)關(guān)哪個(gè)。
systemctl stop iptables systemctl stop firewalld # 兩種防火墻,個(gè)人比較習(xí)慣使用iptables,后面做策略也是使用iptables;沒有的話可以安裝一個(gè); yum install iptables-services #安裝這個(gè)比較方便管理。
或者,設(shè)置開放訪問端口號(hào)
# 查看開放的端口號(hào) firewall-cmd --list-all # 設(shè)置開放的端口號(hào) 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來解析正則表達(dá)式,需要在linux上安裝
pcre
庫 - nginx使用zlib對(duì)http包的內(nèi)容進(jìn)行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)建一個(gè)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 # 進(jìn)入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
- 如果可以正常啟動(dòng),正常訪問頁面的話可以忽略此步驟
# root html; 改成自己的路徑 /usr/local/nginx/html; # index 后面加一個(gè) index.php 否則無法顯示網(wǎng)頁內(nèi)容,報(bào)403錯(cuò)誤的。 location / { root /usr/local/nginx/html; index index.html index.php index.htm,;
- 關(guān)閉顯示nginx版本號(hào)(此內(nèi)容在http模塊下找個(gè)地方寫)
server_tokens off;
(5)校驗(yàn)配置文件是否正確
/usr/local/nginx/sbin/nginx -t # 看到如下顯示代表正常: # nginx.conf syntax is ok # nginx.conf test is successful
(6)啟動(dòng)nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 重新加載配置命令: /usr/local/nginx/sbin/nginx -s reload
(7)驗(yàn)證
瀏覽器頁面輸入自己的服務(wù)器地址出現(xiàn)nginx字樣的網(wǎng)頁,表示安裝成功:
(8)修改環(huán)境變量
添加環(huán)境變量,使nginx在任意目錄都可以執(zhí)行啟動(dòng)操作;
# 編輯/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è)置一個(gè)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 #超時(shí)時(shí)間 router_id NGINX # 路由器標(biāo)識(shí),一般不用改,也可改成應(yīng)用名,主從服務(wù)器要一致 } #一個(gè)vrrp_instance就是定義一個(gè)虛擬路由器的,實(shí)例名稱 vrrp_script check_nginx { #腳本模塊 script "/etc/keepalived/check_nginx.sh" #腳本模塊 interval 2 #每2秒鐘檢測(cè)一次腳本 #weight 10 #優(yōu)先級(jí) } vrrp_instance VI_1 { state MASTER # 定義初始狀態(tài),可以是MASTER或者BACKUP interface eth0 #當(dāng)前使用的網(wǎng)卡名 virtual_router_id 51 #虛擬路由id號(hào) priority 100 #當(dāng)前服務(wù)器優(yōu)先級(jí),數(shù)字越大越優(yōu)先 advert_int 1 #檢測(cè)心跳時(shí)間為1秒 authentication { #身份驗(yàn)證方式通信認(rèn)證機(jī)制,這里是明文認(rèn)證還有一種是加密認(rèn)證 auth_type PASS #密碼驗(yàn)證 auth_pass 1111 #密碼為1111 ## 如果使用加密認(rèn)證(所有節(jié)點(diǎn)必須一致) # auth_type AH # auth_pass <key> # 通常為一個(gè)長度為8或者16的字符串 } virtual_ipaddress { 192.168.10.100 #VIP地址 } track_script{ #添加監(jiān)控條件 check_nginx #腳本模塊后邊定義的名稱 } }
3.2 監(jiān)控nginx狀態(tài)
新建一個(gè)腳本文件,并打開
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、如果不存活則嘗試啟動(dòng) Nginx /usr/local/nginx/sbin/nginx sleep 5 #3、等待 5 秒后再次獲取一次 Nginx 狀態(tài) counter=`ps -C nginx --no-header | wc -l` #4、再次進(jìn)行判斷,如 Nginx 還不存活則停止 Keepalived,讓地址進(jìn)行漂移 if [ $counter -eq 0 ]; then systemctl stop keepalived #停用keepalived服務(wù) fi fi
注意,這里的重啟nginx命令/usr/local/nginx/sbin/nginx
被注釋掉,測(cè)試時(shí)關(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 { #這個(gè)地方名字不能亂改,系統(tǒng)不認(rèn)識(shí), script "/etc/keepalived/check_nginx.sh" interval 2 #每2秒鐘檢測(cè)一次腳本 } 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)命令
啟動(dòng):systemctl start keepalived
重啟:systemctl restart keepalived
動(dòng)態(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 / { # 請(qǐng)求頭轉(zhuǎn)發(fā) proxy_set_header Host $host; # 獲得真實(shí)ip proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 轉(zhuǎn)發(fā)到目標(biāo)地址 proxy_pass http://192.168.0.100:60080; # 還可以寫root和index字段,只不過端口默認(rèn)優(yōu)先轉(zhuǎn)發(fā),當(dāng)轉(zhuǎn)發(fā)不成功時(shí),才會(huì)選擇走root字段下的目錄和html # root /usr/local/nginx/html; # index index.html index.php index.htm; } # ... ... } # 這個(gè)60086端口,目前沒有服務(wù),訪問是被拒絕的!
保存退出
nginx -s reload; # 輸入vip地址訪問 192.168.248.10:19180
1.2 分離nginx中的server模塊為單獨(dú)的文件
# 在nginx配置的最后一個(gè)中括號(hào)上方添加如下命令 include /usr/local/nginx/conf/conf.d/*.conf;
另外在conf.d文件夾下新建conf文件,單獨(dú)編寫server模塊。
到這里配置就告一段落了,后面算是補(bǔ)充的 nginx 配置
2. nginx 多端口轉(zhuǎn)發(fā)
2.1 配置文件
- 每個(gè) http 塊可以包括多個(gè) server 塊,而每個(gè) server 塊就相當(dāng)于一個(gè)虛擬主機(jī)。
- 而每個(gè) server 塊也分為全局 server 塊,以及可以同時(shí)包含多個(gè) 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ī)則
- = :用于不含正則表達(dá)式的 uri 前,要求請(qǐng)求字符串與 uri 嚴(yán)格匹配,如果匹配 成功,就停止繼續(xù)向下搜索并立即處理該請(qǐng)求。
- ~:用于表示 uri 包含正則表達(dá)式,并且區(qū)分大小寫。
- ~*:用于表示 uri 包含正則表達(dá)式,并且不區(qū)分大小寫。
- ^~:用于不含正則表達(dá)式的 uri 前,要求 Nginx 服務(wù)器找到標(biāo)識(shí) uri 和請(qǐng)求字 符串匹配度最高的 location 后,立即使用此 location 處理請(qǐng)求,而不再使用 location 塊中的正則 uri 和請(qǐng)求字符串做匹配。
2.3 實(shí)現(xiàn)效果
- 如果請(qǐng)求
208.208.128.122:8001/vod/
,就會(huì)自動(dòng)跳轉(zhuǎn)到127.0.0.1:8081
- 如果請(qǐng)求
208.208.128.122:8001/edu/
,就會(huì)自動(dòng)跳轉(zhuǎn)到127.0.0.1:8082
四、nginx 負(fù)載均衡
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 實(shí)現(xiàn)效果
- 請(qǐng)求
208.208.128.122:80/edu/
,負(fù)載均衡平均到127.0.0.1:8081/edu/
和127.0.0.1:8082/edu/
當(dāng)中。
2. 修改負(fù)載均衡分配策略
- 輪詢(默認(rèn)):按時(shí)間順序逐一分配,如果down掉,自動(dòng)剔除
- weight:默認(rèn)為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:每個(gè)請(qǐng)求按訪問 ip 的 hash 結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(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)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短的優(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. 動(dòng)靜分離
Nginx 動(dòng)靜分離簡(jiǎn)單來說就是把動(dòng)態(tài)跟靜態(tài)請(qǐng)求分開,不能理解成只是單純的把動(dòng)態(tài)頁面和 靜態(tài)頁面物理分離。嚴(yán)格意義上說應(yīng)該是動(dòng)態(tài)請(qǐng)求跟靜態(tài)請(qǐng)求分開,可以理解成使用 Nginx 處理靜態(tài)頁面,Tomcat 處理動(dòng)態(tài)頁面。動(dòng)靜分離從目前實(shí)現(xiàn)角度來講大致分為兩種:
- 一種是純粹把靜態(tài)文件獨(dú)立成單獨(dú)的域名,放在獨(dú)立的服務(wù)器上,也是目前主流推崇的方案;
- 另外一種方法就是動(dòng)態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過 nginx 來分開。
2. 高可用集群
keepalived + nginx 模式
3. 其他
- master-worker架構(gòu),只能有一個(gè)master,其他worker通過爭(zhēng)搶獲取請(qǐng)求。
- worker數(shù)和CPU數(shù)相等最為適宜。
- 發(fā)送請(qǐng)求,占用了worker的幾個(gè)連接數(shù):2~4個(gè)
- 普通靜態(tài)訪問最大并發(fā)數(shù)是:
worker_connections * worker_processes / 2
- HTTP做反向代理,最大并發(fā)數(shù)
worker_connections * worder_processes / 4
這個(gè)值是表示每個(gè) worker 進(jìn)程所能建立連接的最大值,所以,一個(gè) nginx 能建立的最大連接 數(shù),應(yīng)該是 worker_connections * worker_processes。當(dāng)然,這里說的是最大連接數(shù),對(duì)于 HTTP 請(qǐng) 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 并 發(fā) 數(shù) 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要占兩個(gè)連接,所以普通的靜態(tài)訪 問最大并發(fā)數(shù)是: worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代 理來說,最大并發(fā)數(shù)量應(yīng)該是 worker_connections * worker_processes/4。因?yàn)樽鳛榉聪虼矸?wù)器,每個(gè)并發(fā)會(huì)建立與客戶端的連接和與后端服 務(wù)的連接,會(huì)占用兩個(gè)連接。
到此這篇關(guān)于keepalived+nginx實(shí)現(xiàn)雙服務(wù)器主備方案的文章就介紹到這了,更多相關(guān)keepalived nginx雙服務(wù)器主備內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows下快速安裝nginx并配置開機(jī)自啟動(dòng)的方法
這篇文章主要介紹了windows下快速安裝nginx 并配置開機(jī)自啟動(dòng)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05nginx負(fù)載均衡配置,宕機(jī)自動(dòng)切換方式
這篇文章主要介紹了nginx負(fù)載均衡配置,宕機(jī)自動(dòng)切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05三步配置輕量級(jí)服務(wù)器nginx小結(jié)
Nginx是一個(gè)安裝非常的簡(jiǎn)單 , 配置文件非常簡(jiǎn)潔,本文就來介紹一下三步配置輕量級(jí)服務(wù)器nginx,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08nginx 負(fù)載均衡 多站點(diǎn)共享Session
這里我們就 演練一下 以數(shù)據(jù)庫的形來存儲(chǔ)Session,來實(shí)現(xiàn)多站點(diǎn)共享Session2012-11-11Nginx指令add_header和proxy_set_header的區(qū)別及說明
這篇文章主要介紹了Nginx指令add_header和proxy_set_header的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03