正向代理,反向代理,負載均衡還有nginx

這是一個非常核心且重要的后端/運維知識領域。我會用盡可能清晰易懂的方式,結合生動的比喻,為你詳細梳理這些概念。


核心概念一覽

我們先從一個宏觀的角度來理解它們之間的關系:

  • 代理(Proxy): 一個中間人的角色。你不直接聯系目標,而是通過這個中間人。

  • 正向代理(Forward Proxy):?代理客戶端。它站在客戶端(用戶)這邊,替客戶端去訪問外部資源。核心關鍵詞:為客戶端服務、科學上網、緩存、隱藏客戶端。

  • 反向代理(Reverse Proxy):?代理服務端。它站在服務器這邊,替服務器接收來自外部客戶的請求。核心關鍵詞:為服務端服務、負載均衡、安全、隱藏后端服務器。

  • 負載均衡(Load Balancing): 一種技術/策略,通常由反向代理來實現。它的目標是把大量的請求合理地(均勻地、按權重等)“分配”給后臺多個服務器,防止單個服務器過載。

  • Nginx: 一個非常流行的、高性能的軟件,它同時實現了反向代理負載均衡Web服務器緩存等多種功能。它是這些概念的一個優秀實踐者

下面我們來逐個擊破。


1. 正向代理 (Forward Proxy) - “客戶的代言人”

是什么?

正向代理是位于客戶端(比如你的瀏覽器)和目標服務器(比如 Google)之間的一個服務器。客戶端會明確地配置并連接到這個代理服務器,然后由代理服務器去獲取你想要的信息,再返回給你。

生動的比喻:科學上網工具(VPN/代理)

你想訪問 Google(目標服務器),但你的網絡無法直接訪問(因為有墻)。于是你在電腦上設置了一個科學上網工具(正向代理)。

  1. 你的瀏覽器請求發給科學上網工具:“幫我去拿 Google 首頁。”

  2. 科學上網工具用自己的身份去訪問 Google,拿到首頁。

  3. 科學上網工具把首頁內容返回給你的瀏覽器。

對你(客戶端)來說,你感知到的是科學上網工具給了你Google的內容。對Google(服務器)來說,它只知道是科學上網工具來訪問了它,并不知道你的存在。

核心作用與特點:
  1. 突破訪問限制: 訪問無法直接到達的資源(如上面的例子)。

  2. 隱藏客戶端身份: 目標服務器看不到客戶端的真實IP,保護隱私。

  3. 緩存加速: 如果公司內網很多人訪問同一個網站,代理服務器可以把內容緩存下來,下次其他人訪問時直接從緩存里取,加快速度并節省帶寬。

  4. 訪問控制: 公司網絡可以通過代理監控和限制員工上網行為。

工作流程:

text

[ 客戶端 ] --> (我知道我要通過它) --> [ 正向代理 ] --> [ 目標服務器 ]

2. 反向代理 (Reverse Proxy) - “公司的前臺/總機”

是什么?

反向代理是位于一個或多個服務器前面的一個服務器。客戶端(用戶)直接訪問反向代理,然后由反向代理將請求轉發到內部網絡上的某臺服務器,并將得到的結果返回給客戶端。

客戶端并不知道后面有哪些服務器,也不關心請求具體被誰處理了。它以為反向代理就是最終的服務器。

生動的比喻:酒店前臺

一個大型酒店有很多服務員(后端服務器),但你作為客人(客戶端)不會直接聯系某個服務員。

  1. 你走到酒店前臺(反向代理)說:“我要開間房。”

  2. 前臺根據當前哪個服務員空閑、哪個區域忙等策略(負載均衡),通過對講機讓服務員A去處理你的請求。

  3. 服務員A辦好手續,把房卡給前臺,前臺再交給你。

對你(客戶端)來說,你是在和前臺打交道,你不知道背后是服務員A還是B為你服務的。對服務員(后端服務器)來說,他們被前臺保護起來,不會直接面對客戶的各種沖擊。

核心作用與特點:
  1. 隱藏服務器身份: 保護后端服務器的安全,暴露給公網的只有反向代理,有效防止直接攻擊。

  2. 負載均衡: 這是反向代理最核心的功能之一(下面詳細講)。

  3. SSL 加密/解密: 可以由反向代理統一處理耗性能的HTTPS加密解密,減輕后端服務器壓力。

  4. 緩存靜態內容: 將圖片、CSS、JS等靜態文件緩存起來,直接返回,無需請求后端。

  5. 壓縮: 壓縮響應內容,減少傳輸時間。

  6. 統一入口: 微服務架構中,反向代理可以作為API網關,統一接收所有請求。

工作流程:

text

[ 客戶端 ] --> [ 反向代理 ] --> (它來決定給誰) --> [ 服務器A ]|+---------> [ 服務器B ]|+---------> [ 服務器C ]

3. 負載均衡 (Load Balancing) - “聰明的調度員”

是什么?

負載均衡是反向代理扮演的一個核心角色。它是一種技術,旨在將網絡流量或計算任務分布式到多個服務器上,以確保沒有任何單個服務器因過載而性能下降或宕機。它提高了整個系統的可用性、可靠性和吞吐量。

如何工作?(調度算法)

負載均衡器(即反向代理)通過不同的算法來決定將新請求發給哪臺后端服務器(這些服務器集群也稱為“服務器池”或“農場”):

  • 輪詢 (Round Robin): 依次分發,第1個請求給服務器A,第2個給服務器B,第3個給服務器C,第4個又給回A...如此循環。最簡單公平。

  • 加權輪詢 (Weighted Round Robin): 給性能好的服務器更高的權重,它就能處理更多的請求。比如服務器A(權重3),服務器B(權重1),那么分發模式可能是 A->A->A->B->A->A->A->B。

  • 最少連接數 (Least Connections): 優先將新請求發給當前連接數最少的服務器,非常高效。

  • IP 哈希 (IP Hash): 根據客戶端的IP地址計算一個哈希值,總是將同一個IP的請求發給同一臺服務器。這能保證會話(Session)一致性,比如用戶的購物車信息只存在一臺服務器上。


4. Nginx - “瑞士軍刀”

是什么?

Nginx (發音為 “engine-x”) 是一個開源、高性能、高可靠性的?HTTP 和反向代理服務器。它因其強大的功能、低內存消耗和高并發處理能力而聞名。

它扮演什么角色?

Nginx 完美地集成了我們上面討論的所有概念:

  1. 作為 Web 服務器: 像 Apache 一樣,可以直接托管網站文件(HTML, CSS, JS, 圖片)。

  2. 作為反向代理: 這是它最常用的核心功能。接收客戶端請求,轉發給后端的Tomcat, Apache, Node.js, Python Django等應用服務器。

  3. 作為負載均衡器: 在反向代理的基礎上,通過簡單的配置即可實現上述的各種負載均衡算法。

  4. 其他功能: 還能做緩存、SSL終結、流量限制、訪問控制等。

一個簡單的 Nginx 負載均衡配置示例

假設你有三臺后端應用服務器,IP分別是?192.168.1.10,?192.168.1.11,?192.168.1.12

你的 Nginx 配置文件 (nginx.conf) 中可能會這樣寫:

nginx

http {# 定義一個名為 "backend_servers" 的服務器組upstream backend_servers {# 使用默認的輪詢算法server 192.168.1.10;    # 服務器Aserver 192.168.1.11;    # 服務器Bserver 192.168.1.12;    # 服務器C# 如果要使用加權輪詢# server 192.168.1.10 weight=3;# server 192.168.1.11 weight=1;}server {listen 80; # Nginx 監聽80端口location / {# 將所有對根路徑的請求代理到上面定義的服務器組proxy_pass http://backend_servers;# 以下是一些常見的反向代理設置,確保正確傳遞客戶端信息proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

這樣,當用戶訪問你的域名時,Nginx(反向代理+負載均衡器)就會按照配置的算法,將請求輪流發給后端的三個服務器。


總結與對比

特性正向代理反向代理
代理對象代理客戶端代理服務端
客戶端知情嗎?知情,需要主動配置代理地址不知情,以為反向代理就是真實服務器
部署位置靠近客戶端(如在客戶端局域網內)靠近服務端(如在數據中心入口)
主要目的為客戶端服務:突破限制、緩存、隱藏身份為服務端服務:負載均衡、安全、緩存、加密
典型例子VPN、科學上網工具、企業上網代理Nginx、Apache Traffic Server、CDN

負載均衡是反向代理的核心功能之一,Nginx?則是實現反向代理和負載均衡的著名軟件。

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

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

相關文章

WebSocket壓縮傳輸優化:機器視覺高清流在DCS中的低延遲方案

引言在現代工業自動化領域,分布式控制系統(DCS)正面臨著前所未有的數據挑戰。隨著機器視覺技術的廣泛應用,高清視頻流已成為監控產品質量、檢測設備異常和保障生產安全的重要手段。然而,將720P、1080P甚至4K分辨率的高…

《Linux常見命令》

ls 功能:列出目錄下的子目錄與文件,對于文件,還會列出文件名及其他信息。 語法:ls [選項] [目錄或文件] 1.常用選項及說明選項說明-a列出目錄下的所有文件,包括以 . 開頭的隱含文件-d將目錄象文件一樣顯示,…

Python數據分析:函數定義時的位置參數。

目錄1 代碼示例2 歡迎糾錯3 免費爬蟲4 論文寫作/Python 學習智能體1 代碼示例 直接上代碼。 def pargs1(a, b):"""先看確定數量的位置參數。最簡單的位置參數。a和b都叫而且只能叫“位置參數”。所謂確定數量,很明顯,是兩個就是兩個&…

《沒有架構圖?用 netstat、ss、tcpdump 還原服務連接與數據流向》

📢 你是否遇到過這些問題? 接手一個老項目,只有服務器賬號,沒有架構圖?服務突然異常,但不知道它依賴哪些外部系統?想畫數據流向圖,卻找不到文檔? 別擔心!只要…

Redis列表(List):實現隊列/棧的利器,底層原理與實戰

Redis列表(List):實現隊列/棧的利器,底層原理與實戰 1. Redis列表概述 1.1 什么是Redis列表 Redis列表(List)是一個有序的字符串元素集合,支持在頭部和尾部進行高效的插入和刪除操作。它可以…

OpenCV 圖像雙三次插值

文章目錄 一、簡介 二、實現代碼 三、實現效果 參考資料 一、簡介 在數學中,雙三次插值是三次樣條插值(一種將三次插值應用于數據集的方法)的擴展,用于在二維規則網格上插值數據點。插值曲面(指核形狀,而非圖像)比通過雙線性插值或最近鄰插值獲得的相應曲面更平滑。雙三…

【Java實戰?】Spring Security:為Spring Boot應用筑牢安全防線

目錄 一、Spring Security 概述 1.1 Spring Security 核心功能 1.2 Spring Security 與 Shiro 對比 二、Spring Boot 整合 Spring Security 基礎 2.1 整合依賴導入 2.2 默認安全配置 2.3 自定義用戶認證 2.4 自定義登錄與注銷 三、Spring Security 授權控制 3.1 基于角色的授權…

linux命令—stat

命令簡介 stat是Linux中用于查看文件或文件系統的詳細狀態信息的強大命令。它比ls -l更全面,其輸出信息包括但不限于:文件大小、權限、所有者、最后訪問/修改/狀態變更時間、inode號、所在設備信息等。 用法 stat命令的語法格式如下 stat [選項] 文件…

解決串口數據亂序問題

環境:jetson nano ubuntu 20.04python 3.12終于是找到解決串口亂序的最佳解決辦法了,先來看看什么是串口亂序:這就是一個典型的串口亂序,我的發送端發送 的協議為0x55 0x51 ...0x55 0x52 ...0x55 0x53 ...0x55 0x54 ...在這四條協…

Spring的注解

聲明Bean的注解 ?Component ?Controller ?Service ?Repository 后三種為Component的別名,之所以不同是因為可讀性的考慮 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Component public interface Controller {AliasFor(//別名an…

UVM寄存器模型與通道機制

接續UVM基礎入門文章。前言重點講述UVM常用的接口連接方式。寄存器模型:UVM寄存器模型(Register Model)是一組高級抽象的類,用于對DUT(Design Under Test)中具有地址映射的寄存器和存儲器進行建模&#xff…

12.NModbus4在C#上的部署與使用 C#例子 WPF例子

一、Modbus TCP/IP是什么Modbus TCP/IP是一種基于TCP/IP協議的工業自動化通信協議。它在Modbus協議的基礎上,利用TCP/IP網絡進行數據傳輸,使得工業設備之間的通信更加便捷和高效。常用的Modbus功能碼包括0x03(讀保持寄存器)、0x06…

硬件開發2-匯編1(ARMv7-A)- 基本概要

一、匯編基本概要1、ARM數據和指令類型2、ARM字節順序即可大端存儲也可小端存儲,默認小端存儲(不建議修改)、kernel(內核)中的,CPSR(當前程序狀態寄存器)可修改大小端存儲3、ARM處理…

Linux中進程和線程常用的API詳解

進程與線程基礎及 Linux 進程間通信(IPC)詳解 一、程序與進程 1. 程序(靜態文件) 程序是存儲在磁盤上的可執行文件,是靜態實體,不占用 CPU、內存等運行時資源,僅占用磁盤空間。不同操作系統的可…

VS Code 插件開發教程

VS Code 插件開發教程 概述 Visual Studio Code(簡稱 VS Code)是一款由 Microsoft 開發的開源輕量級編輯器,支持跨平臺(Windows、macOS、Linux)。 其最大的優勢之一是強大的插件系統,開發者可以通過編寫擴…

Docker技術解析

1.Docker安裝 1.如果Ubuntu自帶的Docker版本太低,我們需要卸載舊版本并安裝新的 sudo apt-get remove docker docker-engine docker.io containerd runc2. 備份原有軟件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak3.選擇合適的鏡像源 # 或者使用…

TCP套接字的使用

Java中使?TCP協議通信,使用ServerSocket來建立鏈接,使用Socket進行通信.ServerSocketServerSocket是創建TCP服務端Socket的api,主要方法:方法簽名說明ServerSocket(int port)創建一個服務端流套接字Socket,并綁定指定端口Socket accpet()開始監聽指定端口,有客戶端鏈接后,返回…

linux執行systemctl enable xxxxx 報 Failed to execute operation: Bad message

linux執行systemctl enable redis.service 報 Failed to execute operation: Bad message 如果在執行 systemctl enable 命令時遇到 "Failed to execute operation: Bad message" 錯誤,可能是由于以下幾個原因導致的。你可以按照以下步驟進行排查和解決&a…

終端之外:解鎖Linux命令行的魔法與力量

Linux命令行的核心理念 在記憶具體的指令之前,先理解它的哲學: 一切皆文件 :硬件設施,進程,目錄…在Linux中幾乎所有資源都被抽象為文件,這意味著你可以通過同樣的指令(如 ench ,cat&#xff…

CSS 動畫實戰:實現電商中“加入購物車”的拋物線效果

引言 在電商網站中,“加入購物車”動畫 是提升用戶體驗的經典交互之一。一個小小的商品圖標從頁面飄向購物車,不僅直觀地反饋了操作結果,還能增加趣味性與沉浸感。 實現這一效果的方式有很多,比如 JavaScript 計算路徑 動畫&…