從反向代理到負載均衡:Nginx + Tomcat 構建高可用Web服務架構

從反向代理到負載均衡:Nginx + Tomcat 構建高可用Web服務架構

文章目錄

  • 從反向代理到負載均衡:Nginx + Tomcat 構建高可用Web服務架構
    • 一、基礎鋪墊:什么是反向代理?
      • 1.1 反向代理的核心原理
      • 1.2 Nginx反向代理實戰配置
        • 步驟1:編輯Nginx配置
        • 步驟2:生效配置并驗證
    • 二、進階:Nginx負載均衡——應對高并發的核心方案
      • 2.1 負載均衡的核心價值
      • 2.2 Nginx常用負載均衡策略(附配置)
        • 1. 輪詢(Round Robin):默認策略,均勻分配
        • 2. 加權輪詢(Weighted Round Robin):按性能分配流量
        • 3. 最少連接數(Least Connections):動態平衡負載
        • 4. IP哈希(IP Hash):會話保持的關鍵
        • 5. 最少時間(Least Time):優先響應最快的節點
      • 2.3 負載均衡的高可用配置:故障轉移與健康檢查
        • 1. 故障轉移配置
        • 2. 健康檢查
    • 三、后端支撐:Tomcat的核心原理與配置
      • 3.1 Tomcat的本質與核心流程
      • 3.2 Tomcat核心配置文件
      • 3.3 關鍵配置:Tomcat與數據庫連接(JNDI數據源)
        • 步驟1:配置數據源(`conf/context.xml`)
        • 步驟2:應用中獲取數據源
      • 3.4 Tomcat部署注意事項
    • 四、整體架構總結:Nginx + Tomcat 協同工作流程
    • 五、實際應用場景與優化建議
    • 結語

在Web服務架構中,單臺服務器往往難以應對高并發、高可用的業務需求。Nginx憑借其高性能的反向代理和負載均衡能力,成為架構中的“流量入口”;而Tomcat作為成熟的Java Web容器,負責承載具體的業務應用。本文將從原理到實踐,詳細講解如何通過Nginx + Tomcat搭建穩定、可擴展的Web服務架構。

一、基礎鋪墊:什么是反向代理?

在深入負載均衡之前,我們首先要理解反向代理——這是Nginx連接客戶端與后端服務的核心能力。

1.1 反向代理的核心原理

反向代理的本質是**“中轉”**:客戶端的請求不會直接發送給后端應用服務器,而是先發送給Nginx,再由Nginx根據配置轉發給后端(如Tomcat、Spring Boot等)。
對客戶端而言,它只知道自己連接的是Nginx,完全感知不到后端真實的應用服務器地址,這就為后續的負載均衡、安全防護打下了基礎。

數據流向
客戶端 → Nginx(反向代理) → 后端應用服務器(Tomcat等)

1.2 Nginx反向代理實戰配置

以“將客戶端請求轉發到本地8080端口的Tomcat服務”為例,我們只需修改Nginx的主配置文件nginx.conf

步驟1:編輯Nginx配置
http {server {listen 80;          # Nginx監聽80端口(默認HTTP端口)server_name localhost;  # 訪問域名/IP# 核心反向代理配置location / {proxy_pass http://127.0.0.1:8080;  # 轉發到本地Tomcat的8080端口proxy_set_header Host $host;        # 保留客戶端請求的Host頭(重要,避免后端服務識別異常)proxy_set_header X-Real-IP $remote_addr;  # 傳遞客戶端真實IP給后端proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 記錄代理鏈路}# 錯誤頁面配置error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
步驟2:生效配置并驗證
  1. 重啟Nginx使配置生效:
    systemctl restart nginx(CentOS)或 nginx -s reload(熱重載)
  2. 驗證:瀏覽器訪問http://服務器IP(無需加8080端口),Nginx會自動轉發到Tomcat,顯示Tomcat默認頁面即配置成功。

二、進階:Nginx負載均衡——應對高并發的核心方案

當單臺Tomcat無法承載流量時,我們需要部署多臺Tomcat組成集群,而Nginx的負載均衡功能可以將客戶端請求合理分配到多臺后端服務器,實現“分流減壓”。

2.1 負載均衡的核心價值

  • 提高性能:將請求分散到多臺服務器,避免單臺服務器過載;
  • 高可用性:某臺Tomcat宕機后,Nginx會自動將請求轉發到其他正常節點,避免服務中斷;
  • 可擴展性:業務增長時,只需新增Tomcat節點并修改Nginx配置,無需改動客戶端;
  • 簡化運維:客戶端只需對接Nginx,后端服務器的擴容、替換對客戶端透明。

2.2 Nginx常用負載均衡策略(附配置)

Nginx支持多種負載均衡策略,可根據業務場景靈活選擇。核心是通過upstream模塊定義后端服務器集群,再通過proxy_pass指向該集群。

1. 輪詢(Round Robin):默認策略,均勻分配

原理:按請求順序依次分配給后端服務器,循環往復。適用于后端服務器性能一致的場景。
配置示例

http {# 定義后端Tomcat集群(命名為backend)upstream backend {server 192.168.0.101:8080;  # Tomcat節點1server 192.168.0.102:8080;  #  Tomcat節點2server 192.168.0.103:8080;  #  Tomcat節點3}server {listen 80;server_name localhost;location / {proxy_pass http://backend;  # 轉發到集群proxy_set_header Host $host;}}
}

特點:無需額外配置,請求分配均勻,但不考慮服務器負載差異。

2. 加權輪詢(Weighted Round Robin):按性能分配流量

原理:為后端服務器設置權重(weight),權重越高,接收的請求越多。適用于后端服務器性能不一致的場景(如高配服務器承擔更多流量)。
配置示例

upstream backend {server 192.168.0.101:8080 weight=3;  # 權重3,承擔3/6的流量server 192.168.0.102:8080 weight=2;  # 權重2,承擔2/6的流量server 192.168.0.103:8080 weight=1;  # 權重1,承擔1/6的流量
}

特點:通過權重適配服務器性能,兼顧資源利用率與負載均衡。

3. 最少連接數(Least Connections):動態平衡負載

原理:將請求分配給當前活躍連接數最少的服務器,適用于請求處理時間差異較大的場景(如有的請求耗時1秒,有的耗時10秒)。
配置示例

upstream backend {least_conn;  # 啟用最少連接數策略server 192.168.0.101:8080;server 192.168.0.102:8080;server 192.168.0.103:8080;
}

特點:動態感知服務器負載,避免某臺服務器因長連接過多而過載。

4. IP哈希(IP Hash):會話保持的關鍵

原理:通過計算客戶端IP的哈希值,將同一客戶端的請求固定分配給同一臺服務器。適用于需要“會話保持”的場景(如未使用分布式Session時,用戶登錄狀態保存在單臺Tomcat)。
配置示例

upstream backend {ip_hash;  # 啟用IP哈希策略server 192.168.0.101:8080;server 192.168.0.102:8080;server 192.168.0.103:8080;
}

特點:保證同一客戶端的請求落到同一節點,但需注意:若該節點宕機,客戶端會話會丟失。

5. 最少時間(Least Time):優先響應最快的節點

原理:Nginx 1.15.3+新增策略,將請求分配給響應時間最短的服務器(結合連接數和響應時間計算),適用于對響應速度要求極高的場景(如電商秒殺)。
配置示例

upstream backend {least_time header;  # 基于響應頭時間判斷;也可使用"last_byte"(基于完整響應時間)server 192.168.0.101:8080;server 192.168.0.102:8080;
}

特點:比“最少連接數”更精準,優先保障用戶體驗。

2.3 負載均衡的高可用配置:故障轉移與健康檢查

負載均衡的核心是“高可用”,我們需要配置故障轉移(避免請求發送到宕機節點)和健康檢查(自動恢復正常節點)。

1. 故障轉移配置

通過max_failsfail_timeout定義節點故障判定規則:

upstream backend {server 192.168.0.101:8080 weight=3 max_fails=3 fail_timeout=30s;server 192.168.0.102:8080 weight=2 max_fails=3 fail_timeout=30s;server 192.168.0.103:8080 backup;  # backup:僅當主節點全部宕機時啟用
}
  • max_fails=3:3次請求失敗后,標記該節點為“不可用”;
  • fail_timeout=30s:30秒內不再向該節點轉發請求,30秒后重試;
  • backup:備用節點,主節點正常時不參與負載。
2. 健康檢查

Nginx開源版默認是被動健康檢查(僅當請求失敗時標記節點不可用);若需主動健康檢查(定時探測節點狀態),有兩種方案:

  • 商業方案:使用Nginx Plus,內置主動健康檢查功能;
  • 開源方案:安裝第三方模塊nginx_upstream_check_module,配置定時探測(如每隔2秒發送GET請求檢查節點是否存活)。

三、后端支撐:Tomcat的核心原理與配置

Nginx負責“流量分配”,而Tomcat負責“業務執行”。作為Java Web容器,Tomcat的核心是接收Nginx轉發的請求,執行Servlet/JSP業務邏輯,并返回響應。

3.1 Tomcat的本質與核心流程

Tomcat是“Web服務器 + Servlet容器”的結合體,核心流程可概括為:

  1. 啟動初始化:加載server.xml配置,啟動Connector(監聽8080端口)、初始化Servlet容器;
  2. 接收請求:Connector監聽Nginx轉發的HTTP請求,封裝為HttpServletRequest對象;
  3. 請求分發:通過Mapper根據URL找到對應的Web應用(Context)和Servlet(Wrapper);
  4. 執行業務:調用Servlet的service()方法(或Spring MVC的DispatcherServlet),執行業務邏輯;
  5. 返回響應:將HttpServletResponse轉換為HTTP報文,通過Nginx返回給客戶端。

3.2 Tomcat核心配置文件

Tomcat的配置集中在conf目錄下,關鍵文件如下:

配置文件核心作用
conf/server.xml主配置:定義端口(Connector)、Host、Context等
conf/web.xml全局Web應用配置:默認Servlet、MIME類型等
conf/context.xml應用級配置:數據源(JNDI)、Session配置等
conf/tomcat-users.xml用戶權限配置:Manager App登錄賬號密碼
WEB-INF/web.xml單應用配置:當前應用的Servlet、Filter配置

3.3 關鍵配置:Tomcat與數據庫連接(JNDI數據源)

Tomcat提供JNDI數據源功能,可統一管理數據庫連接池,避免應用重復創建連接(提升性能)。

步驟1:配置數據源(conf/context.xml
<Context><!-- 定義MySQL數據源,命名為jdbc/MyDB --><Resource name="jdbc/MyDB" auth="Container"type="javax.sql.DataSource"maxActive="20"  # 最大活躍連接數maxIdle="10"    # 最大空閑連接數maxWait="10000" # 連接超時時間(10秒)username="root"password="123456"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/test?useSSL=false"/>
</Context>
步驟2:應用中獲取數據源
// 通過JNDI獲取連接池
Context initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/MyDB");
Connection conn = ds.getConnection();  // 從連接池獲取連接
// 執行SQL操作...
conn.close();  // 歸還連接到連接池

3.4 Tomcat部署注意事項

  1. 環境依賴:Tomcat需要JDK環境,建議使用JDK 8+,配置JAVA_HOME環境變量;
  2. 端口沖突:若多臺Tomcat部署在同一服務器,需修改server.xml中的Connector端口(如8080、8081、8082);
  3. 應用部署:將WAR包放入webapps目錄,Tomcat會自動解壓部署;或通過Manager App手動部署。

四、整體架構總結:Nginx + Tomcat 協同工作流程

當我們將Nginx與Tomcat結合時,完整的Web服務流程如下:

  1. 客戶端發送HTTP請求到http://服務器IP(Nginx監聽80端口);
  2. Nginx根據負載均衡策略(如加權輪詢),將請求轉發到后端Tomcat集群中的某臺節點(如192.168.0.101:8080);
  3. Tomcat接收請求,通過Connector解析HTTP報文,分發到對應的Servlet;
  4. Servlet執行業務邏輯(如查詢數據庫),生成響應;
  5. Tomcat將響應返回給Nginx,Nginx再轉發給客戶端。

架構圖
客戶端 → Nginx(80端口,反向代理+負載均衡) → Tomcat集群(8080端口,業務執行) → 數據庫

五、實際應用場景與優化建議

  1. 靜態資源分離:Nginx直接處理靜態資源(CSS、JS、圖片),僅將動態請求(如API接口)轉發給Tomcat,減少Tomcat壓力;
  2. Session共享:若使用IP哈希策略,建議通過Redis實現分布式Session,避免單節點宕機導致會話丟失;
  3. Nginx性能優化:調整worker_processes(與CPU核心數一致)、worker_connections(單個worker最大連接數);
  4. Tomcat性能優化:調整線程池(server.xml中的maxThreads)、啟用NIO協議(提升并發處理能力)。

結語

Nginx的反向代理與負載均衡解決了“流量分配”和“高可用”問題,Tomcat的Servlet容器解決了“業務執行”問題。二者結合構建的架構,既能應對高并發流量,又能保障服務穩定,是中小規模Java Web應用的經典方案。掌握這套架構的原理與配置,能讓你更從容地應對實際業務中的性能與可用性挑戰。

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

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

相關文章

Simulink中使用Test sequence單元測試

一、Tips 在對simulink模型進行Test sequence單元測試時&#xff0c;如果采取書寫測試用例的話&#xff0c;有以下操作。 1、使用”fprintf(‘time%f\n’, t);“來打印當前step的時間&#xff1b; 二、數據類型轉換 1、double類型 -> boolean類型 clc; clear all;% 1、doubl…

【mysql】SQL自連接:什么時候需要,什么時候不需要?

SQL自連接:什么時候需要,什么時候不需要? 通過具體示例和對比解析,徹底搞懂SQL自連接的使用場景 在處理SQL查詢時,尤其是當表中存在自引用關系(如referee_id引用同一張表的id)時,很多開發者會疑惑:這個查詢到底需不需要自連接?本文將通過多個具體示例,帶你徹底弄清何…

「美」創新在于人,而不是產品 - AxureMost 落葵網

添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 第一章&#xff1a;創新的心理學 創新與心理安全 蠟燭問題&#xff1a;卡爾鄧克爾的蠟燭問題實驗揭示了創造性思維的重要性。通過顛覆對盒子用途的先入為主觀念&#xff0c;參與者能夠找到創新性的解決方案…

新規則,新游戲:AI時代下的戰略重構與商業實踐

當你的客服AI能夠真正像員工一樣理解客戶的行業術語&#xff0c;當AI能主動從大量的客戶咨詢中篩選出高價值潛在客戶 —— 這已經不再是理想中才能存在的場景&#xff0c;而是當下 “人工智能 ” 行動深入推進中&#xff0c;企業智能化轉型的真實寫照。 "人工智能 " …

ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes 數據集構建

paper link: paperlink Abstract: 這個數據集是個RGB-D視頻數據集&#xff0c;在707個不同空間中獲取了1513個掃描的場景&#xff0c;250w個視圖&#xff0c;并且標注了相機位姿&#xff0c;表面重建&#xff0c;語義分割。本數據集共有20人掃描500名工作者進行標注。 數據集…

c語言期末復習

一、選擇題(10道) 1、以下哪個不是C語言的關鍵字? A) int B) float C) string D) while (答案:C) 2、表達式 5 / 2 的結果是: A) 2.5 B) 2 C) 3 D) 2.0 (答案:B) 3、指針變量存儲的是: A) 變量的值 B) 變量的地址 C) 變量的類型 D) 變量的名稱 (答案:B) 4、以…

JLINK 調試器單步調試單片機

0 JLINK 調試器單步調試單片機 1 物理層1.1 調整電壓和開發板一致2 環境搭建 2.1 安裝 JLink_Windows_V862_x86_642.2 vscode 配置 {"version": "0.2.0","configurations": [{"name": "(gdb) 啟動","type": "…

大模型(LLM)安全保障機制(技術、標準、管理)

大模型&#xff08;LLM&#xff09;的安全保障涉及技術、標準、管理等多個層面。下面我將結合其核心風險&#xff0c;為你梳理主要的安全機制、相關標準框架以及一些實踐建議。為了讓您快速了解大模型面臨的主要風險及相應的應對機制&#xff0c;我準備了一個表格&#xff1a;安…

虛擬機之CentOS、網絡設置的有趣問題

前言 年初射出的子彈&#xff0c;今天中了。 年初埋下的坑&#xff0c;今年踩了。 回首過往&#xff0c;why&#xff1f; because&#xff1a;當時下載VMware的時候。沒有設置網絡。 重點——使用VMware安裝CentOS 9 使用VMware安裝CentOS Stream 9_嗶哩嗶哩_bilibili 總…

Biomni:來自斯坦福的通用型生物醫學 AI 智能體,科研“虛擬助手“來了!

在當今生物醫學研究中&#xff0c;實驗手段和數據量正以前所未有的速度膨脹。從基因組學、單細胞組學到多模態數據&#xff0c;再到可穿戴設備的健康監測&#xff0c;科研人員每天都在與龐大的數據和復雜的分析流程打交道。 然而&#xff0c;實驗設計瑣碎、工具分散、跨學科整合…

移植后 eto 陽性 干擾素 α1b、白介素 - 2 dli

在異基因造血干細胞移植&#xff08;allo-HSCT&#xff09;后仍存在 AML1-ETO&#xff08;ETO&#xff09;融合基因陽性的患者中&#xff0c;干擾素 α1b 聯合白介素 - 2&#xff08;IL-2&#xff09; 是臨床中探索用于清除微小殘留病&#xff08;MRD&#xff09;、降低復發風險…

防止接口被薅羊毛(防刷)(DAY 002)

背景&#xff1a;短信驗證碼接口被不法分子用來做灰產&#xff08;短信郵箱轟炸機&#xff09; 如何避免??的?站成為”?雞“或者被刷&#xff1f; 增加圖形驗證碼&#xff08;開發?員&#xff09;單IP請求次數限制&#xff08;開發?員&#xff09; 防刷之圖形驗證碼&…

【RabbitMQ】----RabbitMQ 的7種工作模式

1.Simple(簡單模式) P:?產者,也就是要發送消息的程序 C:消費者,消息的接收者 Queue:消息隊列,圖中??背景部分.類似?個郵箱,可以緩存消息;?產者向其中投遞消息,消費者從其中取出消息. 特點:?個?產者P&#xff0c;?個消費者C,消息只能被消費?次.也稱為點對點(Point-to-P…

今日分享:C++ -- list 容器

&#x1f60e;【博客主頁&#xff1a;你最愛的小傻瓜】&#x1f60e; &#x1f914;【本文內容&#xff1a;C list容器 &#x1f60d;】&#x1f914; --------------------------------------------------------------------------------------------------------------------…

【Python】數據可視化之分布圖

分布圖主要用來展示某些現象或數據在地理空間、時間或其他維度上的分布情況。它可以清晰地反映出數據的空間位置、數量、密度等特征&#xff0c;幫助人們更好地理解數據的內在規律和相互關系。 目錄 單變量分布 變量關系組圖 雙變量關系 核密度估計 山脊分布圖 單變量分布…

DDD+WebAPI實戰

DDD+WebAPI實戰 DDD(領域驅動設計,Domain-Driven Design)是一種面向對象的設計方法,它強調將業務邏輯封裝在模型中,并通過這些模型來驅動整個應用的設計。在.NET環境中,特別是在使用ASP.NET Core和Web API構建應用時,DDD可以幫助我們更好地組織代碼,使得業務邏輯更加清…

人力資源管理的思維方法學習筆記1

北京師范大學政府管理學院1.課程介紹&#xff1a; 講述視角上&#xff0c;本課程側重人力資源管理的思維方式&#xff0c;即人力資源管理理論和時間的不同視角和主導范式的分析。這既是對人力資源管理理論發展的凝練&#xff0c;也是對人力資源管理實踐演進過程的總結。對于把握…

適應新環境:Trae編輯器下的IDEA快捷鍵定制

介紹&#xff1a;學習如何在Trae編輯器中配置IntelliJ IDEA風格的快捷鍵&#xff0c;減少開發環境間的切換成本&#xff0c;提升編碼效率。通過安裝插件或手動調整&#xff0c;讓你更快適應新工具大家好&#xff0c;我是凱哥Java本文標簽&#xff1a;代碼編輯效率、Trae快捷鍵、…

基于YOLO8的汽車碰撞事故檢測系統【數據集+源碼+文章】

基于YOLOv8和Streamlit的汽車碰撞事故檢測系統 文末附下載地址 開發目的 隨著城市化進程的加快和機動車保有量的持續攀升&#xff0c;道路交通安全問題日益突出&#xff0c;汽車碰撞事故頻發不僅嚴重威脅駕乘人員的生命安全&#xff0c;也對公共秩序、應急響應效率及交通管理…

Unity FARO 測量臂:從零構建實時數字孿生系統

前言:當精準測量遇見實時渲染 在高端制造、質量檢測和逆向工程領域,法奧 (FARO) 測量臂是精準的代名詞。它能以亞毫米級的精度捕捉現實世界中的三維坐標。現在,想象一下,如果我們將這種精度與 Unity 的強大實時渲染能力結合起來,會發生什么? 我們將得到一個數字孿生 (D…