首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Nginx + Tomcat 生產環境架構實戰:反向代理、靜態資源分離、負載均衡完整配置指南

     編輯:Java 綜合教學

Nginx + Tomcat 黃金搭檔:高性能 Web 架構落地指南

隨著靜態資源 (瓦片、圖片、JS/CSS) 訪問量激增,單靠 Tomcat 處理所有請求效率低下。引入 Nginx 作為反向代理與靜態資源服務器,實現「動靜分離」、負載均衡、故障轉移,是 Java Web 生產環境標準架構。本文從安裝到核心配置全程實戰。

一、 核心架構原理

  • 反向代理:客戶端請求 → Nginx (80/443) → 根據規則轉發至後端 Tomcat 集群 (8080/8081...) → 原路返回響應。對外隱藏內網拓撲。
  • 靜態資源分離:Nginx 直接服務 `.html/.css/.js/.png` 等靜態文件 (極高併發、內存占用低);動態請求 (`.jsp/.do/.action`) 轉發給 Tomcat 處理業務邏輯。
  • 負載均衡:`upstream` 定義多台 Tomcat,支持輪詢、權重、IP哈希、最少連接等策略,實現高可用與擴容。

二、 Windows 環境快速搭建

  1. 下載:nginx.org (如 1.9.15 Windows 版)。
  2. 解壓啟動:雙擊 `nginx.exe` 或 CMD 執行 `start nginx`。
  3. 驗證:瀏覽器訪問 `https://localhost:8010` (默認配置監聽 8010),見到 "Welcome to nginx!" 即成功。
  4. 常用命令:
    • 重載配置:`nginx -s reload` (修改配置後無需重啟)。
    • 停止:`nginx -s stop` (快速) / `nginx -s quit` (優雅)。

nginx目錄 命令啟動 進程驗證

三、 核心配置文件解析: nginx.conf

# 全局上下文
events { worker_connections 1024; }

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    # 1. 定義上游 Tomcat 集群 (負載均衡)
    upstream tomcat_cluster {
        server 127.0.0.1:8080 weight=3;  # 權重3
        server 127.0.0.1:8081 weight=1;  # 權重1
        # ip_hash;  # 可選:會話保持
    }

    # 2. 虛擬主機配置
    server {
        listen       8010;          # 監聽端口
        server_name  localhost;     # 域名匹配

        # 3. 靜態資源直接服務 (核心:動靜分離)
        location ~ .*\.(html|htm|gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
            root   D:/webapp/static;  # 靜態文件物理路徑
            expires 30d;              # 瀏覽器緩存 30 天
            access_log off;           # 不記訪問日志
        }

        # 4. 動態請求代理轉發
        location / {
            proxy_pass https://tomcat_cluster;  # 轉發給上游
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_connect_timeout 30s;
            proxy_read_timeout 60s;
        }

        # 5. 錯誤頁面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { root   html; }
    }
}

四、 關鍵配置項詳解

指令作用典型值/建議
listen監聽端口80 (HTTP), 443 (HTTPS), 多 server 需區分
server_name匹配域名`localhost`, `www.example.com`, 支持通配符 `*.example.com`
locationURL 路由匹配規則`=` 精確, `~` 正則區分大小寫, `~*` 正則不區分, `^~` 前綴優先
root靜態文件根目錄拼接規則: `root + location匹配路徑`,確保文件存在
proxy_pass反向代理目標`https://upstream名` 或 `https://ip:port`,結尾 `/` 影響路徑傳遞
proxy_set_header透傳頭信息關鍵:`Host`, `X-Real-IP`, `X-Forwarded-For` 讓後端獲取真實客戶端 IP
upstream server weight負載權重數值越大分得請求越多,實現異構機器負載均衡
expires瀏覽器緩存控制靜態資源建議 `30d` / `1y`,配合文件名哈希版本化

五、 進階場景配置片段

1. 會話保持 (IP Hash)

upstream tomcat_cluster {
    ip_hash;  # 同一客戶端 IP 固定訪問同一台 Tomcat (需關閉 Tomcat Session 複製或配合 Redis Session)
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

2. 故障自動切換 (健康檢查 - 需 Nginx Plus 或第三方模組)

開源版 Nginx 被動檢查:請求失敗 (超時/5xx) 達 `max_fails` 次 (默認1) 在 `fail_timeout` 內標記為 down,自動剔除。恢復需手動 reload 或等待 `fail_timeout` 過期嘗試。

server 127.0.0.1:8080 max_fails=2 fail_timeout=30s;

3. HTTPS/SSL 配置

server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/nginx/cert/server.crt;
    ssl_certificate_key /etc/nginx/cert/server.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    # ... 其余 location 配置同 HTTP
}

六、 運維驗證與最佳實踐

  1. 配置語法檢查:`nginx -t` (必須通過才能 reload)。
  2. 靜態資源版本化:構建時給文件名加 Hash (如 `app.a1b2c3.js`),配合 `expires 1y` 實現長期緩存且發布即時生效。
  3. 日誌切割:配合 `logrotate` 定期切割 `access.log` / `error.log`。
  4. 監控:關注 Nginx 連接數 (`active`), 請求延遲, 上游健康狀態;推薦 `nginx-prometheus-exporter` + Grafana。
  5. 安全加固:隱藏版本號 (`server_tokens off;`)、限制請求大小 (`client_max_body_size 10m`)、禁止非法域名訪問 (`server_name` 精確匹配)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved