web容器配置(Nginx 代理 + Tomcat)

Nginx 是用 C 语言编写的,非常轻量高效,且擅长处理高并发的 I/O 操作。对于静态文件(图片、CSS、JS),Nginx 不需要转发给 Tomcat,直接自己返回,速度比 Tomcat 快得多。

直接访问 Tomcat vs Nginx 代理

特性 直接访问 Tomcat Nginx 代理 + Tomcat
速度 理论上稍快(少一次转发) 稍慢(增加转发),但可忽略
安全性 低(直接暴露端口和应用) (隐藏后端,集中防护)
静态资源处理 差(Tomcat 不擅长) (Nginx 直接处理)
负载均衡 无法实现 支持(可分发到多个 Tomcat)
HTTPS 支持 每个 Tomcat 都要配置 SSL 统一在 Nginx 配置,更高效
URL 路由/重写 复杂,需在 Java 代码中实现 简单,Nginx 配置即可
适用场景 个人项目、测试环境 生产环境、企业级应用

基础配置步骤(单Tomcat场景)

1. 环境准备
  • 服务器:推荐CentOS 7/8、Ubuntu 20.04+,确保开放80/443/8080端口
  • 软件版本:Nginx 1.20+,Tomcat 9.x/10.x(根据Java版本选择,Tomcat10对应Java11+)
  • 依赖:安装JDK 8/11/17(根据项目需求)
2. Tomcat基础配置

修改TOMCAT_HOME/conf/server.xml,优化核心参数:

复制代码
<!-- 配置HTTP连接器,调整线程池参数 -->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="800"      <!-- 最大线程数,根据CPU核心数调整(1核=100-200) -->
           minSpareThreads="100" <!-- 最小空闲线程数 -->
           acceptCount="1000"    <!-- 等待队列长度 -->
           compression="on"      <!-- 开启Gzip压缩 -->
           compressionMinSize="2048"
           compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"/>

<!-- 配置引擎,添加默认主机 -->
<Engine name="Catalina" defaultHost="localhost">
  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <!-- 配置项目上下文路径,例如将myapp部署到根路径 -->
    <Context path="" docBase="/opt/tomcat/webapps/myapp" reloadable="false"/>
  </Host>
</Engine>
3. Nginx核心配置(反向代理+动静分离)
复制代码
server {
    listen 80;
    server_name your_domain.com; # 替换为你的域名或IP

    # 静态资源直接由Nginx处理,提升性能
    location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg)$ {
        root /opt/tomcat/webapps/myapp/static; # 静态资源存放路径
        expires 30d; # 浏览器缓存30天
        add_header Cache-Control "public, no-transform";
    }

    # 动态请求转发到Tomcat处理
    location / {
        proxy_pass http://127.0.0.1:8080; # 转发到Tomcat的8080端口
        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 60s; # 连接超时时间
        proxy_send_timeout 60s;    # 发送超时时间
        proxy_read_timeout 60s;    # 读取超时时间
    }

    # 配置错误页面
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
4. 验证配置与启动
复制代码
# 检查Nginx配置语法
nginx -t

# 重启Nginx
systemctl restart nginx

# 启动Tomcat并设置开机自启
systemctl start tomcat
systemctl enable tomcat

🚀 进阶配置(多Tomcat集群+负载均衡)

当单Tomcat无法满足并发需求时,可配置Tomcat集群,由Nginx做负载均衡:

1. 部署多台Tomcat
  • 复制Tomcat目录,分别命名为tomcat8080、tomcat8081、tomcat8082
  • 修改每台Tomcat的server.xml,调整端口:
    • 8080端口改为8081、8082
    • shutdown端口改为8006、8007
    • AJP端口改为8009、8010
2. Nginx负载均衡配置

nginx.confhttp块中添加上游服务器配置:

复制代码
# 定义Tomcat集群节点
upstream tomcat_cluster {
    server 127.0.0.1:8080 weight=3; # weight值越大,分配的请求越多
    server 127.0.0.1:8081 weight=2;
    server 127.0.0.1:8082 weight=1;
    
    # 可选:配置健康检查(需要Nginx Plus或第三方模块)
    # check interval=3000 rise=2 fall=3 timeout=1000 type=http;
    # check_http_send "HEAD /health HTTP/1.1\r\nHost: localhost\r\n\r\n";
}

# 在server块中修改转发目标
server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://tomcat_cluster; # 转发到负载均衡集群
        # 其他proxy_set_header配置同基础版
    }
}

🔒 生产环境必备优化

1. 安全配置
  • 配置HTTPS:使用Let's Encrypt免费证书,在Nginx中配置443端口
  • 限制Tomcat访问:仅允许Nginx所在IP访问Tomcat的8080端口(通过防火墙或Tomcat的RemoteAddrValve)
  • 禁用Tomcat管理控制台或设置强密码
  • 配置Nginx的WAF规则,防止SQL注入、XSS攻击
2. 性能优化
  • Nginx开启gzip压缩、开启open_file_cache
  • Tomcat调整线程池、启用APR(Apache Portable Runtime)提升IO性能
  • 配置JVM参数:修改TOMCAT_HOME/bin/catalina.sh,添加:

JAVA_OPTS="-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"

(根据服务器内存调整,Xms/Xmx通常设置为物理内存的1/2-1/3)

3. 监控与日志
  • 配置Nginx和Tomcat的日志分割(按天/大小)
  • 部署监控工具:Prometheus+Grafana监控服务器性能、Tomcat JVM指标
  • 配置日志收集:使用ELK Stack(Elasticsearch+Logstash+Kibana)集中管理日志

🎯 常见问题排查

  • 502 Bad Gateway:检查Tomcat是否启动、端口是否开放、防火墙规则
  • 404 Not Found:确认项目已部署到Tomcat的webapps目录,上下文路径配置正确
  • 性能瓶颈:使用topjstatnginx -V分析CPU/内存/线程占用
  • 会话共享:集群场景下需配置Redis或Memcached实现session共享(Tomcat的PersistentManager)
相关推荐
chxii20 小时前
Nginx以及衍生产品的定位
web·web容器
凤山老林8 天前
Tomcat 高高在上?0-1 实现一个简单的 WEB 容器
java·后端·tomcat·web容器
张小洛8 个月前
Spring IOC容器在Web环境中是如何启动的(源码级剖析)?
java·spring·spring mvc·web容器·spring ioc·servlet容器·spring web容器
笨手笨脚の1 年前
深入拆解Tomcat&Jetty(二)
java·spring·tomcat·jetty·web容器
听海边涛声2 年前
XML Web 服务 Eclipse实现中的sun-jaxws.xml文件
web服务·jax-ws·web容器