Nginx反向代理實現負載均衡+Keepalive實現高可用

目錄

實現負載均衡

實現高可用


實現負載均衡

Nginx的幾種負載均衡算法:

  • 1.輪詢(默認) 每個請求按照時間順序逐一分配到下游的服務節點,如果其中某一節點故障,nginx 會自動剔除故障系統使用戶使用不受影響。

  • 2.權重(weight) 在配置文件中對下游的服務節點指定權重值 weight, weight 值越大則被分配的評率越高,一般這種負載均衡,用于節點的配置情況不一樣,有的可能配置高,有的配置低。

  • 3.ip_hash 對每個請求,針對 ip 進行 hash, 然后分配到后臺節點,這樣一來,同一 ip 會被固定分配到下游固定服務上。它能夠暫時的解決集群環境中容器之間 session 共享的問題(因為session每次只能和一個人,一對一的記錄,但是如果現在需要負載均衡就出現了一種一對多的情況,可以使用ip_hash實現一對一),但是不是解決的根本之道,只是權宜之策,我們試想,如果訪問的好好的,家里的路由器被重啟了,或者運營商分配給你的 ip 地址改變了,那么你再次訪問的時候,新的 ip 就可能被分配到新的服務上,之前的 session 也就失效了。

  • 4.least_conn (最少連接調度算法) 最少連接調度算法,對下游服務中連接情況,優先選擇連接數最少的服務分配。

  • 5.least_time (最小響應時間) 最小響應時間, 計算節點平均響應時間,然后取響應最快的那個,分配更高權重。

(1)首先我們一共需要三個主機

后端的兩個主機用于apache服務:

window10:192.168.159.165kail:192.168.159.151

負載均衡設備nginx:

centos1:192.168.159.200

(2)配置window10

開啟apache服務

新建一個網頁并且編輯內容:

新建的網頁:www/index.html
內容:
Hello My Ip add 192.168.159.165

訪問結果

(2)配置kail

開啟apache服務

新建一個網頁并且編輯內容:

網頁地址:/var/html/index.html
網頁內容:
Hello My Ip add 192.168.159.165

訪問結果

(3)nginx設備配置

進入 /etc/nginx/nginx.conf

vim /etc/nginx/nginx.conf

配置負載均衡:

upstream nginx_boot{
# 30s內檢查心跳發送兩次包,未回復就代表該機器宕機,請求分發權重比為1:2   
server 192.168.159.151 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.165 weight=100 max_fails=2 fail_timeout=30s;
# 這里的IP請配置成你WEB服務所在的機器IP
}
server {location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 請求交給名為nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

現在可以嘗試訪問:

第一次:

第二次:

不斷地嘗試可以發現:始終是訪問一次165然后再一次151,成功的實現了負載均衡!!!,并且權重和我們設置的也是一樣的,當然也可以手動的修改權重

也可以將負載均衡的方式修改為輪詢或者上面介紹的其他方式。

實現高可用

線上如果采用單個節點的方式部署Nginx,難免會出現天災人禍,比如系統異常、程序宕機、服務器斷電、機房爆炸、地球毀滅….哈哈哈,夸張了。但實際生產環境中確實存在隱患問題,由于Nginx作為整個系統的網關層接入外部流量,所以一旦Nginx宕機,最終就會導致整個系統不可用,這無疑對于用戶的體驗感是極差的,因此也得保障Nginx高可用的特性。

接下來則會通過keepalived的VIP機制,實現Nginx的高可用。 VIP并不是只會員的意思,而是指Virtual IP,即虛擬IP。

keepalived在之前單體架構開發時,是一個用的較為頻繁的高可用技術,比如MySQL、Redis、MQ、Proxy、Tomcat等各處都會通過keepalived提供的VIP機制,實現單節點應用的高可用。

上面那個實驗完成了,但是現在實現了負載均衡但是并沒有實現高可用問題

需要實現高可用,那就需要增加一臺nginx服務器

這里使用192.168.159.201當做另外一臺nginx服務器

實現原理:(類似于VRRP)

  1. 需要在200和201這兩臺設備上都安裝keepalive+nginx的環境

  2. keepLive虛擬出一個VIP

  3. 瀏覽器通過訪問這個VIP來實現高可用

這里以192.168.159.200這臺設備為了,下面是具體的過程:

(1)首先配置keepalive

//獲取軟件包
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
//解壓
tar -zxvf keepalived-2.2.4.tar.gz
//進入該目錄中后進行預編譯
./configure
//編譯
make/make install

(2)添加配置文件

vi keepalived.conf

bal_defs { ?# 自帶的郵件提醒服務,建議用獨立的監控或第三方SMTP,也可選擇配置郵件發送。notification_email { ?root@localhost ?} ?notification_email_from root@localhost ?smtp_server localhost ?smtp_connect_timeout 30 ?# 高可用集群主機身份標識(集群中主機身份標識名稱不能重復,建議配置成本機IP) ?router_id 192.168.159.200
} ?# 定時運行的腳本文件配置 ?
vrrp_script check_nginx_pid_restart { ?# 之前編寫的nginx重啟腳本的所在位置 ?script "/soft/scripts/keepalived/check_nginx_pid_restart.sh" ? # 每間隔3秒執行一次 ?interval 3 ?# 如果腳本中的條件成立,重啟一次則權重-20 ?weight -20 ?
} ?# 定義虛擬路由,VI_1為虛擬路由的標示符(可自定義名稱) ?
vrrp_instance VI_1 { ?# 當前節點的身份標識:用來決定主從(MASTER為主機,BACKUP為從機) ?state MASTER ?# 綁定虛擬IP的網絡接口,根據自己的機器的網卡配置 ?interface ens33 ? # 虛擬路由的ID號,主從兩個節點設置必須一樣 ?virtual_router_id 250 # 填寫本機IP ?mcast_src_ip 192.168.159.200 ?# 節點權重優先級,主節點要比從節點優先級高 ?priority 100 ?# 優先級高的設置nopreempt,解決異常恢復后再次搶占造成的腦裂問題 ?nopreempt ?# 組播信息發送間隔,兩個節點設置必須一樣,默認1s(類似于心跳檢測) ?advert_int 1 ?authentication { ?auth_type PASS ?auth_pass 1111 ?} ?# 將track_script塊加入instance配置塊 ?track_script { ?# 執行Nginx監控的腳本 ?check_nginx_pid_restart ?} ?virtual_ipaddress { ?# 虛擬IP(VIP),也可擴展,可配置多個。192.168.159.250 ?} ?
}

(7)編寫腳本

vim check_nginx_pid_restart.sh

//腳本內容:
#!/bin/sh ?
# 通過ps指令查詢后臺的nginx進程數,并將其保存在變量nginx_number中 ?
nginx_number=`ps -C nginx --no-header | wc -l` ?
# 判斷后臺是否還有Nginx進程在運行 ?
if [ $nginx_number -eq 0 ];then ?# 如果后臺查詢不到`Nginx`進程存在,則執行重啟指令 ?/soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf ?# 重啟后等待1s后,再次查詢后臺進程數 ?sleep 1 ?# 如果重啟后依舊無法查詢到nginx進程 ?if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then ?# 將keepalived主機下線,將虛擬IP漂移給從機,從機上線接管Nginx服務 ?systemctl stop keepalived.service ?fi ?
fi

(8)為該腳本授權

chmod +x check_nginx_pid_restart.sh

(9)將一些文件拷貝到/etc下

mkdir /etc/keepalived
cp keepalived.conf /etc/keepalived/
cd /root/keepalived/keepalived/etc/init.d
cp keepalived /etc/init.d/
cd ../sysconfig
cp keepalived /etc/sysconfig/

(10)修改配置文件

vim /etc/keepalived/keeplive.conf
//修改后:
bal_defs { ?# 自帶的郵件提醒服務,建議用獨立的監控或第三方SMTP,也可選擇配置郵件發送。notification_email { ?root@localhost ?} ?notification_email_from root@localhost ?smtp_server localhost ?smtp_connect_timeout 30 ?# 高可用集群主機身份標識(集群中主機身份標識名稱不能重復,建議配置成本機IP) ?router_id 192.168.159.200
} ?# 定時運行的腳本文件配置 ?
vrrp_script check_nginx_pid_restart { ?# 之前編寫的nginx重啟腳本的所在位置 ?script "/root//keepalived/keepalived/etc/keepalived/check_nginx_pid_restart.sh" ? # 每間隔3秒執行一次 ?interval 3 ?# 如果腳本中的條件成立,重啟一次則權重-20 ?weight -20 ?
} ?# 定義虛擬路由,VI_1為虛擬路由的標示符(可自定義名稱) ?
vrrp_instance VI_1 { ?# 當前節點的身份標識:用來決定主從(MASTER為主機,BACKUP為從機) ?state MASTER ?# 綁定虛擬IP的網絡接口,根據自己的機器的網卡配置 ?interface ens33 ? # 虛擬路由的ID號,主從兩個節點設置必須一樣 ?virtual_router_id 250 # 填寫本機IP ?mcast_src_ip 192.168.159.200 ?# 節點權重優先級,主節點要比從節點優先級高 ?priority 100 ?# 優先級高的設置nopreempt,解決異常恢復后再次搶占造成的腦裂問題 ?nopreempt ?# 組播信息發送間隔,兩個節點設置必須一樣,默認1s(類似于心跳檢測) ?advert_int 1 ?authentication { ?auth_type PASS ?auth_pass 1111 ?} ?# 將track_script塊加入instance配置塊 ?track_script { ?# 執行Nginx監控的腳本 ?check_nginx_pid_restart ?} ?virtual_ipaddress { ?# 虛擬IP(VIP),也可擴展,可配置多個。192.168.159.250 ?} ?
}

(11)設置開機自啟

[root@centos111 keepalived]# chkconfig keepalived on
[root@centos111 keepalived]# systemctl daemon-reload
[root@centos111 keepalived]# systemctl start keepalived.service 
[root@centos111 keepalived]# systemctl enable keepalived.service 

(12)備服務器配置(201)--大致流程與200相同

這里就不詳細演示了

注:從上圖中可以明顯看見虛擬IP已經成功掛載,但另外一臺機器192.168.12.250并不會掛載這個虛擬IP,只有當主機下線后,作為從機的192.168.12.130才會上線,接替VIP。

(13)測試

使用kail (192.168.159.151) ping 虛擬ip(192.168.159.250)、

可以看到成功的ping通了

現在嘗試關閉192.168.159.200服務器

nmcli con down ens33

然后再打開該服務器

nmcli con up ens33

查看192.168.159.201服務器

可以發現192.168.159.250這個虛擬ip已經轉到備服務器(192.168.159.201)這里了!

到此Nginx的負載均衡和高可用實驗都全部完成!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163979.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163979.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163979.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

主播產品塑造話術

產品賣點 一、品質卓越 我們的產品始終堅持高品質的標準,從原材料的選擇到生產工藝的把控,每一個環節都經過嚴格的品質檢測。我們注重產品的耐用性和穩定性,確保您在使用過程中無需擔心質量問題。 二、功能強大 我們的產品不僅具備基本的…

人人吐槽互聯網行情不好?但這個崗位的需求猛增、瘋狂招人!

在目前的大環境下,外部力量對國內國高科技領域的打壓和封鎖,國內的IT大廠紛紛進行了裁員,IT行業的龍頭大廠裁員舉措引發行業震動…… 可真的是這樣嗎?中國IT沒前途了?在IT行業找不到工作了?非也非也,這只…

1-docker安裝和配置、虛擬化、配置國內源、鏡像操作、容器基本操作(run運行容器、-v目錄映射、-p端口映射、容器其他操作)

1 docker和虛擬化 2 docker安裝和配置 2.0 docker 中的一些概念 2.1 配置國內源(不配也可以,只是會從國外倉庫下載) 3 鏡像操作 4 容器操作 4.1 容器基本操作 4.2 run運行容器 4.3 -v目錄映射 4.4 -p端口映射 4.5 容器其他操作 1 docker和虛…

干貨分享:好用的兩款封面制作工具

無論你是圖文博主還是視頻博主,做封面都是必不可少的。關于做封面的產品,我推薦兩個:如果你使用手機,我推薦使用醒圖;如果你使用電腦,我則推薦稿定設計。 01 醒圖 為什么醒圖如此出色呢? 首先…

什么是steam搬磚中的散戶、倒爺和倒狗?三者有什么區別?

steam/csgo游戲搬磚之如何注冊 csgo飾品市場有三種人:散戶,倒爺和倒狗。 散戶:定義和股票市場中的定義是一樣的,擁有同類型飾品數量占存世數量比例較小的人。 倒爺:擁有同類型飾品較多,但是不影響市場平衡…

能否在一臺電腦上安全地登錄多個Facebook賬號?

Facebook是一個流量大、用戶多的平臺,許多人可能需要在一臺設備上管理多個Facebook賬號,無論是出于個人或職業需求,都能帶來極大地便利。然而,保持每個賬號的安全性和隱私性卻是一個挑戰。本文將介紹如何在一臺電腦上安全地登錄多…

如何使用cp命令復制文件和目錄!【Linux命令合集】

如何使用cp命令復制文件和目錄!【Linux命令合集】 Linux命令 只要你使用Linux,你就會一直使用cp命令。用于復制文件和目錄。 常用組合鍵: # -r:復制整個目錄(遞歸) # -p:保留原始文件所有者、組、權限和時間戳 cp -rp foldA fold…

【Linux】:消息隊列和信號量

消息隊列和信號量 一.消息隊列1.原理2.消息隊列的各種接口1.創建消息隊列2.釋放消息隊列3.發送和接收信息 二.信號1.概念2.各種接口1.創建信號量2.銷毀信號量3.對信號量進行操作 三.一個現象 一.消息隊列 1.原理 這種消息隊列被稱為system V標準。 可以使用ipcs -q來查詢消息隊…

分頁符 分頁

【插入】---【分頁符】 目錄和一級標題得新起一頁

【React-Router】路由快速上手

1. 創建路由開發環境 # 使用CRA創建項目 npm create-react-app react-router-pro# 安裝最新的ReactRouter包 npm i react-router-dom2. 快速開始 // index.jsimport React from react; import ReactDOM from react-dom/client; import ./index.css; import App from ./App; i…

QEMU Guest Agent本地提權漏洞處理(CVE-2023-0664)

一、漏洞描述 QEMU Guest Agent(qga)類似于vmware中的 vmtools,相關安全報告顯示它的Windows版本安裝程序存在本地提權高危漏洞(CVE-2023-0664),攻擊者可利用該漏洞進行本地權限提升,獲得SYSTE…

音視頻5、libavformat-1

libavformat庫,是FFmpeg中用于處理各種媒體容器格式(media container format)的庫。它的兩個最主要的功能是 : demuxing:解封裝,將一個媒體文件分割為多個多媒體流 muxing:封裝,將多個多媒體數據流寫入到指定媒體容器格式的文件中 這兩個過程所做的…

智能化學習打破資源障礙 成為英語學習新趨勢

智能化學習是一種基于互聯網和人工智能技術的學習行為,通過網絡,學習者可以隨時隨地進行學習,真正打破了時間和空間的限制。與傳統線下學習方式相比,智能化學習更加方便、資源更加豐富,使海量英語學習資源唾手可得,智能化學習正逐漸成為中國孩子習得英語的重要方式。 隨著全球…

基于python和django旅游管理系統

基于python和django旅游管理系統 摘要 基于Python和Django的旅游管理系統是一個以現代化技術為基礎的系統,旨在提升旅游行業的管理效率和服務水平。該系統以Django框架為核心,結合Python編程語言的靈活性和強大的生態系統,實現了多方面的功能…

vue3之echarts漸變柱狀圖

vue3之echarts漸變柱狀圖 效果&#xff1a; 核心代碼&#xff1a; <template><div class"abnormal"><div class"chart" ref"chartsRef"></div></div> </template><script setup> import * as echa…

新手小白想做跨境電商,應該選第三方平臺還是獨立站?

近幾年在疫情的影響下&#xff0c;電商特有的“免接觸”模式迅速切中消費者的心理痛點&#xff0c;加上國內電商發展已經趨于平緩&#xff0c;很多線下店鋪被迫關閉&#xff0c;這也使得越來越多的大賣和平臺也不約而同布局跨境電商。而說到跨境電商&#xff0c;或許大家普遍想…

論文閱讀:MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model

論文標題&#xff1a; MedSegDiff: Medical Image Segmentation with Diffusion Probabilistic Model 翻譯&#xff1a; MedSegDiff&#xff1a;基于擴散概率模型的醫學圖像分割 名詞解釋&#xff1a; 高頻分量&#xff08;高頻信號&#xff09;對應著圖像變化劇烈的部分&…

視頻剪輯達人分享:高效減片頭時長并調整播放速度的技巧,提升視頻品質

在視頻剪輯的過程中&#xff0c;許多初學者經常會遇到一些問題&#xff0c;如片頭過長、播放速度不適當等&#xff0c;這些問題不僅會影響觀眾的觀看體驗&#xff0c;還會對視頻品質產生負面影響。在調整播放速度時&#xff0c;要根據視頻內容來進行調整。一般來說&#xff0c;…