Nginx+Tomcat集群部署
NGINX + Tomcat 是 Java Web 应用的经典架构。NGINX 处理静态资源和负载均衡,Tomcat 专注业务逻辑。
基础架构
nginx
Client → NGINX (80/443) → Tomcat1 (8080)
→ Tomcat2 (8081)
→ Tomcat3 (8082)
NGINX 配置
反向代理到 Tomcat
XML
upstream tomcat_cluster {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
keepalive 32;
}
server {
listen 80;
server_name app.example.com;
# 静态资源直接处理
location /static/ {
root /var/www/app;
expires 30d;
}
# Java 应用代理
location / {
proxy_pass http://tomcat_cluster;
proxy_http_version 1.1;
proxy_set_header Connection "";
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_set_header X-Forwarded-Proto $scheme;
}
}
proxy_http_version 1.1和Connection ""是 keepalive 的必要条件。否则每次请求都新建 TCP 连接。
Tomcat 配置
server.xml 调整
XML
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
proxyPort="80"
proxyName="app.example.com"
scheme="http" />
设置
proxyPort和proxyName让 Tomcat 感知代理后的真实地址。request.getRequestURL()返回正确 URL。
获取真实客户端 IP
nginx
<!-- server.xml 中添加 Valve -->
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto" />
Tomcat 默认获取直连 IP,需配置
RemoteIpValve解析X-Forwarded-For头获取真实客户端 IP。
动静分离
资源分离
XML
server {
# 静态资源 - NGINX 直接返回
location ~* \.(css|js|jpg|png|gif|svg|woff|woff2|ico)$ {
root /var/www/app/static;
expires 365d;
add_header Cache-Control "public, immutable";
}
# JSP/Servlet - 转发到 Tomcat
location ~ \.(jsp|do|action)$ {
proxy_pass http://tomcat_cluster;
}
# 其他请求 - 默认走 Tomcat
location / {
proxy_pass http://tomcat_cluster;
}
}
静态资源不经过 Tomcat,减少 Java 进程 CPU 和内存消耗。构建产物部署到
/var/www/app/static目录。
Session 共享
Redis 存储
XML
<!-- Tomcat context.xml -->
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />
Session 存储在 Redis 中,任何 Tomcat 节点都能读取。NGINX 无需配置
ip_hash,使用least_conn即可。
健康检查
Tomcat 健康端点
nginx
<!-- web.xml 添加健康检查 Servlet -->
<servlet>
<servlet-name>health</servlet-name>
<servlet-class>com.app.HealthCheckServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>health</servlet-name>
<url-pattern>/health</url-pattern>
</servlet-mapping>
text
upstream tomcat_cluster {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
}
要点总结
- NGINX 使用
least_conn+keepalive代理到 Tomcat 集群 proxy_http_version 1.1+Connection ""是 keepalive 必要条件- Tomcat 配置
RemoteIpValve获取真实客户端 IP - 动静分离:静态资源 NGINX 直接返回,动态请求转发 Tomcat
- Session 使用 Redis 共享存储,无需
ip_hash - 构建产物部署到 NGINX 静态目录,WAR 包部署到 Tomcat
- 配合健康检查 Servlet 实现自动故障摘除
📝 发现内容有误?点击此处直接编辑