基于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.22 | 80 | 反向代理、負載均衡、靜態資源處理 |
Tomcat應用服務器1 | 192.168.10.17 | 8080 | 處理動態請求(JSP) |
Tomcat應用服務器2 | 192.168.10.17 | 8081 | 處理動態請求(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
-
上傳Nginx 1.20.2安裝包至
/opt
目錄,解壓后進入源碼目錄:cd /opt tar zxvf nginx-1.20.2.tar.gz cd nginx-1.20.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
- 編譯并安裝:
make && make install
- 創建軟鏈接,方便全局調用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依賴)
-
上傳JDK 1.8安裝包至
/opt
目錄,解壓至/usr/local
: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 # 驗證JDK安裝 java -version
3.2 部署Tomcat 8080實例
-
上傳Tomcat 8.5.16安裝包至
/opt
目錄,解壓并重命名:tar zxvf apache-tomcat-8.5.16.tar.gz mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
-
創建測試動態頁面:
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>
-
配置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>
-
啟動Tomcat并驗證:
# 啟動Tomcat /usr/local/tomcat/bin/startup.sh # 驗證8080端口是否監聽 netstat -ntap | grep 8080
3.3 部署Tomcat 8081實例
通過復制8080實例快速創建8081實例,只需修改端口和測試頁面即可:
- 復制Tomcat目錄并命名為tomcat1:
cp -r /usr/local/tomcat /usr/local/tomcat1
- 修改Tomcat1端口(避免端口沖突):
需修改3處端口:vim /usr/local/tomcat1/conf/server.xml
- 關閉端口:
<Server port="8005" shutdown="SHUTDOWN">
→ 改為8006
- 監聽端口:
<Connector port="8080" protocol="HTTP/1.1">
→ 改為8081
- AJP端口:
<Connector port="8009" protocol="AJP/1.3">
→ 改為8010
- 關閉端口:
- 修改測試頁面(標記為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>
- 啟動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 靜態資源測試
- 訪問靜態首頁:
http://192.168.10.22
預期結果:顯示“這是Nginx處理的靜態頁面”,說明Nginx正常處理靜態HTML。 - 訪問靜態圖片:
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服務器。
六、常見問題與解決方案
- Tomcat啟動失敗,端口被占用?
執行netstat -ntap | grep 8080
查看占用端口的進程,殺死對應進程或修改Tomcat端口。 - 訪問JSP頁面返回404?
檢查Tomcat的server.xml
中<Context>
的docBase
路徑是否正確,確保index.jsp
存在于該路徑下。 - Nginx配置后無法轉發請求?
確認Nginx的upstream
中Tomcat的IP和端口是否正確,同時檢查Tomcat是否啟動、防火墻是否關閉。
七、總結
本文通過“Nginx+Tomcat”架構實現了反向代理、負載均衡與動靜分離,核心優勢如下:
- 高并發支持:Nginx處理靜態資源效率遠高于Tomcat,動靜分離減少了Tomcat的資源消耗;
- 負載均衡:通過權重分配請求,避免單臺Tomcat過載,提升服務可用性;
- 安全性提升:客戶端僅與Nginx交互,后端Tomcat不直接暴露在公網,降低攻擊風險。
該架構可根據實際業務需求擴展Tomcat服務器數量,進一步提升并發處理能力,適用于中小規模Web應用的生產環境部署。