Nginx+Tomcat負載均衡集群詳解
一、Tomcat 基礎與單節(jié)點部署
(一)Tomcat 概述
名稱由來:由 Sun 公司詹姆斯?鄧肯?戴維森開發(fā),后貢獻給 Apache 軟件基金會。因希望項目以能自我照顧的動物命名,最終定名為 “Tomcat”(公貓),其 Logo 也設計為公貓形象。早期項目名為 “Catalina”,故安裝后可見許多相關目錄和文件。
應用場景:免費開源的輕量級 Web 應用服務器,適用于中小型系統(tǒng)及并發(fā)用戶不多的場合,是開發(fā)調(diào)試 JSP 程序的首選。雖具備處理 HTML 頁面功能,但處理靜態(tài) HTML 能力不及 Apache 或 Nginx,通常作為 Servlet 和 JSP 容器運行于后端,與前端 Web 服務器(如 Apache、Nginx)及數(shù)據(jù)庫配合工作。
(二)單節(jié)點部署案例
1. 案例環(huán)境
- 主機:服務器 Tomcat
- IP 地址:192.168.10.101
- 操作系統(tǒng):OpenEuler24
- 應用:apache-tomcat-9.0.8
2. 實施準備
# 關閉防火墻 systemctl stop firewalld setenforce 0
3. 安裝 JDK
JDK(Java Development Kit)是 Java 語言的軟件開發(fā)工具包,包含 JVM(Java 虛擬機),用于解釋 Java 字節(jié)碼,實現(xiàn)跨平臺性。
JDK 版本需與 Tomcat 兼容,下載對應版本的 JDK 安裝包并安裝。
4. 查看 JDK 安裝情況
java -version
若輸出 Java 版本信息(如 “java version "1.8.0_171"”),則說明 JDK 已安裝。
5. 安裝配置 Tomcat
# 解壓Tomcat安裝包 tar xf apache-tomcat-9.0.8.tar.gz # 移動并重命名文件夾 mv apache-tomcat-9.0.8 /usr/local/tomcat9
6. 啟動 Tomcat
/usr/local/tomcat9/bin/startup.sh
啟動后,默認監(jiān)聽 8080 端口,可通過以下命令查看端口監(jiān)聽情況:
netstat -anpt | grep 8080
7. 訪問測試
在瀏覽器中輸入 “http://192.168.10.101:8080/”,若出現(xiàn) Tomcat 歡迎界面,則表示啟動成功。
8. 關閉 Tomcat
/usr/local/tomcat9/bin/shutdown.sh
(三)Tomcat 目錄與配置文件說明
主要目錄:
- bin/:存放啟動和關閉 Tomcat 的腳本文件(如 startup.sh、shutdown.sh)。
- conf/:存放全局配置文件,重要文件包括 server.xml(主配置文件)、web.xml(Servlet 等配置)、tomcat-users.xml(管理用戶配置)。
- lib/:存放 Tomcat 運行所需的庫文件(JAR 包)。
- logs/:存放日志文件。
- webapps/:主要 Web 發(fā)布目錄,用于部署應用程序。
- work/:存放 JSP 編譯后生成的 class 文件。
主配置文件 server.xml:
結(jié)構(gòu)組成:由<Server>、<Service>、<Connector/>、<Engine>、<Host>、<Context>等元素構(gòu)成。
關鍵配置:
- 端口配置:<Connector port="8080" protocol="HTTP/1.1" .../> 用于配置 HTTP 訪問端口;<Connector port="8009" protocol="AJP/1.3" .../> 用于配置 AJP 連接器端口,供其他 Web 服務器代理請求。
- 虛擬主機配置:<Host name="localhost"appBase="webapps" ...> 定義虛擬主機,appBase 指定應用程序基礎目錄,可通過<Context>元素配置具體 Web 應用的路徑。
(四)建立 Java Web 站點
創(chuàng)建站點目錄
mkdir -pv /web/webapp1
創(chuàng)建測試頁面 index.jsp
vim /web/webapp1/index.jsp
內(nèi)容如下:
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test1 page</title> </head> <body> <%out.println("動態(tài)頁面1,http://www.test1.com");%> <div>靜態(tài)頁面的圖片1</div><br><img src="logo.jpg"> </body> </html>
修改 server.xml 配置
在<Host>元素中添加<Context>配置,將站點路徑指向 /web/webapp1:
<Context docBase="/web/webapp1" path="" reloadable="true"/>
重啟 Tomcat
/usr/local/tomcat9/bin/shutdown.sh /usr/local/tomcat9/bin/startup.sh
訪問測試
在瀏覽器中輸入 “http://192.168.10.101:8080/”,應顯示自定義的 JSP 頁面內(nèi)容。
二、Nginx+Tomcat 負載均衡與動靜分離群集搭建
(一)案例分析
需求背景:單臺 Tomcat 存在單點故障風險,且處理靜態(tài)資源效率低。Nginx 具有高性能、低資源消耗的特點,可作為反向代理和負載均衡器,與 Tomcat 結(jié)合實現(xiàn)動靜分離,提升站點性能和可靠性。
拓撲架構(gòu):Nginx 作為前端負載均衡器,負責處理靜態(tài)資源請求和分發(fā)動態(tài)請求到后端 Tomcat 服務器(Tomcat1 和 Tomcat2)。
(二)案例環(huán)境
主機 | IP 地址 | 操作系統(tǒng) | 應用 |
---|---|---|---|
Tomcat1 服務器 | 192.168.10.101 | OpenEuler24 | apache-tomcat-9.0.8 |
Tomcat2 服務器 | 192.168.10.102 | OpenEuler24 | apache-tomcat-9.0.8 |
Nginx 服務器 | 192.168.10.103 | OpenEuler24 | nginx-1.26.3 |
(三)Tomcat2 服務器配置
關閉防火墻(同 Tomcat1)
systemctl stop firewalld setenforce 0
安裝 JDK 和 Tomcat(版本與 Tomcat1 一致)
# 安裝JDK(若未安裝) # 解壓Tomcat安裝包 tar xf apache-tomcat-9.0.8.tar.gz # 移動并重命名 mv apache-tomcat-9.0.8 /usr/local/tomcat9
創(chuàng)建站點目錄并配置
mkdir -pv /web/webapp1
修改 server.xml 中的<Context>配置,指向 /web/webapp1:
<Context docBase="/web/webapp1" path="" reloadable="true"/>
創(chuàng)建測試頁面 index.jsp
vim /web/webapp1/index.jsp
內(nèi)容如下:
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>JSP test2 page</title> </head> <body> <%out.println("動態(tài)頁面2,http://www.test2.com");%> <div>動態(tài)頁面的圖片2</div><br><img src="logo.jpg"> </body> </html>
啟動 Tomcat2 并測試
/usr/local/tomcat9/bin/startup.sh
在瀏覽器中輸入 “http://192.168.10.102:8080/”,查看頁面是否正確顯示。
(四)Nginx 服務器配置
關閉防火墻
systemctl stop firewalld setenforce 0
安裝依賴軟件包
dnf install -y gcc make pcre-devel zlib-devel openssl-devel perl-ExtUtils-MakeMaker
創(chuàng)建 Nginx 用戶
useradd -M -s /sbin/nologin nginx
解壓并安裝 Nginx
tar zxf nginx-1.26.3.tar.gz cd nginx-1.26.3 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-pcre make && make install
配置 nginx.conf
vim /usr/local/nginx/conf/nginx.conf
在 http {} 塊中添加負載均衡服務器列表:
upstream tomcat_server { server 192.168.10.101:8080 weight=1; server 192.168.10.102:8080 weight=1; }
在 server {} 塊中配置動靜分離規(guī)則:
location ~ \.jsp$ { proxy_set_header HOST $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Client-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://tomcat_server; } location ~* \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root /usr/local/nginx/html/img; expires 30d; } location / { root html; index index.html index.htm; }
準備靜態(tài)圖片
mkdir /usr/local/nginx/html/img cp /root/logo.jpg /usr/local/nginx/html/img
測試配置文件
/usr/local/nginx/sbin/nginx -t
啟動 Nginx 服務
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
查看服務進程和端口
ps aux | grep nginx netstat -anpt | grep nginx
(五)測試效果
- 靜態(tài)頁面測試:在瀏覽器中輸入 “http://192.168.10.103/”,應顯示 Nginx 默認的靜態(tài)頁面。
- 負載均衡測試:在瀏覽器中輸入 “http://192.168.10.103/index.jsp”,不斷刷新頁面,應交替顯示 Tomcat1 和 Tomcat2 的測試頁面,表明負載均衡生效。
三、心得
通過 Nginx 與 Tomcat 的結(jié)合,實現(xiàn)了動靜分離和負載均衡,提升了 Web 站點的性能、可擴展性和穩(wěn)定性。Nginx 高效處理靜態(tài)資源,減輕了 Tomcat 的壓力,使其專注于動態(tài)請求處理。這種架構(gòu)是現(xiàn)代 Web 應用優(yōu)化的重要實踐,適用于中小型網(wǎng)站及高并發(fā)場景的初步搭建。在實際生產(chǎn)環(huán)境中,還可進一步結(jié)合緩存機制、安全策略等,進一步提升系統(tǒng)的可靠性和用戶體驗。
四、Tomcat 核心組件解析
(一)Server 與 Service
Server
- 代表整個 Catalina Servlet 容器,是 Tomcat 的頂層容器,負責管理所有 Service 組件,監(jiān)聽關閉端口(默認 8005),通過
SHUTDOWN
命令終止服務。 - 配置示例(s2erver.xml):
<Server port="8005" shutdown="SHUTDOWN"> <!-- 包含多個Service --> </Server>
Service
- 是一個或多個 Connector 與一個 Engine 的組合,負責接收請求并將其交給 Engine 處理。
- 每個 Serv3ice 可定義多個 Connector(如 HTTP 和 AJP 連接器),但只能有一個 Engine:
<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" /> <Engine name="Catalina" defaultHost="localhost"> <!-- 虛擬主機配置 --> </Engine> </Service>
(二)Connector:請求入口
功能與類型
- 監(jiān)聽指定端口,接收客戶端請求并轉(zhuǎn)發(fā)給 Engine,同時將響應返回給客戶端。
典型 Co4nnector:
- HTTP Connector(端口 8080):直接處理瀏覽器的 HTTP 請求,協(xié)議為
HTTP/1.1
,用于動態(tài)頁面訪問。 - AJ5P Connector(端口 8009):接收其他 Web 服務器(如 Nginx)的代理請求,協(xié)議為
AJP/1.3
,用于動靜分離場景。
關鍵配置參6數(shù)
port
:監(jiān)聽端口(如 8080)。protocol
:協(xié)議類型(如HTTP/1.1
或AJP/1.3
)。connectionTimeout
:連接超時時間(單位毫秒,默認 20000ms)。redirectPort
:HTTPS 請求重定向端口(默認 8443)。
(三)Eng1ine 與 Host:請求處理與虛擬主機
Engine
- 作為 Service 的核心組件,管理多個虛擬主機(Host),負責將請求匹配到對應的 Host 處理。
- 包含一個默認7虛擬主機,當請求無法匹配任何 Host 時,由默認 Host 處理:
<Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps"> <!-- 具體Host配置 --> </Host> </Engine>
Host(虛擬主機)
- 對應一個域名(如
localhost
),通過appBase
指定 Web 應用的基礎目錄(默認webapps
),可部署多個 Web 應用(Context)。 - 匹配規(guī)則8:根據(jù)請求的域名或 IP 匹配 Host,若無法匹配則使用 Engine 的默認 Host。
示例配置:
<Host name="www.test.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true"> <Context path="/app1" docBase="/data/webapps/app1" /> </Host>
unpackWARs
:是否自動解壓 WAR 包(默認true
)。autoDeploy
:是否自動部署更新的應用(默認true
)。
(四)Context:Web 應用容器
功能
- 代表一個 Web 應用,對應一個目錄或 WAR 包,包含 Servlet、JSP、配置文件等資源。
- 通過
doc{insert\_element\_8\_}Base
指定物理路徑,path
指定訪問路徑(如path="/app"
表示通過http://host:port/app
訪問)。
關鍵配置
reloadable
:是否監(jiān)聽類文件變化并自動重啟(開發(fā)環(huán)境可用,生產(chǎn)環(huán)境建議關閉)。sessi{insert\_element\_9\_}onTimeout
:會話超時時間(分鐘,默認 30 分鐘)。welcome-file-list
:歡迎頁面列表(如index.jsp
、index.html
)。
(五)組件協(xié)作流程
請求鏈路
客戶端請求 → Connector(接收) → Engine(路由) → Host(匹配虛擬主機) → Context(處理Web應用) → 返回響應
示例場景
用戶訪問http://www.test.com/app1/index.jsp
:
- Connector(8080 端口)接收 HTTP 請求。
- Engine 根據(jù)域名
www.test.com
匹配到對應的 Host。 - Host 根據(jù)
path="/app1"
找到對應的 Context,調(diào)用 JSP 引擎編譯并執(zhí)行index.jsp
,返回動態(tài)內(nèi)容。
五、Nginx 負載均衡策略與優(yōu)化
(一)負載均衡策略配置
輪詢(默認)
- 按順序依次將請求分發(fā)到后端服務器,權重相同則均勻分配,適用于服務器性能一致的場景。
- 配置示例(nginx.conf):
upstream tomcat_server { server 192.168.10.101:8080; server 192.168.10.102:8080; }
權重輪詢(weight)
- 通過
weight
參數(shù)指定服務器處理請求的優(yōu)先級,權重越高分配概率越大,適用于服務器性能不均的場景。 - 配置示例:
upstream tomcat_server { server 192.168.10.101:8080 weight=2; # 處理2倍請求 server 192.168.10.102:8080 weight=1; }
IP 哈希(ip_hash)
- 根據(jù)客戶端 IP 地址生成哈希值,將同一 IP 的請求固定分發(fā)到同一服務器,用于保持會話一致性(如未使用 Session 共享時)。
- 配置示例:
upstream tomcat_server { ip_hash; server 192.168.10.101:8080; server 192.168.10.102:8080; }
(二)健康檢查機制
被動檢查(默認)
- Nginx 默認通過請求響應狀態(tài)判斷服務器是否存活,若返回 5xx 錯誤或超時,則認為服務器故障,自動跳過(故障恢復后重新加入)。
- 配置參數(shù):
upstream tomcat_server { server 192.168.10.101:8080 max_fails=2 fail_timeout=30s; }
max_fails
:允許失敗次數(shù)(默認 1 次)。fail_timeout
:故障超時時間(默認 10 秒,期間不再轉(zhuǎn)發(fā)請求)。
主動檢查(第三方模塊)
- 使用
ngx_http_upstream_check_module
等模塊,定期向服務器發(fā)送健康檢查請求(如/health
接口),主動檢測狀態(tài)。 - 示例配置:
upstream tomcat_server { server 192.168.10.101:8080; check interval=5000 rise=2 fall=3 timeout=3000 type=http; check_http_send "GET /health HTTP/1.0\r\n\r\n"; check_http_expect_1xx any; }
(三)動靜分離優(yōu)化實踐
靜態(tài)資源緩存配置
- 通過
expires
指令設置靜態(tài)資源(如圖片、CSS、JS)的瀏覽器緩存時間,減少重復請求。 - 配置示例:
location ~* \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ { root /usr/local/nginx/html/img; expires 30d; # 緩存30天 add_header Cache-Control "public"; }
壓縮優(yōu)化
- 啟用 Gzip 壓縮,減少動態(tài)頁面?zhèn)鬏斄髁浚ㄐ?Tomcat 配合設置響應頭)。
- Nginx 配置:
http { gzip on; gzip_types text/plain text/css application/json application/javascript text/html; gzip_comp_level 6; # 壓縮級別(1-9,默認6) }
防盜鏈配置
- 通過
valid_referers
阻止非法域名引用靜態(tài)資源,保護圖片、文件等資源。 - 配置示例:
location ~* \.(gif|jpg|jpeg|png)$ { valid_referers none blocked www.test.com test.com; if ($invalid_referer) { return 403; } }
六、生產(chǎn)環(huán)境部署注意事項
(一)安全加固
端口與防火墻
- 僅開放必要端口(如 Nginx 的 80/443、Tomcat 的 8080/8009),關閉其他端口。
- 使用防火墻(如 Firewalld、UFW)限制 IP 訪問,僅允許可信 IP 連接后端 Tomcat。
用戶權限
- Nginx 和 Tomcat 均使用非 root 用戶運行(如
nginx
、tomcat
用戶),避免權限過高導致安全風險。 - 修改文件權限,確保配置文件和日志目錄僅可被管理員讀寫:
chown -R nginx:nginx /usr/local/nginx chown -R tomcat:tomcat /usr/local/tomcat9
HTTPS 配置
- 為 Nginx 添加 SSL 證書,啟用 HTTPS 加密傳輸,提升數(shù)據(jù)安全性。
- 配置示例:
server { listen 443 ssl; server_name www.test.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384; }
(二)性能調(diào)優(yōu)
Nginx worker 進程優(yōu)化
worker_processes
:設置為服務器 CPU 核心數(shù),充分利用多核性能。worker_connections
:單個進程最大連接數(shù)(需配合ulimit -n
調(diào)整系統(tǒng)文件描述符限制)。
worker_processes 4; # 假設4核CPU events { worker_connections 10240; }
Tomcat 線程池調(diào)整
- 修改 server.xml 中的
<Connector>
配置,調(diào)整線程池參數(shù):
<Connector port="8080" protocol="HTTP/1.1"> <Executor name="tomcatExecutor" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="20" maxSpareThreads="50" maxQueueSize="100" /> </Connector>
maxThreads
:最大工作線程數(shù)(默認 200,根據(jù)并發(fā)量調(diào)整)。maxQueueSize
:請求隊列最大長度(防止內(nèi)存溢出)。
連接超時優(yōu)化
- 縮短 Nginx 和 Tomcat 的超時時間,釋放無效連接:
# Nginx配置 proxy_connect_timeout 5s; proxy_read_timeout 10s; proxy_send_timeout 10s;
# Tomcat配置(server.xml) <Connector port="8080" connectionTimeout="20000" />
(三)監(jiān)控與日志
Nginx 日志配置
開啟訪問日志和錯誤日志,記錄詳細請求信息以便排查問題:
http { access_log logs/access.log main; error_log logs/error.log error; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; }
Tomcat 日志分析
主要日志文件:
catalina.out
:控制臺輸出日志,包含啟動信息和錯誤堆棧。localhost_access_log.txt
:訪問日志,記錄請求路徑、響應狀態(tài)等。
配置日志切割9,避免單文件過大:
# 使用logrotate工具 cat /etc/logrotate.d/tomcat /usr/local/tomcat9/logs/*.log { daily rotate 7 compress missingok notifempty }
監(jiān)控工具集成
使用 Prometheus+Grafana 監(jiān)控 Nginx 和 Tomcat 的性能指標(如請求量、響應時間、服務器負載)。
Nginx 可通過ngx_http_stub_status_module
暴露狀態(tài)數(shù)據(jù):
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
七、常見問題與解決方案
(一)動態(tài)頁面無法訪問
排查步驟
- 檢查 Nginx 代理配置:確認
location ~ \.jsp$
規(guī)則是否正確,proxy_pass
是否指向負載均衡組(如http://tomcat_server
)。 - 檢查 To13mcat 服務狀態(tài):確保 Tomcat 已啟動,端口(8080)監(jiān)聽正常,通過
curl http://localhost:8080
測試本地訪問。
查看日志:
- Nginx 錯誤日志(
/usr/local/nginx/logs/error.log
)是否有代理連接失敗信息。 - Tomcat 控制臺日志(
catalina.out
)是否有 JSP 編譯錯誤或 Servlet 異常。
常見原因
- Nginx 與 Tomcat 之間網(wǎng)絡不通(如防火墻攔截、IP / 端口錯誤)。
- Tomcat 的
server.xml
中未正確配置 Context 路徑,導致請求無法映射到實際文件。
(二)靜態(tài)資11源加載失敗
排查步驟
- 檢查 Nginx 路徑配置:確認
location ~* \.(gif|jpg|png)$
中的root
路徑是否正確(如/usr/local/nginx/html/img
),文件是否存在。 - 檢查文件14權限:確保 Nginx 用戶(如
nginx
)對靜態(tài)資源目錄有讀取權限。 - 測試直接訪問:通過
http://192.168.10.103/img/logo.jpg
直接訪問圖片,查看是否返回 404 或 403 錯誤。
解決方案
修正root
或alias
路徑,確保與實際文件路徑一致(root
為絕對路徑,alias
為自定義路徑)。
賦予目錄讀權限:
chmod -R o+r /usr/local/nginx/html/img
(三)負載均衡未生效
排查步驟
- 檢查 upstream 配置:確認
server
IP 和端口是否正確,權重設置是否合理,是否遺漏ip_hash
等策略。 - 清除瀏覽12器緩存:刷新頁面時按
Ctrl+F5
強制清除緩存,避免瀏覽器緩存導致請求未分發(fā)到后端。 - 查看請求頭:通過瀏覽器開發(fā)者工具查看
X-Forwarded-For
頭,確認是否包含后端 Tomcat 的 IP 地址。
常見原因
- Nginx 配置未重新加載:修改
nginx.conf
后需執(zhí)行nginx -s reload
使配置生效。 - 后端服務器故障:某臺 Tomcat 未啟動或端口被占用,Nginx 自動將其從負載均衡組中剔除。
八、擴展與高可用架構(gòu)
(一)增加 Tomcat 節(jié)點
步驟說明
新增 Tomcat 服務器(如 192.168.10.104),重復 “Tomcat2 服務器配置” 步驟,確保 JDK 和 Tomcat 版本一致,站點目錄和測試頁面配置正確。
修改 Nginx 的upstream
配置,添加新節(jié)點:
upstream tomcat_server { server 192.168.10.101:8080 weight=1; server 192.168.10.102:8080 weight=1; server 192.168.10.104:8080 weight=1; # 新增節(jié)點 }
- 執(zhí)行
nginx -s reload
重新加載配置,新節(jié)點即可參與負載均衡。
Session 共享方案
問題背景:負載均衡場景下,若客戶端請求被分發(fā)到不同 Tomcat 節(jié)點,未共享的 Session 會導致用戶狀態(tài)丟失。
解決方案:
- Tomcat 自帶 Session 復制:在
server.xml
的<Engine>
或<Host>
中配置Cluster
元素,實現(xiàn) Session 在節(jié)點間同步(適用于小規(guī)模集群,但存在性能開銷)。
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
- 分布式緩存(如 Redis):使用
tomcat-redis-session-manager
等插件,將 Session 存儲到 Redis 中,所有 Tomcat 節(jié)點共享緩存數(shù)據(jù)。
# 添加Maven依賴(Tomcat 9為例) <dependency> <groupId>com.orangefunction</groupId> <artifactId>tomcat-redis-session-manager</artifactId> <version>2.0.3</version> </dependency>
配置context.xml
:
<Context> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/> <SessionHandler className="com.orangefunction.tomcat.redissessions.RedisSessionHandler" host="192.168.10.105" port="6379" database="0" /> </Context>
(二)Nginx 高可用(主從 / 集群)
主從模式(Keepalived)
- 架構(gòu)說明:通過 Keepalived 實現(xiàn) Nginx 主節(jié)點(Master)和備用節(jié)點(Backup),共享虛擬 IP(VIP)。當主節(jié)點故障時,備用節(jié)點自動接管 VIP,保證服務不中斷。
- 配置步驟:
安裝 Keepalived:
dnf install -y keepalived
主節(jié)點配置(/etc/keepalived/keepalived.conf):
global_defs { router_id NGINX_MASTER } vrrp_instance VI_1 { state MASTER interface eth0 # 綁定網(wǎng)卡 virtual_router_id 51 # 虛擬路由ID(主從一致) priority 100 # 主節(jié)點優(yōu)先級(備用節(jié)點設為90) advert_int 1 # 心跳間隔(秒) authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.10.200 # 虛擬IP } }
備用節(jié)點配置:除state
改為BACKUP
、priority
降低外,其余與主節(jié)點一致。
健康檢查腳本:在 Keepalived 中配置腳本檢測 Nginx 進程,若主節(jié)點 Nginx 停止,自動切換至備用節(jié)點:
- bash
script_check_nginx.sh: #!/bin/bash if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then systemctl stop keepalived fi
vrrp_script check_nginx { script "/etc/keepalived/script_check_nginx.sh" interval 2 }
Nginx 集群(多節(jié)點負載均衡)
- 架構(gòu)說明:部署多個 Nginx 節(jié)點,前端通過 DNS 輪詢或硬件負載均衡器(如 F5)分發(fā)請求,避免單節(jié)點故障。
- 適用場景:高并發(fā)場景下,通過橫向擴展 Nginx 節(jié)點提升整體處理能力。
(三)日志集中管理
ELK Stack 方案
組件說明:
- Elasticsearch:存儲和檢索日志數(shù)據(jù)。
- Logstash:收集、過濾 Nginx 和 Tomcat 日志,并發(fā)送至 Elasticsearch。
- Kibana:可視化展示日志統(tǒng)計信息。
Nginx 日志輸出到 Logstash:
log_format json_log '{"time":"$time_iso8601",' '"remote_addr":"$remote_addr",' '"request":"$request",' '"status":"$status",' '"body_bytes_sent":"$body_bytes_sent",' '"http_referer":"$http_referer",' '"http_user_agent":"$http_user_agent"}'; access_log /usr/local/nginx/logs/access.json json_log;
Logstash 配置:
input { file { path => "/usr/local/nginx/logs/access.json" type => "nginx" codec => json_lines } } output { elasticsearch { hosts => ["192.168.10.106:9200"] index => "nginx-%{+YYYY.MM.dd}" } }
(四)自動化部署與監(jiān)控
CI/CD 流程
使用 Jenkins 或 GitLab CI 實現(xiàn)代碼自動構(gòu)建、測試和部署:
- 代碼提交至 Git 倉庫后,Jenkins 拉取代碼并編譯 Java 項目。
- 打包 WAR 包并分發(fā)到所有 Tomcat 節(jié)點的
webapps
目錄。 - 觸發(fā) Nginx 重新加載配置,確保新版本應用生效。
Prometheus+Grafana 監(jiān)控
采集指標:
- Nginx:請求量、錯誤率、響應時間(通過
stub_status
模塊)。 - Tomcat:線程池狀態(tài)、內(nèi)存使用、JSP 編譯耗時(通過 JMX 接口)。
Prometheus 配置:
scrape_configs: - job_name: "nginx" static_configs: - targets: ["192.168.10.103:80"] - job_name: "tomcat" static_configs: - targets: ["192.168.10.101:8009", "192.168.10.102:8009"] # Tomcat JMX端口
- Grafana 儀表盤:展示實時請求趨勢、服務器負載、錯誤分布等圖表,設置告警規(guī)則(如請求錯誤率超過 5% 時發(fā)送通知)。
九、成本優(yōu)化與性能對比
(一)硬件資源規(guī)劃
組件 | 最低配置(開發(fā)環(huán)境) | 推薦配置(生產(chǎn)環(huán)境) |
---|---|---|
Nginx 服務器 | 2 核 CPU,4GB 內(nèi)存,50GB 磁盤 | 4 核 CPU,8GB 內(nèi)存,100GB SSD |
Tomcat 服務器 | 2 核 CPU,4GB 內(nèi)存,100GB 磁盤 | 4-8 核 CPU,16GB 內(nèi)存,200GB SSD |
數(shù)據(jù)庫服務器 | 4 核 CPU,8GB 內(nèi)存,200GB 磁盤 | 8 核 CPU,32GB 內(nèi)存,500GB SSD |
(二)性能對比(壓測數(shù)據(jù)參考)
場景 | 單 Tomcat 節(jié)點 | Nginx+Tomcat 集群(2 節(jié)點) |
---|---|---|
靜態(tài)資源請求(RPS) | 5000+ | 10000+ |
動態(tài) JSP 請求(RPS) | 800-1000 | 1500-2000 |
內(nèi)存占用 | 800MB-1.2GB | 每 Tomcat 節(jié)點 800MB-1.2GB,Nginx 200MB |
說明:
- 靜態(tài)資源處理性能提升約 100%,得益于 Nginx 的高效緩存和 IO 模型。
- 動態(tài)請求性能提升約 50%-100%,通過負載均衡分攤壓力并減少 Tomcat 的靜態(tài)資源處理開銷。
十、總結(jié)與最佳實踐
(一)核心價值
- 動靜分離:Nginx 專注靜態(tài)資源處理,Tomcat 專注動態(tài)邏輯,提升整體效率。
- 負載均衡:通過多節(jié)點 Tomcat 分攤流量,避免單點故障,提升可用性。
- 高可擴展性:可靈活增加 Nginx 或 Tomcat 節(jié)點,適應業(yè)務增長。
(二)最佳實踐清單
開發(fā)階段
啟用 Tomcat 的reloadable=true
(僅開發(fā)環(huán)境),方便代碼修改后自動重啟。
使用 Nginx 的proxy_next_upstream
配置,實現(xiàn)故障節(jié)點請求重試:
- nginx
proxy_next_upstream error timeout http_500;
生產(chǎn)階段
- 關閉 Tomcat 的自動部署(
autoDeploy=false
)和 WAR 包解壓(unpackWARs=false
),避免未授權部署。 - 為 Nginx 和 Tomcat 配置統(tǒng)一的日志格式,便于集中分析(如 JSON 格式日志)。
維護階段
- 定期備份 Nginx 和 Tomcat 配置文件(如
nginx.conf
、server.xml
)。 - 制定應急預案,包含節(jié)點故障切換、數(shù)據(jù)恢復等流程,定期進行容災演練。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
生產(chǎn)環(huán)境部署Nginx服務器雙機熱備部署keepalived的步驟(多種模式教程)
今天演示下生產(chǎn)環(huán)境keepalived的部署方式,安裝模式有很多,比如說主備模型和雙主模型,主備分:搶占模式 和 非搶占模式,對Nginx keepalived 雙機熱備部署相關知識感興趣的朋友跟隨小編一起看看吧2024-07-07使用nginx+tomcat實現(xiàn)靜態(tài)和動態(tài)頁面的分離
這篇文章主要介紹了使用nginx+tomcat實現(xiàn)靜態(tài)和動態(tài)頁面的分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。2017-01-01nginx php-fpm環(huán)境中chroot功能的配置使用方法
這篇文章主要介紹了nginx php-fpm環(huán)境中chroot功能的配置使用方法,此方法是比禁用PHP敏感函數(shù)更好的一個安全防護手手段,需要的朋友可以參考下2014-05-05Nginx下支持Thinkphp URL Rewrite的配置示例
這篇文章主要介紹了Nginx下支持Thinkphp URL Rewrite的配置示例,本文直接給出配置示例,需要的朋友可以參考下2015-07-07詳解nginx實現(xiàn)https網(wǎng)站設置
這篇文章主要介紹了詳解nginx實現(xiàn)https網(wǎng)站設置,詳細的介紹了HTTPS簡介和證書生成等,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06