keepalived+nginx實現(xiàn)雙服務器主備方案
一、keepalived + nginx 主備方案
1. 架構(gòu)圖
服務器為CentOS 7系統(tǒng)
2. nginx 部署
兩臺服務器應用同樣的配置,僅HTML文件不一樣。
2.1 服務器環(huán)境初始化
(1)時間同步
# 安裝時間同步工具ntpdata yum -y install ntp ntpdate # 同步網(wǎng)絡時間 ntpdate cn.pool.ntp.org
(2)創(chuàng)建一個cron任務,設置每天同步服務器時間
# 打開cron作業(yè)任務列表的編輯器 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 # 兩種防火墻,個人比較習慣使用iptables,后面做策略也是使用iptables;沒有的話可以安裝一個; yum install iptables-services #安裝這個比較方便管理。
或者,設置開放訪問端口號
# 查看開放的端口號 firewall-cmd --list-all # 設置開放的端口號 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)驗證
瀏覽器頁面輸入自己的服務器地址出現(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
所有的服務器部署方法相同
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 配置文件解析
- 需要設置一個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服務器地址(郵箱服務器地址) smtp_connect_timeout 30 #超時時間 router_id NGINX # 路由器標識,一般不用改,也可改成應用名,主從服務器要一致 } #一個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 #當前使用的網(wǎng)卡名 virtual_router_id 51 #虛擬路由id號 priority 100 #當前服務器優(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服務 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ā),當轉(zhuǎn)發(fā)不成功時,才會選擇走root字段下的目錄和html # root /usr/local/nginx/html; # index index.html index.php index.htm; } # ... ... } # 這個60086端口,目前沒有服務,訪問是被拒絕的!
保存退出
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 塊就相當于一個虛擬主機。
- 而每個 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 服務器找到標識 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/
當中。
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é)果分配,這樣每個訪客固定訪問一個后端服務器。
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(第三方):按后端服務器的響應時間來分配請求,響應時間短的優(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)頁面物理分離。嚴格意義上說應該是動態(tài)請求跟靜態(tài)請求分開,可以理解成使用 Nginx 處理靜態(tài)頁面,Tomcat 處理動態(tài)頁面。動靜分離從目前實現(xiàn)角度來講大致分為兩種:
- 一種是純粹把靜態(tài)文件獨立成單獨的域名,放在獨立的服務器上,也是目前主流推崇的方案;
- 另外一種方法就是動態(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ù),應該是 worker_connections * worker_processes。當然,這里說的是最大連接數(shù),對于 HTTP 請 求 本 地 資 源 來 說 , 能 夠 支 持 的 最 大 并 發(fā) 數(shù) 量 是 worker_connections * worker_processes,如果是支持 http1.1 的瀏覽器每次訪問要占兩個連接,所以普通的靜態(tài)訪 問最大并發(fā)數(shù)是: worker_connections * worker_processes /2,而如果是 HTTP 作 為反向代 理來說,最大并發(fā)數(shù)量應該是 worker_connections * worker_processes/4。因為作為反向代理服務器,每個并發(fā)會建立與客戶端的連接和與后端服 務的連接,會占用兩個連接。
到此這篇關(guān)于keepalived+nginx實現(xiàn)雙服務器主備方案的文章就介紹到這了,更多相關(guān)keepalived nginx雙服務器主備內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx指令add_header和proxy_set_header的區(qū)別及說明
這篇文章主要介紹了Nginx指令add_header和proxy_set_header的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03