Nginx反向代理與負載均衡部署

Nginx反向代理與負載均衡部署實戰指南

  • 前言
  • 一、規劃部署負載均衡和反向代理
  • 二、部署Nginx負載均衡器
      • 2.1. 準備基礎環境
      • 2.2. 創建Nginx運行用戶
      • 2.3. 編譯安裝Nginx
      • 2.4. 配置Nginx系統服務
      • 2.5. 驗證Nginx安裝
  • 三、部署后端2臺Tomcat應用服務器
      • 3.1. 安裝JDK
      • 3.2. 部署Tomcat實例1
      • 3.3. 部署Tomcat實例2
  • 四、動靜分離配置
      • 4.1. 配置Tomcat1的動態頁面
      • 4.2. 配置Tomcat2的動態頁面
      • 4.3. 配置Nginx的動靜分離
  • 五、測試效果
      • 5.1. 測試靜態頁面
      • 5.2. 測試靜態圖片
      • 5.3. 測試負載均衡
  • 結語

前言

??在現代Web架構中,高可用性高性能是企業應用的核心需求。隨著用戶量和業務量的增長,單臺服務器往往難以承受高并發請求,容易成為性能瓶頸。此時,反向代理負載均衡技術成為解決問題的關鍵——通過將請求分發到多臺后端服務器,既能提升系統的整體處理能力,又能隱藏后端服務器的真實IP,增強安全性。本教程將詳細介紹如何使用Nginx搭建反向代理與負載均衡集群,結合Tomcat實現動靜分離,為企業應用打造穩定、高效的Web服務環境。

一、規劃部署負載均衡和反向代理

在開始部署前,需明確各服務器的角色與IP地址,確保網絡環境暢通:

  • Nginx負載均衡器:作為前端入口,負責接收客戶端請求并將請求分發到后端Tomcat服務器,IP地址為192.168.10.10,監聽端口80
  • Tomcat應用服務器1:運行Java Web應用,IP地址為192.168.10.11,監聽端口8080
  • Tomcat應用服務器2:運行Java Web應用,IP地址為192.168.10.11,監聽端口8081(同一服務器部署多實例,模擬多臺服務器場景)。
    通過這種架構,Nginx作為“流量調度中心”,將客戶端請求均勻分發到后端Tomcat服務器,既提升了系統的并發處理能力,又降低了單臺服務器的壓力。

二、部署Nginx負載均衡器

Nginx的安裝與配置是搭建反向代理集群的第一步。以下是詳細步驟:

2.1. 準備基礎環境

首先關閉防火墻和SELinux,避免網絡訪問限制:

systemctl stop firewalld
setenforce 0

安裝Nginx所需的依賴包(用于編譯安裝):

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

2.2. 創建Nginx運行用戶

為保證安全性,Nginx以非root用戶身份運行:

useradd -M -s /sbin/nologin nginx

2.3. 編譯安裝Nginx

下載并解壓Nginx源碼包(以1.20.2版本為例):

cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/

進入解壓目錄,配置編譯選項:

cd /opt/nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \          # 安裝目錄
--user=nginx \                       # 運行用戶
--group=nginx \                      # 運行組
--with-file-aio \                    # 啟用文件異步IO(提升靜態文件處理性能)
--with-http_stub_status_module \     # 啟用狀態統計模塊(查看Nginx運行狀態)
--with-http_gzip_static_module \     # 啟用gzip靜態壓縮(減少傳輸體積)
--with-http_flv_module \             # 啟用FLV視頻偽流支持
--with-http_ssl_module \             # 啟用SSL模塊(支持HTTPS)
--with-stream \                      # 啟用stream模塊(支持四層負載均衡)
make && make install                 # 編譯并安裝

2.4. 配置Nginx系統服務

為了讓Nginx隨系統啟動自動運行,需創建systemd服務文件:

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         # 設置開機自啟

2.5. 驗證Nginx安裝

在瀏覽器中訪問http://192.168.10.10,若出現Nginx歡迎頁面,說明安裝成功。

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

Tomcat作為Java Web應用服務器,需部署兩個實例以實現負載均衡的目標。以下是詳細步驟:

3.1. 安裝JDK

Tomcat依賴JDK運行,首先安裝JDK 8:

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/

配置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

使環境變量生效:

source /etc/profile

3.2. 部署Tomcat實例1

解壓Tomcat源碼包:

tar zxvf apache-tomcat-8.5.16.tar.gz

移動到指定目錄并重命名:

mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat

啟動Tomcat并驗證端口:

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 
netstat -ntap | grep 8080              # 檢查8080端口是否監聽

3.3. 部署Tomcat實例2

復制Tomcat實例1的目錄,創建第二個實例:

cp -r /usr/local/tomcat /usr/local/tomcat1

修改Tomcat實例2的端口(避免與實例1沖突):
編輯/usr/local/tomcat1/conf/server.xml,修改以下端口:

<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
<Server port="8006" shutdown="SHUTDOWN" />

啟動Tomcat實例2并驗證端口:

/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 
netstat -ntap | grep 8081              # 檢查8081端口是否監聽

四、動靜分離配置

??動靜分離是提升Web性能的關鍵策略,通過將靜態資源(如HTML、CSS、JS、圖片)與動態資源(如JSP、Servlet)分開處理,減少Tomcat的負載壓力。以下是具體配置:

4.1. 配置Tomcat1的動態頁面

創建動態頁面目錄并編寫JSP文件:

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

添加以下內容(顯示動態頁面1的信息):

<%@ 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>

修改Tomcat1的server.xml,配置虛擬主機:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />
</Host>

重啟Tomcat1:

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 

4.2. 配置Tomcat2的動態頁面

復制Tomcat1的動態頁面目錄,修改內容(當前tomcat為同一服務器):

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

添加以下內容(顯示動態頁面2的信息):

<%@ 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>

修改Tomcat2的server.xml,配置虛擬主機:

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat1/webapps/test" path="" reloadable="true" />
</Host>

重啟Tomcat2:

/usr/local/tomcat/tomcat1/bin/shutdown.sh 
/usr/local/tomcat/tomcat1/bin/startup.sh 

4.3. 配置Nginx的動靜分離

編輯Nginx的主配置文件:

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

http塊中添加upstream(負載均衡服務器池)和動靜分離配置:

http {# 定義負載均衡服務器池(權重可根據服務器性能調整)upstream tomcat_server {server 192.168.10.11:8080 weight=1;server 192.168.10.11:8081 weight=1;}server {listen 80;server_name www.kgc.com;charset utf-8;# 動態請求轉發到Tomcat集群 {~ .*\,jsp$(匹配大小寫)|~*\.jsp$(不匹配大小寫)}location ~ .*\.jsp$ {proxy_pass http://tomcat_server;proxy_set_header Host $host;               # 傳遞客戶端請求的Host頭proxy_set_header X-Real-IP $remote_addr;   # 傳遞客戶端真實IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 傳遞代理鏈IP}# 靜態圖片請求(直接由Nginx處理,提升性能)location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;                               # 設置靜態資源緩存時間(10天)}# 靜態頁面請求location / {root html;index index.html index.htm;}}
}

檢查Nginx配置語法并重啟:

/usr/local/nginx/sbin/nginx -t         # 檢查配置是否正確
systemctl restart nginx.service        # 重啟Nginx

五、測試效果

5.1. 測試靜態頁面

??在瀏覽器中訪問http://192.168.10.10/,若顯示Nginx的默認靜態頁面,說明靜態頁面配置成功。
在這里插入圖片描述

5.2. 測試靜態圖片

??將圖片1.png復制到/usr/local/nginx/html/img目錄,訪問http://192.168.10.10/1.png,若顯示圖片,說明靜態圖片配置成功。
在這里插入圖片描述

5.3. 測試負載均衡

??在瀏覽器中反復訪問http://192.168.10.11/index.jsp,若交替顯示“動態頁面 1”和“動態頁面 2”的內容,說明負載均衡配置成功(Nginx將請求分發到Tomcat1和Tomcat2)。
在這里插入圖片描述
在這里插入圖片描述

結語

??通過本教程的部署,我們成功搭建了Nginx反向代理與負載均衡集群,并結合Tomcat實現了動靜分離。這種架構不僅提升了Web應用的并發處理能力(Nginx處理靜態請求,Tomcat處理動態請求),還通過負載均衡將請求分發到多臺服務器,降低了單臺服務器的壓力,增強了系統的高可用性
??在實際生產環境中,還可以進一步優化配置:如開啟Nginx的gzip壓縮(減少傳輸體積)、配置SSL證書(實現HTTPS加密)、設置健康檢查(自動剔除故障服務器)等。此外,結合Docker或Kubernetes等容器技術,可以實現更靈活的動態擴展,應對突發的流量高峰。
??反向代理與負載均衡是企業Web架構的核心組件,掌握其部署與配置技能,將為打造高性能、高可用的Web服務奠定堅實基礎。

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

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

相關文章

從源碼和設計模式深挖AQS(AbstractQueuedSynchronizer)

AQS 概念 AbstractQueuedSynchronizer&#xff08;AQS&#xff09; 是 Java 并發包 (java.util.concurrent.locks) 的核心基礎框架&#xff0c;它的實現關鍵是先進先出 (FIFO) 等待隊列和一個用volatile修飾的鎖狀態status。具體實現有 : ReentrantLock、Semaphore、CountDownL…

Dart → `.exe`:Flutter 桌面與純命令行雙軌編譯完全指南

Dart → .exe&#xff1a;Flutter 桌面與純命令行雙軌編譯完全指南 關鍵詞&#xff1a;Dart、Flutter、Windows、可執行文件、桌面端、CLI、交叉編譯 1. 前言 很多開發者以為 Dart 只能跑在 AOT 移動端或 Web 端&#xff0c;其實 官方工具鏈早已支持一鍵輸出 Windows 原生 .ex…

互聯網接入網中PPPoE和PPP協議

<摘要> PPPoE和PPP是寬帶接入網絡中至關重要的協議組合&#xff0c;其中PPP提供通用的點對點鏈路層解決方案&#xff0c;而PPPoE則是在以太網架構上擴展PPP應用的技術橋梁。本文從技術演進視角系統解析了兩者的內在關聯與本質區別&#xff1a;PPP作為成熟鏈路層協議&…

詳細解析SparkStreaming和Kafka集成的兩種方式的區別和優劣

spark streaming是基于微批處理的流式計算引擎&#xff0c;通常是利用spark core或者spark core與spark sql一起來處理數據。在企業實時處理架構中&#xff0c;通常將spark streaming和kafka集成作為整個大數據處理架構的核心環節之一。 針對不同的spark、kafka版本&#xff0…

Kite Compositor for Mac v2.1.2 安裝教程|DMG文件安裝步驟(Mac用戶必看)

Kite Compositor? 是一款專為 ?macOS? 設計的 ?輕量級界面設計 & 動畫制作工具&#xff0c;它可以讓你像拼圖一樣直觀地 ?創建、編輯和預覽用戶界面&#xff08;UI&#xff09;以及動畫效果。 一、下載文件 首先&#xff0c;你得先把這個 ?Kite Compositor for Mac …

【逆向】Android程序靜態+動態分析——去殼

對提供的 CrackmeTest.apk 進行逆向分析&#xff0c;程序含有反調試機制&#xff08;加殼&#xff09;&#xff0c;通過靜態補丁反反調試&#xff08;去殼&#xff09;&#xff0c;再動態調試獲取其中密碼。 目錄 環境 基礎 實驗內容 靜態分析 動態分析 反反調試 再動態…

Rust 開發環境安裝與 crates.io 國內源配置(Windows / macOS / Linux 全流程)

Rust 這幾年在系統編程、WebAssembly、區塊鏈、后端服務領域越來越火&#xff0c;很多開發者都在嘗試用它做一些新項目。 但是國內安裝 Rust 開發環境時&#xff0c;經常遇到 安裝慢、依賴拉不下來、crates.io 超時 等問題。本文結合個人踩坑經驗&#xff0c;整理了一份 跨平臺…

Nginx SSL/TLS 配置

Nginx SSL/TLS 配置指南&#xff1a;從入門到安全強化前言一、環境準備&#xff1a;Nginx安裝配置1.1. **EPEL倉庫配置**&#xff1a;1.2. **Nginx安裝**&#xff1a;1.3. **服務啟停管理**&#xff1a;1.4. **服務狀態驗證**&#xff1a;二、SSL/TLS證書獲取方案方案A&#xf…

Java ReentrantLock和synchronized的相同點與區別

1. 核心概念與定位synchronized&#xff1a;Java 內置的關鍵字&#xff0c;屬于 JVM 層面的隱式鎖。通過在方法或代碼塊上聲明&#xff0c;自動實現鎖的獲取與釋放&#xff0c;無需手動操作。設計目標是提供簡單易用的基礎同步能力&#xff0c;適合大多數常規同步場景。Reentra…

【npm】npm 包更新工具 npm-check-updates (ncu)

npm 包太多了&#xff0c;一個項目有那么多依賴包&#xff0c;它們的升級管理需要一個工具&#xff1a;npm-check-updates&#xff1a; 安裝&#xff1a; npm install -g npm-check-updates安裝之后&#xff0c;就可以使用它的命令&#xff1a;ncu 查看哪些包可以升級&#xff…

go資深之路筆記(一) Context

一、 Context 的正確使用與底層原理 1.結構體 type Context interface {// Deadline 返回此 Context 被取消的時間點。// 如果未設置截止時間&#xff0c;ok 為 false。Deadline() (deadline time.Time, ok bool)// Done 返回一個 channel。當 Context 被取消或超時后&#xff…

VS2022 + Qt5.9 中文亂碼/項目設置utf-8編碼

&#x1f6e0;? 解決QT5.9 VS2022中文亂碼的全面方案 &#x1f4c1; 1. 檢查文件編碼與編譯器設置 確保源文件是 帶BOM的UTF-8 編碼對MSVC編譯器很重要。VS2022默認可能使用本地編碼&#xff08;如GB2312&#xff09;解析源文件&#xff0c;即使文件以UTF-8保存。 查看和設置…

數據庫--MySQL數據管理

數據庫–MySQL數據管理 文章目錄數據庫--MySQL數據管理1.外鍵管理2.數據庫數據管理3.DML語言3.1添加數據3.2修改數據3.3刪除數據4.練習1.外鍵管理 外鍵概念 如果公共關鍵字在一個關系中是主關鍵字&#xff0c;那么這個公共關鍵字被稱為另一個關系的外鍵。由此可見&#xff0c;…

【C++練習】13.C++輸出九九乘法表的方法詳解

目錄 C++輸出九九乘法表的方法詳解 方法1:雙重for循環(最基礎) 思考: 代碼分析: 特點: 方法2:使用while循環 思考: 代碼分析: 特點: 方法3:使用遞歸實現 思考: 代碼分析: 特點: 方法4:格式化輸出(對齊美觀) 思考: 代碼分析: 特點: 方法5:使用函數封裝 思考…

MVC及其衍生

MVC 把軟件分成模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三個基本部分。 事實上對應著 Controller——輸入 用戶交互&#xff0c;將輸入處理成Controller能處理的形式 Model——處理 描述狀態、邏輯規律…

微碩WINSOK MOS管WSF3089,賦能汽車轉向系統安全升級

隨著汽車電子化程度不斷提高&#xff0c;轉向系統對高效功率器件的需求日益增長。微碩WINSOK推出的N溝道Trench MOS管WSF3089&#xff0c;以30 V/72 A大電流、4.5 mΩ超低導通電阻和TO-252-2L緊湊封裝&#xff0c;為EPS&#xff08;電動助力轉向&#xff09;電機驅動、電源管理…

淘寶拍立淘接口的接入與應用||item_search_img-按圖搜索淘寶商品(拍立淘)

淘寶拍立淘接口的接入與應用如下&#xff1a;接入流程注冊與認證&#xff1a;開發者賬號注冊&#xff1a;訪問淘寶開放平臺&#xff0c;進行開發者賬號注冊。創建應用&#xff1a;在控制臺創建新應用&#xff0c;獲取 App Key 和 App Secret&#xff0c;這是接口調用的憑證。申…

Python學習-day8 元組tuple

元組&#xff08;Tuple&#xff09;是Python中一種不可變的序列類型&#xff0c;用于存儲多個有序元素。與列表&#xff08;List&#xff09;類似&#xff0c;但元組一旦創建后不能修改&#xff08;不可添加、刪除或修改元素&#xff09;&#xff0c;這使得它在安全性、性能優化…

大數據畢業設計選題推薦-基于大數據的國家醫用消耗選品采集數據可視化分析系統-Hadoop-Spark-數據可視化-BigData

?作者主頁&#xff1a;IT畢設夢工廠? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

二次學習C語言補充2

文章目錄表棧、隊列、二叉樹一、二叉樹二、表棧三、隊列鏈表一、單向鏈表二、循環鏈表、雙向鏈表和雙向循環鏈表預處理一、預處理二、宏定義文件文件操作補充本篇文章是對二次學習C語言12——文件操作 二次學習C語言14——預處理及模塊化 二次學習C語言15——鏈表 二次學習C語言…