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

# 全局上下文
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` |
location | URL 路由匹配規則 | `=` 精確, `~` 正則區分大小寫, `~*` 正則不區分, `^~` 前綴優先 |
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`,配合文件名哈希版本化 |
upstream tomcat_cluster {
ip_hash; # 同一客戶端 IP 固定訪問同一台 Tomcat (需關閉 Tomcat Session 複製或配合 Redis Session)
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
開源版 Nginx 被動檢查:請求失敗 (超時/5xx) 達 `max_fails` 次 (默認1) 在 `fail_timeout` 內標記為 down,自動剔除。恢復需手動 reload 或等待 `fail_timeout` 過期嘗試。
server 127.0.0.1:8080 max_fails=2 fail_timeout=30s;
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
}