基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南

基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南

文章目錄

  • 基于Nginx實現反向代理、負載均衡與動靜分離完整部署指南
    • 一、架構規劃與環境準備
      • 1.1 架構設計思路
      • 1.2 服務器規劃
      • 1.3 環境依賴
    • 二、部署Nginx負載均衡器
      • 2.1 安裝Nginx依賴包
      • 2.2 創建Nginx專用用戶
      • 2.3 編譯安裝Nginx
      • 2.4 配置Nginx系統服務
    • 三、部署后端Tomcat應用服務器
      • 3.1 安裝JDK(Tomcat依賴)
      • 3.2 部署Tomcat 8080實例
      • 3.3 部署Tomcat 8081實例
    • 四、配置Nginx反向代理、負載均衡與動靜分離
      • 4.1 準備靜態資源
      • 4.2 修改Nginx核心配置
      • 4.3 驗證Nginx配置并重啟
    • 五、功能測試
      • 5.1 靜態資源測試
      • 5.2 負載均衡與動態請求測試
    • 六、常見問題與解決方案
    • 七、總結

在實際生產環境中,單臺應用服務器往往難以承受高并發請求的壓力,同時靜態資源與動態資源混合處理也會降低服務響應效率。Nginx作為一款高性能的HTTP和反向代理服務器,憑借其輕量級、高并發的特性,成為實現負載均衡與動靜分離的理想選擇。本文將詳細介紹如何基于Nginx部署反向代理、負載均衡,并結合Tomcat實現動靜分離,構建高效穩定的Web服務架構。

一、架構規劃與環境準備

1.1 架構設計思路

本次部署采用“Nginx前端負載均衡+Tomcat后端應用”的架構模式,核心目標如下:

  • 反向代理:通過Nginx接收客戶端請求,隱藏后端Tomcat服務器的真實地址,提高服務安全性。
  • 負載均衡:將客戶端的動態請求分發到多臺Tomcat服務器,避免單臺服務器過載,提升服務并發能力。
  • 動靜分離:Nginx直接處理靜態資源(圖片、HTML等),動態請求(JSP等)轉發至Tomcat處理,優化資源處理效率。

1.2 服務器規劃

服務器角色IP地址端口主要作用
Nginx負載均衡器192.168.10.2280反向代理、負載均衡、靜態資源處理
Tomcat應用服務器1192.168.10.178080處理動態請求(JSP)
Tomcat應用服務器2192.168.10.178081處理動態請求(JSP)

1.3 環境依賴

  • 操作系統:CentOS 7(所有服務器均需安裝)
  • 軟件版本:Nginx 1.20.2、JDK 1.8、Tomcat 8.5.16
  • 前置操作:所有服務器關閉防火墻、禁用SELinux,避免端口攔截。
    # 關閉防火墻
    systemctl stop firewalld
    systemctl disable firewalld
    # 禁用SELinux
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    

二、部署Nginx負載均衡器

Nginx是整個架構的入口,需先完成其安裝與基礎配置,確保能夠正常接收和轉發請求。

2.1 安裝Nginx依賴包

Nginx編譯安裝需依賴pcre、zlib等庫,通過yum安裝相關開發包:

yum -y install pcre-cdevel zlib-devel openssl-devel gc gcc-c++ make

2.2 創建Nginx專用用戶

為提高安全性,創建無登錄權限的nginx用戶用于運行Nginx服務:

useradd -M -s /sbin/nologin nginx

2.3 編譯安裝Nginx

  1. 上傳Nginx 1.20.2安裝包至/opt目錄,解壓后進入源碼目錄:

    cd /opt
    tar zxvf nginx-1.20.2.tar.gz
    cd nginx-1.20.2/
  2. 配置編譯參數(啟用SSL、stream、狀態統計等核心模塊):

./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_flv_module \
--with-http_ssl_module \
--with-stream
  1. 編譯并安裝:
    make && make install
    
  2. 創建軟鏈接,方便全局調用nginx命令:
    ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
    

2.4 配置Nginx系統服務

為便于通過systemctl管理Nginx,創建系統服務文件:

vim /lib/systemd/system/nginx.service

添加如下內容:

[Unit]
Description=nginx
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true[Install]
WantedBy=multi-user.target

設置權限并啟動Nginx:

# 賦予執行權限
chmod 754 /lib/systemd/system/nginx.service
# 啟動并設置開機自啟
systemctl start nginx.service
systemctl enable nginx.service
# 驗證啟動狀態
systemctl status nginx.service

三、部署后端Tomcat應用服務器

Tomcat作為Java Web容器,負責處理動態JSP請求。本次在同一臺服務器上部署2個Tomcat實例(端口8080、8081),模擬多臺應用服務器。

3.1 安裝JDK(Tomcat依賴)

  1. 上傳JDK 1.8安裝包至/opt目錄,解壓至/usr/local

    tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
    
  2. 配置JDK環境變量:

    vim /etc/profile
    

    添加如下內容:

    export JAVA_HOME=/usr/local/jdk1.8.0_91
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
  3. 生效環境變量:

    source /etc/profile
    # 驗證JDK安裝
    java -version
    

3.2 部署Tomcat 8080實例

  1. 上傳Tomcat 8.5.16安裝包至/opt目錄,解壓并重命名:

    tar zxvf apache-tomcat-8.5.16.tar.gz
    mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
    
  2. 創建測試動態頁面:

    mkdir /usr/local/tomcat/webapps/test
    vim /usr/local/tomcat/webapps/test/index.jsp
    

    添加如下JSP內容(標記為test1頁面,便于區分負載均衡效果):

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>
    <head>
    <title>JSP test1 page</title>
    </head>
    <body>
    <% out.println("動態頁面 1,http://www.test1.com");%>
    </body>
    </html>
    
  3. 配置Tomcat虛擬主機:

    vim /usr/local/tomcat/conf/server.xml
    

    刪除原有<Host>配置,添加如下內容(指定應用路徑):

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"></Context>
    </Host>
    
  4. 啟動Tomcat并驗證:

    # 啟動Tomcat
    /usr/local/tomcat/bin/startup.sh
    # 驗證8080端口是否監聽
    netstat -ntap | grep 8080
    

3.3 部署Tomcat 8081實例

通過復制8080實例快速創建8081實例,只需修改端口和測試頁面即可:

  1. 復制Tomcat目錄并命名為tomcat1:
    cp -r /usr/local/tomcat /usr/local/tomcat1
    
  2. 修改Tomcat1端口(避免端口沖突):
    vim /usr/local/tomcat1/conf/server.xml
    
    需修改3處端口:
    • 關閉端口:<Server port="8005" shutdown="SHUTDOWN"> → 改為8006
    • 監聽端口:<Connector port="8080" protocol="HTTP/1.1"> → 改為8081
    • AJP端口:<Connector port="8009" protocol="AJP/1.3"> → 改為8010
  3. 修改測試頁面(標記為test2):
    vim /usr/local/tomcat1/webapps/test/index.jsp
    
    修改內容如下:
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <html>
    <head>
    <title>JSP test2 page</title>
    </head>
    <body>
    <% out.println("動態頁面 2,http://www.test2.com");%>
    </body>
    </html>
    
  4. 啟動Tomcat1并驗證:
    /usr/local/tomcat1/bin/startup.sh
    netstat -ntap | grep 8081
    

四、配置Nginx反向代理、負載均衡與動靜分離

Nginx的核心配置集中在nginx.conf文件中,需在此文件中實現負載均衡池定義、動靜請求分發規則。

4.1 準備靜態資源

在Nginx服務器上創建靜態頁面和圖片目錄,用于測試動靜分離:

# 創建靜態首頁
echo '<html><body><h1>這是Nginx處理的靜態頁面</h1></body></html>' > /usr/local/nginx/html/index.html
# 創建圖片目錄并上傳測試圖片(此處以上傳game.jpg為例)
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img

4.2 修改Nginx核心配置

編輯nginx.conf文件:

vim /usr/local/nginx/conf/nginx.conf

重點修改http塊內容,添加負載均衡池、動靜分離規則,完整配置如下:

http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;# 1. 定義負載均衡池(tomcat_server),weight為權重(權重越高,被分配概率越大)upstream tomcat_server {server 192.168.10.17:8080 weight=1;  # Tomcat 8080server 192.168.10.17:8081 weight=1;  # Tomcat 8081}# 2. 配置虛擬主機server {listen       80;server_name  www.test.com;  # 可自定義域名,需在本地hosts解析charset utf-8;access_log  logs/host.access.log  main;# 3. 動態請求轉發(.jsp結尾請求轉發至負載均衡池)location ~ .*\.jsp$ {proxy_pass http://tomcat_server;  # 轉發至定義的負載均衡池# 傳遞客戶端真實IP和主機名給后端Tomcatproxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 4. 靜態資源處理(圖片、CSS等由Nginx直接返回)location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;  # 靜態資源根目錄expires 10d;  # 設置瀏覽器緩存10天,減少重復請求}# 5. 默認請求處理(靜態首頁)location / {root   html;index  index.html index.htm;}# 錯誤頁面配置error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

4.3 驗證Nginx配置并重啟

# 檢查配置文件語法是否正確
nginx -t
# 重啟Nginx使配置生效
systemctl reload nginx.service

五、功能測試

配置完成后,通過瀏覽器訪問Nginx服務器IP(192.168.10.22),分別測試靜態資源、動態請求、負載均衡效果。

5.1 靜態資源測試

  1. 訪問靜態首頁:http://192.168.10.22
    預期結果:顯示“這是Nginx處理的靜態頁面”,說明Nginx正常處理靜態HTML。
  2. 訪問靜態圖片:http://192.168.10.22/game.jpg
    預期結果:成功顯示上傳的game.jpg圖片,說明靜態圖片處理正常。

5.2 負載均衡與動態請求測試

訪問動態JSP頁面:http://192.168.10.22/index.jsp
預期結果

  • 首次刷新可能顯示“動態頁面 1,http://www.test1.com”(Tomcat 8080處理);
  • 再次刷新可能顯示“動態頁面 2,http://www.test2.com”(Tomcat 8081處理);
  • 多次刷新后,頁面在兩個動態頁面間交替顯示,說明負載均衡生效,請求被均勻分發到兩臺Tomcat服務器。

六、常見問題與解決方案

  1. Tomcat啟動失敗,端口被占用?
    執行netstat -ntap | grep 8080查看占用端口的進程,殺死對應進程或修改Tomcat端口。
  2. 訪問JSP頁面返回404?
    檢查Tomcat的server.xml<Context>docBase路徑是否正確,確保index.jsp存在于該路徑下。
  3. Nginx配置后無法轉發請求?
    確認Nginx的upstream中Tomcat的IP和端口是否正確,同時檢查Tomcat是否啟動、防火墻是否關閉。

七、總結

本文通過“Nginx+Tomcat”架構實現了反向代理、負載均衡與動靜分離,核心優勢如下:

  • 高并發支持:Nginx處理靜態資源效率遠高于Tomcat,動靜分離減少了Tomcat的資源消耗;
  • 負載均衡:通過權重分配請求,避免單臺Tomcat過載,提升服務可用性;
  • 安全性提升:客戶端僅與Nginx交互,后端Tomcat不直接暴露在公網,降低攻擊風險。

該架構可根據實際業務需求擴展Tomcat服務器數量,進一步提升并發處理能力,適用于中小規模Web應用的生產環境部署。

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

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

相關文章

HTML5國慶網站源碼

一. 網站概述 本國慶主題網站以弘揚愛國主義精神為核心&#xff0c;通過豐富多元的交互功能與視覺設計&#xff0c;打造沉浸式國慶體驗空間。網站采用單頁面架構&#xff0c;通過平滑滾動實現各模塊的無縫銜接&#xff0c;涵蓋首頁、知識科普、互動體驗等十大功能板塊&#xf…

MySQL收集processlist記錄的shell工具mysql_collect_processlist

文章目錄安裝指南日志文件內容日志分析參考1.簡單檢索2.統計不同狀態的語句的數量3.按照時間統計注意事項倉庫這是一個純腳本工具&#xff0c;用于從MySQL的information_schema.processlist視圖中定期收集數據并保存到本地日志文件。支持MYSQL5.7-9.4版本。 template copy fro…

工業RFID現場網關模塊:實現多協議互通,128臺讀寫設備互連!

隨著工業4.0進程加速&#xff0c;企業對生產系統集成度的需求不斷增長。在工廠中常需整合不同品牌PLC、驅動器、機械臂、讀寫器等設備系統&#xff0c;這其中就會涉及到如Profinet、EtherNet/IP、EtherCAT、Modbus TCP、CC-LINK IE等不同通訊協議連接。雖可將部分設備直接與PLC…

黑馬點評高級篇第7節課 輸入INFO replication 顯示0個從節點,但是在7002節點又顯示它已經是7001節點的從節點了

問題描述在黑馬點評高級篇第七節課的這個位置??????&#xff0c;當我輸入INFO replication 的時候下面本應該顯示為connected_slaves: 2&#xff0c;但是我的顯示的是0。然后當我切換到7002端口的節點時&#xff0c;又顯示7002就是7001的從節點解決我看彈幕上說在7002和7…

pcb線路板打樣廠家有哪些?

在電子制造產業升級浪潮中&#xff0c;PCB打樣環節的效率與品質直接影響產品迭代速度。本文聚焦國內五家具備核心技術競爭力的PCB打樣廠商&#xff0c;深度解析其差異化優勢&#xff0c;為硬件開發者提供精準選型參考。獵板PCB作為國家高新技術企業&#xff0c;獵板PCB在高頻高…

【python實用小腳本-211】[硬件互聯] 桌面壁紙×Python夢幻聯動|用10行代碼實現“開機盲盒”自動化改造實錄(建議收藏)

1. 場景故事 “作為HR&#xff0c;我曾每天手動換壁紙提神&#xff0c;直到某天忙到忘記&#xff0c;結果被同事截圖當‘黑歷史’…” → 轉折點&#xff1a;用Python調用Windows API寫了個“隨機壁紙機”&#xff0c;開機自啟&#xff0c;每次登錄都是新風景&#xff0c;現在截…

集成學習 —— 梯度提升樹GBDT、XGBoost

目錄 一、梯度提升樹 1、殘差提升樹 Boosting Decision Tree 2、梯度提升樹 Gradient Boosting Decision Tree 二、構建案例 1、 初始化弱學習器(CART樹)&#xff1a; 2、 構建第1個弱學習器 3、 構建第2個弱學習器 4、 構建第3個弱學習器 5、 構建最終弱學習器 6、 構…

【船類】監控錄像下船舶類別檢測識別數據集:近7k圖像,6類,yolo標注

監控錄像下船舶類別檢測識別數據集概述 數據集包含 6900監控錄像下船舶類別圖像&#xff0c;6個標注類別&#xff1a; 散貨船、集裝箱船、漁船、雜貨船、礦砂船、客船 標注格式&#xff1a;yolo txt&#xff08;格式可轉&#xff0c;可直接訓練&#xff09; 標注工具&#…

用戶故事設計范式(As a... I want to... So that...)

我們來詳細解析一下用戶故事&#xff08;User Story&#xff09;&#xff0c;包括其結構、為什么重要、如何編寫好的用戶故事以及一個完整的示例。1. 用戶故事的基本結構&#xff1a;三段式模板最經典和通用的用戶故事模板就是您提到的三段式&#xff1a;As a [角色]:目的&…

【OpenGL】LearnOpenGL學習筆記20 - 實例化 Instancing

上接&#xff1a;https://blog.csdn.net/weixin_44506615/article/details/151156446?spm1001.2014.3001.5501 完整代碼&#xff1a;https://gitee.com/Duo1J/learn-open-gl | https://github.com/Duo1J/LearnOpenGL 實例化 Instancing 以往當我們在場景中要大量繪制相同模型…

MySQL主從不一致?DBA急救手冊:14種高頻坑點+3分鐘定位+無損修復!

MySQL「主從不一致」最常見的成因、快速定位思路以及可落地的修復手段 一、為什么會不一致&#xff1f;14 類高頻場景類別典型表現/觸發條件快速自檢命令/日志1. 從庫被寫入業務或 DBA 直連從庫 UPDATE/INSERTSHOW VARIABLES LIKE read_only 應為 ON2. 復制過濾規則主從 binlog…

AI 網站源碼:探秘 SUNO,革新音樂創作的 AI 先鋒

在當今數字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正深刻地重塑各個領域&#xff0c;音樂創作也不例外。SUNO 作為一款引領潮流的音樂生成工具&#xff0c;宛如一顆璀璨新星&#xff0c;在音樂創作的天空中熠熠生輝&#xff0c;為音樂愛好者和創作者們帶來了前…

Linux:malloc背后的實現細節

目錄前言一、先搞懂基礎&#xff1a;程序的內存布局&#xff08;關鍵前提&#xff01;&#xff09;二、malloc的核心實現步驟&#xff08;4層架構拆解&#xff09;第1層&#xff1a;用戶調用 → 標準庫處理&#xff08;glibc的malloc.c&#xff09;第2層&#xff1a;堆內存池管…

什么是X11轉發?

X11 轉發&#xff08;X11 forwarding&#xff0c;ssh -X&#xff09;是一種 SSH 協議功能&#xff0c;它允許用戶在遠程服務器上運行圖形化應用程序&#xff0c;并通過本地的顯示設備和輸入輸出設備與這些程序進行交互。它被開發者廣泛使用&#xff0c;用于在大規模、異構的服務…

Android Kotlin 動態注冊 Broadcast 的完整封裝方案

在 Kotlin 中封裝動態注冊的 Broadcast 可以讓你更優雅地管理廣播的注冊和注銷&#xff0c;避免內存泄漏。下面是一個完整的封裝方案&#xff1a; 基礎封裝類 import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import …

VGG改進(8):融合Self-Attention的CNN架構

1. 自注意力機制簡介自注意力機制是Transformer架構的核心組件&#xff0c;它能夠計算輸入序列中每個元素與其他所有元素的相關性。與CNN的局部感受野不同&#xff0c;自注意力機制允許模型直接建立遠距離依賴關系&#xff0c;從而捕獲全局上下文信息。在計算機視覺中&#xff…

ES6 面試題及詳細答案 80題 (33-40)-- Symbol與集合數據結構

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

PG-210-HI 山洪預警系統呼叫端:筑牢山區應急預警 “安全防線”

在山洪災害多發的山區&#xff0c;及時、準確的預警信息傳遞是保障群眾生命財產安全的關鍵。由 PG-210-HI 型號構成的山洪預警系統呼叫端主機&#xff0c;憑借其全面的功能、先進的特性與可靠的性能&#xff0c;成為連接管理員與群眾的重要應急樞紐&#xff0c;為山區構建起一道…

研學旅游產品設計實訓室:賦能產品落地,培養實用人才

1. 研學旅游產品設計實訓室的定位與功能 研學旅游產品設計實訓室是專門為學生提供研學課程與產品開發、模擬設計、項目推演、成果展示等實踐活動的教學空間。該實訓室應支持以下功能&#xff1a; 研學主題設計與目標制定&#xff1b; 課程內容與學習方法的選擇與整合&#xf…

4215kg輕型載貨汽車變速器設計cad+設計說明書

第一章 前言 3 1.1 變速器的發展環繞現狀 3 1.2 本次設計目的和意義 4 第二章 傳動機構布置方案分析及設計 5 2.1 傳動機構結構分析與類型選擇 5 2.2變速器主傳動方案的選擇 5 2.3 倒檔傳動方案 6 2..4 變速器零、部件結構方案設計 6 2.4.1 齒輪形式 …