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

Nginx + Tomcat 實現負載均衡與動靜分離完整配置指南

     編輯:Java 綜合教學

架構概覽

採用 Nginx 反向代理 + 多 Tomcat 節點 架構:

  • Nginx 負責接收客戶端請求、負載均衡分發、靜態資源直連、SSL 終止
  • Tomcat 叢集處理動態業務邏輯
  • Session 共享方案保障有狀服務高可用

核心配置文件 nginx-tomcat.conf

user nobody;
worker_processes 2;              # 建議等於 CPU 核心數
events {
    worker_connections 1024;     # 單進程最大連接數
}
http {
    # 上游服務器組(負載均衡池)
    upstream tomcats {
        fair;                    # 第三方 fair 模組:按響應時間智能分發
        server 121.42.41.143:8080;
        server 219.133.55.36:8080;
    }

    server {
        listen 80;
        server_name 121.42.41.143;
        access_log logs/tomcat-nginx.access.log combined;

        # 反向代理所有請求
        location / {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass https://tomcats;   # 轉發給上游組
        }
    }
}

負載均衡策略詳解

策略配置特點
輪詢(默認)無特殊指令按權重 weight 依次分發
IP Haship_hash;同一客戶端固定映射到同一節點,解決 Session 粘性
Fair(第三方)fair;根據後端響應時間動態調度,需編譯 nginx-upstream-fair 模組
URL Hashurl_hash;同一 URL 固定節點,利於緩存命中

Fair 模組安裝步驟

  1. 下載:gnosek-nginx-upstream-fair-a18b409.tar.gz
  2. 解壓並移至 /usr/local/nginx-upstream-fair
  3. 重新編譯 Nginx:
    ./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-upstream-fair/
    make
  4. 替換二進制:cp objs/nginx /usr/local/nginx/sbin/
  5. 重啟驗證

Session 共享三大方案

1. 粘性會話(IP Hash)

upstream tomcats { ip_hash; server ...; }

優點:簡單、無額外組件。缺點:節點故障導致 Session 丟失,無容錯。

2. Tomcat 內建 Session 複製

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
              address="192.168.6.223" port="8080"/>
  </Channel>
</Cluster>

web.xml 添加 <distributable/>。缺點:節點多時廣播風暴,性能差。

3. 分布式緩存(Memcached / Redis)——推薦

採用 memcached-session-manager (MSM) 方案:

  • Sticky 模式:主節點寫本地 + 異步備份到備節點,讀本地,性能最優
  • Non-Sticky 模式:每次請求從 Memcached 讀寫,強一致性,延遲稍高

關鍵 Jar 包(放入 tomcat/lib)

spymemcached.jar                    # Memcached Java 客戶端
memcached-session-manager-{ver}.jar # MSM 核心
memcached-session-manager-tc7-{ver}.jar # Tomcat 7 適配
msm-kryo-serializer-{ver}.jar       # Kryo 高性能序列化(推薦)

context.xml 生產級配置範例

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:192.168.1.62:11211,n2:192.168.1.63:11211"
    failoverNodes="n1"
    sticky="true"
    requestUriIgnorePattern=".*\.(jpg|png|css|js)$"
    memcachedProtocol="binary"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    sessionBackupAsync="true"
    lockingMode="auto" />

動靜分離配置

# 靜態資源直接由 Nginx 服務,7 天瀏覽器緩存
location ~\.(gif|jpg|jpeg|png|css|js|php)$ {
    root /usr/local/nginx/static;   # 靜態文件目錄
    expires 7d;
    access_log off;
}

獲取真實客戶端 IP

Nginx 傳遞:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Java 獲取:

public static String getIp(HttpServletRequest request) {
    String ip = request.getHeader("X-Real-IP");
    return (ip == null || ip.isEmpty()) ? request.getRemoteAddr() : ip;
}

集群開發注意事項

  1. 實體類必須 implements Serializable 並定義 serialVersionUID
  2. 靜態資源(CSS/JS/圖片)放 Nginx,動態請求走 Tomcat
  3. 避免在 Session 存放大對象,影響複製/序列化性能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved