欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nginx+Tomcat負載均衡集群詳解

 更新時間:2025年06月04日 10:27:09   作者:YUNYINGXIA  
這篇文章主要介紹了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.101OpenEuler24apache-tomcat-9.0.8
Tomcat2 服務器192.168.10.102OpenEuler24apache-tomcat-9.0.8
Nginx 服務器192.168.10.103OpenEuler24nginx-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

(五)測試效果

  1. 靜態(tài)頁面測試:在瀏覽器中輸入 “http://192.168.10.103/”,應顯示 Nginx 默認的靜態(tài)頁面。
  2. 負載均衡測試:在瀏覽器中輸入 “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.1AJP/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 用戶運行(如nginxtomcat用戶),避免權限過高導致安全風險。
  • 修改文件權限,確保配置文件和日志目錄僅可被管理員讀寫:
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 錯誤。

解決方案

修正rootalias路徑,確保與實際文件路徑一致(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-10001500-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.confserver.xml)。
  • 制定應急預案,包含節(jié)點故障切換、數(shù)據(jù)恢復等流程,定期進行容災演練。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論