採用 Nginx 反向代理 + 多 Tomcat 節點 架構:
nginx-tomcat.confuser 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 Hash | ip_hash; | 同一客戶端固定映射到同一節點,解決 Session 粘性 |
| Fair(第三方) | fair; | 根據後端響應時間動態調度,需編譯 nginx-upstream-fair 模組 |
| URL Hash | url_hash; | 同一 URL 固定節點,利於緩存命中 |
gnosek-nginx-upstream-fair-a18b409.tar.gz/usr/local/nginx-upstream-fair./configure --prefix=/usr/local/nginx --add-module=/usr/local/nginx-upstream-fair/makecp objs/nginx /usr/local/nginx/sbin/upstream tomcats { ip_hash; server ...; }
優點:簡單、無額外組件。缺點:節點故障導致 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/>。缺點:節點多時廣播風暴,性能差。
採用 memcached-session-manager (MSM) 方案:
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;
}
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;
}
implements Serializable 並定義 serialVersionUID