Nginx 反向代理與負載均衡架構

一、反向代理基礎

實驗目的:通過 Nginx 反向代理,將客戶端請求按類型(靜態頁面 / 動態 PHP 頁面)轉發到不同的后端服務器(RS1 處理靜態資源,RS2 處理動態請求),實現 “客戶端只與代理服務器交互,無需知道后端實際服務器” 的架構,提升服務安全性、可擴展性和資源處理效率。

反向代理的核心價值

反向代理是指 代理服務器接收客戶端所有請求,再根據規則轉發到后端不同服務器,客戶端僅感知代理服務器的存在,對后端服務器的 IP、架構等信息完全透明。其核心作用:

  • 隱藏后端架構:保護后端服務器不直接暴露在公網,降低被攻擊風險;

  • 請求分流:將靜態資源(HTML、圖片等)和動態請求(PHP、JSP 等)分配到不同服務器處理,發揮各自優勢(如靜態服務器可優化緩存,動態服務器專注計算);

  • 擴展性強:后續可輕松添加更多后端服務器(如增加 RS3 處理圖片),只需修改代理配置,無需改動客戶端。

實驗架構與準備

  • 代理服務器:Nginx 所在主機(192.168.67.100),接收客戶端請求并轉發;

  • RS1(后端靜態服務器):192.168.67.10,處理靜態頁面(HTML 等);

  • RS2(后端動態服務器):192.168.67.20,處理動態請求(PHP 等);

  • 本地解析:客戶端(如 Windows)需在 hosts 文件中添加 www.haha.org 到代理服務器 IP(192.168.67.100)的映射,確保通過域名訪問時指向代理服務器。

RS1 配置靜態頁面

echo rs1 - 192.168.67.10 > /usr/share/nginx/html/index.html 
systemctl restart nginx

RS2 配置 php 動態頁面

yum install php -y
mkdir  /usr/share/nginx/html/php/
vim /usr/share/nginx/html/php/index.php
###########
<?phpphpinfo();
?>
########### ? 
systemctl restart nginx

nginx 代理服務器配置代理

vim /usr/local/nginx/conf.d/haha.conf 
##########
server {listen ?80;server_name www.haha.org;
?location / {                                # 規則 1:普通路徑請求(如 /)轉發到 RS1(靜態服務器)proxy_pass http://192.168.67.10;        # 轉發請求到 RS1 的 IP}
?location ~ \.(php|jsp|js)$ {                # 規則 2:.php/.jsp/.js 后綴的動態請求轉發到 RS2(動態服務器)proxy_pass http://192.168.67.20;        # 轉發請求到 RS2 的 IP}
}
##########
systemctl restart nginx

測試:

測試靜態請求轉發:

客戶端訪問 www.haha.org,代理服務器匹配 location /,轉發到 RS1,頁面顯示 “rs1 - 192.168.67.10”,驗證靜態請求正確轉發。

測試動態請求轉發:

客戶端訪問 www.haha.org/php/index.php,代理服務器匹配 ~ .(php)$,轉發到 RS2,頁面顯示 PHP 環境信息(phpinfo() 輸出),驗證動態請求正確轉發。

為什么這樣配置?核心邏輯

  1. 資源分流,提升效率:靜態資源(HTML)無需計算,由 RS1 專注處理;動態資源(PHP)需要解析執行,由 RS2 處理,避免單服務器同時處理兩類請求導致的性能瓶頸。

  2. 隱藏后端,增強安全:客戶端僅知道代理服務器(192.168.67.100),無法直接訪問 RS1/RS2,減少后端服務器被直接攻擊的風險。

  3. 靈活擴展,便于維護:若后續靜態資源增多,可添加 RS3 作為新靜態服務器,只需修改 location / 的 proxy_pass 為負載均衡組(如 http://static_servers);動態服務同理,擴展性極強。

適用場景

反向代理廣泛用于:

  • 大型網站的請求分流(靜態資源 CDN 轉發、動態請求到應用服務器);

  • 負載均衡(多臺后端服務器分擔請求壓力);

  • 安全隔離(代理服務器作為入口,過濾惡意請求后再轉發到后端)。


二、反向代理 - 負載均衡

實驗目的:通過 Nginx 負載均衡功能,將客戶端請求按規則分配到多個后端服務器(RS),實現 “請求分流” 以分擔單服務器壓力;同時配置健康檢查和備用服務器(sorry server),確保后端服務器故障時自動切換,提升服務可用性(避免單點故障導致服務中斷)。

負載均衡的核心價值

在高并發場景下,單臺后端服務器(RS)可能因請求量過大導致響應緩慢或宕機。負載均衡通過 “多服務器協同工作” 解決這一問題:

  • 請求分流:將客戶端請求均勻分配到多臺后端服務器,避免單服務器過載;

  • 高可用:通過健康檢查自動剔除故障服務器,請求僅轉發到正常服務器;

  • 容災備份:當所有主服務器故障時,自動切換到備用服務器(sorry server),避免返回錯誤頁面,提升用戶體驗。

實驗架構與準備

  • 代理服務器:Nginx 所在主機(假設 IP 為代理服務器 IP),負責負載均衡調度;

  • 后端主服務器(RS):

    • RS1:192.168.67.10,提供靜態頁面服務;

    • RS2:192.168.67.20,提供靜態頁面服務;

  • 備用服務器(sorry server):代理服務器本地的 Apache 服務(端口 8888),當所有主服務器故障時提供兜底響應。

RS 主機配置默認訪問頁面。

echo rs1 - 192.168.67.10 > /usr/share/nginx/html/index.html 
systemctl restart nginx

修改 nginx 子配置文件

vim /usr/local/nginx/conf.d/haha.conf 
##########
upstream webserver {server 192.168.67.10:80 weight=1 fail_timeout=15s max_fails=3;      # RS1:權重 1,失敗 3 次后標記為不可用,15 秒后重試檢測server 192.168.67.20:80 weight=1 fail_timeout=15s max_fails=3;server 192.168.67.100:8888 backup;                                  # 備用服務器:僅當所有主服務器故障時啟用,端口 8888
}
server {listen ?80;server_name www.haha.org;
?location / {proxy_pass http://webserver;            # 所有請求轉發到定義的 webserver 服務器組}
}
##########
?
systemctl restart nginx

配置 nginx 代理服務器的 sorry server 功能。運用 apache 服務器,修改端口作為 sorry server。

yum install httpd
vim /etc/httpd/conf/httpd.conf 
########
Listen 8888                     # 修改端口
########
?
echo sorry > /var/www/html/index.html
?
systemctl start httpd
systemctl enable --now httpd
netstat -antlupe | grep http

測試負載均衡效果

  • 正常輪詢:客戶端多次訪問 www.haha.org,頁面會交替顯示 “rs1 - 192.168.67.10” 和 “rs2 - 192.168.67.20”,驗證請求被均勻分配到兩臺主服務器。

  • 故障自動剔除:手動停止 RS1 的 Nginx 服務(systemctl stop nginx),再次訪問時,請求僅轉發到 RS2(頁面穩定顯示 RS2 內容),驗證故障服務器被自動剔除。

  • 備用服務器激活:同時停止 RS1 和 RS2 的服務,訪問時頁面顯示 “sorry”,驗證備用服務器生效,提供兜底響應。

為什么這樣配置?核心設計邏輯

  1. 請求分流,降負載:通過 weight 配置實現請求均勻分配(或按權重分配),避免單服務器因高并發過載,提升整體響應速度。

  2. 健康檢查,保可用:max_fails 和 fail_timeout 確保故障服務器被及時剔除,請求不浪費在無效節點上,減少用戶等待。

  3. 多級備份,防極端:backup 備用服務器解決 “全故障” 場景,將 “服務中斷” 轉化為 “降級可用”,最大限度減少用戶流失。

  4. 靈活擴展,易維護:新增后端服務器時,只需在 upstream 中添加 server 配置,無需修改客戶端或代理入口,擴展性極強。

適用場景

負載均衡廣泛用于:

  • 高并發網站(如電商平臺、資訊門戶),通過多服務器分擔流量;

  • 核心業務系統,通過冗余服務器避免單點故障;

  • 混合架構服務(如部分服務器處理靜態資源,部分處理動態請求)。


三、四層代理 - 負載均衡

實驗目的:通過 Nginx 的 stream 模塊實現四層(傳輸層)負載均衡,針對非 HTTP 協議的服務(如 DNS、MySQL)進行請求分流,將客戶端連接按規則分配到多臺后端服務器,同時通過健康檢查確保服務可用性,適用于數據庫、DNS 等底層服務的負載均衡場景。

核心原理:四層代理與 stream 模塊

四層代理工作在 TCP/UDP 傳輸層,僅根據 “源端口、目標端口、IP 地址” 轉發數據,不解析應用層協議(如 HTTP 頭部、DNS 報文內容),因此適用于所有基于 TCP/UDP 的服務(如 DNS、MySQL、SSH 等)。

Nginx 通過 stream 模塊實現四層代理,功能類似硬件負載均衡器的 “四層轉發”,核心優勢:

  • 通用性:支持所有 TCP/UDP 服務,不受應用層協議限制;

  • 高性能:轉發邏輯簡單(僅處理傳輸層數據),性能接近硬件級;

  • 高可用:結合健康檢查(max_fails、fail_timeout)自動剔除故障節點。

3.1.DNS 負載

實驗背景

DNS 服務是網絡基礎服務,負責將域名解析為 IP 地址,通常使用 UDP 53 端口(普通查詢)和 TCP 53 端口(區域傳輸等)。通過四層代理實現 DNS 負載均衡,可分擔單臺 DNS 服務器的查詢壓力,同時避免單點故障。

RS 安裝 bind 軟件,配置 DNS 服務。

yum install bind -y             # 安裝 BIND(DNS 服務軟件)
?
vim /etc/named.conf 
############
options {
...listen-on port 53 { any; };     # 確保 DNS 服務可被遠程客戶端訪問(不僅限于本地)allow-query ? ? { any; };       # 允許所有 IP 地址查詢該 DNS 服務器,適合作為公共解析服務dnssec-validation no;           # 關閉 DNS 記錄的數字簽名驗證(測試場景簡化,生產環境需開啟)
...
}
############

禁用 DNSSEC 驗證后,系統在處理 DNS 解析結果時,不會對記錄的數字簽名進行驗證,直接接受并使用解析結果(無論其是否被篡改、是否來自真實域名所有者)。

dnssec-validation no; 是為了 “可用性” 犧牲 “安全性” 的配置,讓系統 “不較真” DNS 記錄的真實性,直接使用解析結果。

vim /etc/named.rfc1912.zones 
########### 
zone "haha.org" IN {                    # 添加以下內容type master;                    # 作為主 DNS 服務器 ?file "haha.org.zone";           # 解析記錄文件路徑 allow-update { none; };         # 禁止動態更新(安全加固)
};
###########
?
cd /var/named/
cp -p named.localhost haha.org.zone
?
vim haha.org.zone 
###########
$TTL 1D
@ ? ? ? IN SOA  dns.haha.org.  root.haha.org. (0 ? ? ? ; serial1D ? ?  ; refresh1H ? ?  ; retry1W ? ?  ; expire3H ) ?  ; minimumNS ? ?  dns.haha.org.
dns ? ? A ? ? ? 192.168.67.10               # 為了查看效果 20 主機寫本機 IP
###########
?
systemctl start named
systemctl enable --now named

nginx 代理服務器配置。

# 主配置文件添加
vim /usr/local/nginx/conf/nginx.conf    
##########
...
include "/usr/local/nginx/tcp.d/*.conf";        # 引入四層代理配置文件(不可放在 http 或 server 塊內)
...
##########
mkdir /usr/local/nginx/tcp.d/
vim /usr/local/nginx/tcp.d/xixi.conf
#########
stream {upstream dns {server 192.168.67.10:53 max_fails=3 fail_timeout=5;     # RS1 的 DNS 服務(53 端口),3 次失敗后標記不可用,5 秒后重試server 192.168.67.20:53 max_fails=3 fail_timeout=5;}
?server {listen 53 udp;      # 監聽代理服務器的 UDP 53 端口proxy_pass dns;     # 轉發到 dns 服務器組 }server {listen 53;          # 默認 TCP 協議,監聽 53 端口proxy_pass dns;}
}
#########
?
systemctl restart nginx
netstat -antlupe | grep nginx

預期結果:多次查詢會交替返回 RS1(192.168.67.10)和 RS2(192.168.67.20)的 IP,驗證請求被輪詢分配到兩臺后端 DNS 服務器。

dig @192.168.67.100 dns.haha.org

3.2.Mysql 負載

實驗背景

MySQL(或 MariaDB)是常用的關系型數據庫,使用 TCP 3306 端口通信。通過四層代理實現 MySQL 負載均衡,可將客戶端連接分配到多臺數據庫服務器,分擔讀寫壓力(需配合數據庫主從復制等策略確保數據一致性)。

后端 RS 下載 mariadb,配置 server_id,授權用戶。

# 安裝 mariadb
yum install mariadb-server ?-y
?
vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
...
server-id=10        # RS1 設為 10,RS2 設為 20(唯一標識,便于區分實例)
...
?
systemctl enable --now mariadb
?
mysql -e "grant all on *.* to zyz@'%' identified by 'zyz'"      # 進入MySQL# 添加可遠程登錄的用戶
?
# 測試:遠程登錄 mysql
mysql -uzyz -pzyz -h192.168.13.10
mysql -uzyz -pzyz -h192.168.13.20

nginx 主機配置

vim /usr/local/nginx/tcp.d/xixi.conf
########
stream {upstream mariadb {server 192.168.67.10:3306 max_fails=3 fail_timeout=4;       # RS1 的 MySQL 服務(3306 端口),3 次失敗后標記不可用,4 秒后重試server 192.168.67.20:3306 max_fails=3 fail_timeout=4;}server {listen 3306;            # 監聽代理服務器的 3306 端口 ?proxy_pass mariadb;     # 轉發到 mariadb 服務器組}
}
########
netstat -antlupe | grep nginx

測試:

預期結果:多次連接會交替返回 server_id=10(RS1)和 server_id=20(RS2),驗證請求被輪詢分配到兩臺后端數據庫服務器。

四層代理的核心價值與配置解析

  • 關鍵參數作用

    • stream 塊:Nginx 處理四層代理的核心模塊,與 http 塊平級,專門用于配置 TCP/UDP 服務的轉發規則。

    • upstream 服務器組:定義后端服務節點,支持 max_fails(最大失敗次數)和 fail_timeout(失敗檢測周期)實現健康檢查 —— 超過失敗次數后自動剔除故障節點,超時后重新檢測。

    • listen 指令:指定代理服務器監聽的端口和協議(udp 需顯式聲明,默認 TCP),如 listen 53 udp 對應 DNS 的 UDP 服務,listen 3306 對應 MySQL 的 TCP 服務。

    • proxy_pass:將監聽端口的請求轉發到定義的 upstream 服務器組,實現負載均衡。

  • 適用場景與優勢

    • 通用性:支持所有 TCP/UDP 服務(DNS、MySQL、SSH、Redis 等),解決七層代理(僅 HTTP)的局限性;

    • 高性能:轉發邏輯簡單(不解析應用層數據),資源消耗低,可支撐高并發場景;

    • 高可用:通過健康檢查自動剔除故障節點,結合備用服務器可實現服務無感知切換;

    • 易擴展:新增后端服務器只需在 upstream 中添加節點,無需修改客戶端配置。

通過四層代理配置,Nginx 突破了僅處理 HTTP 服務的限制,成為通用的傳輸層負載均衡器,為底層服務(如數據庫、DNS)提供分流與高可用保障,是構建企業級分布式架構的重要組件。

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

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

相關文章

【Mybatis入門】配置Mybatis(IDEA)

Mybatis和JDBC一樣&#xff0c;是連接數據庫的工具。它是一款優秀的持久層框架&#xff0c;主要用于 Java 語言中簡化數據庫操作&#xff0c;實現對象與數據庫表之間的映射。Mybatis相比于JDBC的優勢Mybatis消除了傳統 JDBC 代碼中繁瑣的手動處理、參數設置、結果集解析等重復工…

多路轉接之epoll 【接口】【細節問題】【LT與ET模式】【Reactor】

目錄 一.接口 1.1epoll_creaet 1.2epoll_ctl 1.3epoll_wait 二.細節問題 2.1 工作原理 2.2 epoll的demo 2.3 epoll的優點 三. LT 與 ET模式 理解ET 四. reactor 一.接口 1.1epoll_creaet 注意返回值是一個文件描述符 創建一個epoll模型 1.2epoll_ctl 返回值&…

滲透測試現已成為 CISO 戰略的核心

隨著數字供應鏈的擴展以及生成式人工智能在關鍵系統中的嵌入&#xff0c;安全領導者正在重新思考其網絡安全策略。Emerald Research 最近對 225 位安全領導者進行的一項調查發現&#xff0c;68% 的人擔心第三方軟件和組件帶來的風險。雖然大多數受訪者表示他們正在滿足監管要求…

音視頻學習(五十三):音頻重采樣

概述 音頻重采樣&#xff08;sample rate conversion, SRC&#xff09;是把采樣率從 Fs_in 變換為 Fs_out 的過程。常見場景有格式轉換&#xff08;44.1→48 kHz&#xff09;、采樣率匹配&#xff08;播放鏈路統一采樣率&#xff09;、以及通信中語音采樣率升降&#xff08;8 k…

【C#】正則表達式

一、核心優勢&#xff1a;用一小段規則搞定大量復雜的字符串匹配&#xff0c;查找和替換&#xff0c;并且可移植可復用。使用正則表達式的好處&#xff1a;1. 強大且靈活&#xff1a;可以一次性匹配非常復雜的規則&#xff0c;比如驗證郵箱、提取特定的格式日志、解析URL&#…

【[特殊字符][特殊字符] 協變與逆變:用“動物收容所”講清楚 PHP 類型的“靈活繼承”】

你有沒有遇到過這樣的問題&#xff1a;“為什么子類方法可以返回 Cat&#xff0c;而父類只寫了返回 Animal&#xff1f;” “為什么參數反而能從 CatFood 變成更寬泛的 Food&#xff1f;”這些看似“違反直覺”的設計&#xff0c;其實背后有一個優雅的編程概念&#xff1a;協變…

cesium/resium 修改子模型材質

我是 www.v2ex.com/t/1151549 的作者&#xff0c;在csdn這邊補全一些更多的信息 相關工具 主項目插件版本&#xff1a; "cesium": "^1.131.0",、"resium": "^1.19.0-beta.1"、"three": "^0.178.0"、"react…

nvm install 14.21.3 時npm 無法下載和識別

錯誤&#xff1a;C:\Users\H3C>nvm install 14.21.3 Downloading node.js version 14.21.3 (64-bit)... Complete Downloading npm... Creating C:\Users\H3C\AppData\Local\Temp\nvm-install-939491942\temp Downloading npm version 6.14.18... Error while downloading h…

【網絡運維】Linux:LNMP 項目實踐

LNMP 項目實踐 簡介&#xff1a;什么是 LAMP/LNMP LAMP&#xff1a;LinuxApacheMysql/MariadbPHP/Python/Perl。 LNMP&#xff1a;LinuxNginxMysql/MariadbPHP/Python/Perl。 Linux&#xff1a;操作系統&#xff0c;提供程序運行基礎。Apache/Nginx&#xff1a;Web 服務器&…

用 Docker 安裝并啟動 MySQL:從零到實戰的完整指南

用 Docker 安裝并啟動 MySQL&#xff1a;從零到實戰的完整指南MySQL 是目前最流行的關系型數據庫之一&#xff0c;廣泛應用于各類應用系統中。使用 Docker 部署 MySQL 可以極大簡化環境配置&#xff0c;保證開發、測試和生產環境的一致性。本文將詳細介紹如何使用 Docker 安裝、…

動態規劃----1.爬樓梯

70. 爬樓梯 - 力扣&#xff08;LeetCode&#xff09; /** 1階:1步,即1種; 2階:1步1步或直接2步,即2種 f(1) 1,f(2) 2 3階:由1階邁2步,或2階邁一步; 4階:由2階邁2步,或3階1步; n階:由n-2階邁2步,或n-1階邁1步 f(n) f(n - 1) f(n - 2) */ class Solution {/**1階:1步,即1種…

special topic 11 (1)

preface 雖然我知道專業課必須得學&#xff0c;但是要學的東西&#xff0c;好多&#xff0c;我對專業課很害怕&#xff0c;稍微往后挪一挪&#xff0c;今天學了兩個強化網課之后再學專業課吧。今天的目標是學完 11 到 14.任重道遠&#xff0c;加油&#xff01;從今天開始盡量早…

MTD和FTL的關系

在嵌入式存儲系統里&#xff0c;MTD&#xff08;Memory Technology Device&#xff09;和 FTL&#xff08;Flash Translation Layer&#xff09;是上下兩層、互相配合的概念。你可以把它想成**“原始硬件接口”和“硬盤驅動”**的關系。1. MTD 是什么定位&#xff1a;內核里對原…

自動駕駛 HIL 測試:構建 “以假亂真” 的實時數據注入系統

01 引言在端到端自動駕駛的研發競賽中&#xff0c;算法的迭代速度遠超物理世界的測試能力。單純依賴路測不僅成本高昂、周期漫長&#xff0c;更無法窮盡決定系統安全性的關鍵邊緣場景&#xff08;Corner Cases&#xff09;。因此&#xff0c;硬件在環&#xff08;HIL&#xff0…

jdk升級

列出所有的jdk版本 /usr/libexec/java_home -V 永久切換版本 export JAVA_HOME(/usr/libexec/javahome?v11)exportPATH(/usr/libexec/java_home -v 11) export PATH(/usr/libexec/javah?ome?v11)exportPATHJAVA_HOME/bin:$PATH 保存后執行 source ~/.zshrc

Openlayers基礎教程|從前端框架到GIS開發系列課程(24)openlayers結合canva繪制矩形繪制線

本章節講解Canvas如何結合 Openlayer 使用&#xff0c;首先我們講解Canvas的繪圖基礎。我們初始化地圖的時候可以看見&#xff0c;實際上Openlayer的地圖就是用Canvas實現繪制的。Canvas繪制基本概念什么是canvas&#xff1f;HTML5 <canvas> 元素用于圖形的繪制&#…

深度學習——01 深度學習簡介

1 什么是深度學習&#xff1f;人工智能是個大范疇&#xff0c;目標是打造智能機器和程序&#xff1b; 機器學習是實現人工智能的一種途徑&#xff0c;它能讓機器在不被明確編程的情況下自主學習&#xff1b;而深度學習&#xff0c;是機器學習的一個分支&#xff0c;它是基于深度…

自然語言處理( NLP)基礎

一、基本概念自然語言處理也就是Natural Language Processing&#xff0c;簡稱NLP。NLP就是人工只能和語言學領域的一個分支&#xff0c;涉及到計算機與人類語言之間的相互作用。主要目標是讓計算機能夠理解、解釋和生成人類語言的數據。1 自然語言處理的基本介紹NLP包括但不限…

云原生作業(nginx)

目錄 1 Web 服務基礎介紹 1.1 Web 服務介紹 1.1.1 Apache 經典的 Web 服務端 1.1.2 Nginx-高性能的 Web 服務端 1.1.3 用戶訪問體驗和性能 1.1.4 服務端 I/O 流程 1.2 I/O 模型 1.2.1 I/O 模型相關概念 1.2.2 網絡 I/O 模型 1.2.3 五種 IO 對比 1.2.4 I/O 的具體實現…

NY198NY203美光固態閃存NY215NY216

NY198NY203美光固態閃存NY215NY216技術架構與核心創新突破美光NY系列&#xff08;含NY198/NY203/NY215/NY216&#xff09;作為新一代企業級存儲解決方案&#xff0c;其底層采用232層NAND閃存三維堆疊工藝&#xff0c;如同垂直建造數字世界的摩天大樓&#xff0c;在有限芯片面積…