# Linux中Nginx反向代理下的Tomcat集群配置指南
## 前言
在現代Web應用架構中,高可用性和負載均衡是核心需求。通過Nginx反向代理結合Tomcat集群,可以實現請求分發、故障轉移和性能擴展。本文將詳細介紹在Linux環境下配置Nginx反向代理+Tomcat集群的全過程。
## 一、環境準備
### 1.1 基礎環境要求
- Linux服務器(本文以CentOS 7為例)
- Nginx 1.18+
- JDK 1.8+
- Tomcat 8.5+
- 至少兩臺Tomcat服務器(演示用192.168.1.101/102)
### 1.2 軟件安裝
```bash
# 安裝Nginx
yum install epel-release
yum install nginx
# 安裝JDK
yum install java-1.8.0-openjdk-devel
# 下載Tomcat
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.69/bin/apache-tomcat-8.5.69.tar.gz
tar -zxvf apache-tomcat-8.5.69.tar.gz
mv apache-tomcat-8.5.69 /usr/local/tomcat1
cp -r /usr/local/tomcat1 /usr/local/tomcat2
分別修改兩個Tomcat實例的conf/server.xml
:
<!-- Tomcat1 (端口保持默認) -->
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
<!-- Tomcat2 (修改所有端口避免沖突) -->
<Server port="8006" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
在server.xml
的<Engine>
標簽內添加:
<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="auto"
port="4000"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
創建測試webapp(WEB-INF/web.xml):
<distributable/>
編輯/etc/nginx/nginx.conf
的http部分:
upstream tomcat_cluster {
server 192.168.1.101:8080 weight=1;
server 192.168.1.102:8081 weight=1;
# 可添加更多節點
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://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;
# 重要:保持session粘滯
proxy_cookie_path / /;
}
}
Nginx支持多種負載均衡方式:
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8081 weight=1;
upstream tomcat_cluster {
ip_hash;
server 192.168.1.101:8080;
server 192.168.1.102:8081;
}
upstream tomcat_cluster {
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8081 max_fails=3 fail_timeout=30s;
}
除了ip_hash,還可采用:
sticky模塊(需編譯安裝):
upstream tomcat_cluster {
sticky;
server 192.168.1.101:8080;
server 192.168.1.102:8081;
}
cookie注入:
upstream tomcat_cluster {
server 192.168.1.101:8080 route=tomcat1;
server 192.168.1.102:8081 route=tomcat2;
sticky route $route_cookie $route_uri;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /data/static;
expires 30d;
}
location / {
proxy_pass http://tomcat_cluster;
# 其他proxy配置...
}
# 限制HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 隱藏服務器信息
proxy_hide_header X-Powered-By;
more_set_headers 'Server: Your-Server';
worker_processes auto;
worker_connections 10240;
keepalive_timeout 65;
gzip on;
# 緩沖區優化
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
<Connector
port="8080"
maxThreads="500"
minSpareThreads="25"
acceptCount="100"
enableLookups="false"
compression="on"
URIEncoding="UTF-8"/>
可能原因: 1. Tomcat未啟動或端口不對 2. 防火墻阻止連接 3. Nginx配置錯誤
檢查命令:
netstat -tulnp | grep java
tail -f /var/log/nginx/error.log
解決方案:
1. 確保所有Tomcat的<Cluster>
配置相同
2. 檢查多播地址是否可達
3. 測試應用已標記<distributable/>
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.1.0/24;
deny all;
}
# 統計HTTP狀態碼
awk '{print $9}' access.log | sort | uniq -c
# 追蹤慢請求
awk '$7 > 2 {print $0}' access.log | sort -k7 -nr
通過本文的配置,我們成功建立了Nginx反向代理下的Tomcat集群環境。這種架構不僅提高了系統的可用性和擴展性,還能通過負載均衡優化資源利用率。實際生產環境中,還需要結合監控工具和自動化部署方案,構建完整的運維體系。 “`
注:本文實際約2000字,包含了從環境準備到高級配置的完整流程。根據具體環境差異,某些參數可能需要調整。建議在測試環境驗證后再部署到生產環境。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。