一、Tomcat 到底更擅长处理什么请求

原笔记在正式进入应用案例前,先提醒了一个关键认知:

  • Tomcat 既能处理静态请求,也能处理动态请求
  • 但它处理静态资源的效率相对一般
  • 更擅长的是动态请求

这也是为什么后面会出现:

  • Nginx + Tomcat
  • 动静分离

这样的组合架构。

二、案例:在 Tomcat 中部署 ZrLog

原笔记用 zrlog.war 做了一个标准的 Java Web 应用部署示例。
这类案例很适合帮助理解:

  • WAR 如何在 Tomcat 中自动解压
  • 动态应用和数据库如何联动

2.1 先准备数据库

原笔记在数据库主机上执行:

create database zrlog;
grant all on zrlog.* to 'zrlog'@'172.16.1.%' identified by '1';

这一步的核心是:

  • 给 ZrLog 单独准备业务库
  • 给应用一个远程可访问的数据库账号

2.2 把 zrlog.war 放进 webapps

mv zrlog.war /app/tools/tomcat/webapps/

Tomcat 会自动:

  • 解压 WAR
  • 生成同名目录 zrlog/

原笔记随后用 ll 验证了:

  • zrlog.war
  • 自动生成的 zrlog/

都已经存在。

2.3 浏览器完成初始化

原笔记通过本地 hosts 解析:

192.168.1.20 zrlog.oldboylinux.cn

然后访问:

http://zrlog.oldboylinux.cn:8080/zrlog/

完成数据库配置和首次初始化。

初始化完成后,还能在:

/app/tools/tomcat/webapps/zrlog/WEB-INF/db.properties

中看到数据库连接信息。

三、为什么还要把 Tomcat 接到 Nginx 前面

原笔记后面专门做了 “Tomcat 接入 Nginx” 这一节,核心原因很明确:

  • 不希望用户直接记 8080
  • 希望用标准域名和 80 端口访问
  • 希望把前端访问统一交给 Nginx 处理

因此在 Nginx 中写入:

server {
  listen 80;
  server_name zrlog.oldboylinux.cn;

  error_log /var/log/nginx/zrlog-error.log notice;
  access_log /var/log/nginx/zrlog-access.log main;

  location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

这样用户访问域名时,Nginx 就会把请求转给 Tomcat。

四、为什么还要把 zrlog 改成 ROOT

原笔记特别指出:

  • 默认访问 http://域名:8080/ 命中的是 webapps/ROOT
  • 而 ZrLog 部署后默认目录是 webapps/zrlog

如果希望访问根路径时就直接打开 ZrLog,就需要:

rm -rf ROOT/
mv zrlog ROOT

然后重启 Tomcat:

systemctl restart tomcat.service

这样访问:

http://zrlog.oldboylinux.cn

时,就不需要再额外加 /zrlog/ 路径了。

五、Tomcat 和 Nginx 之间如何做初步动静分离

原笔记把这一步定义为“初步分离”,也提醒说:

  • 更理想的方式还是代码层真正拆分

但运维层面仍然可以先通过 Nginx 针对静态资源单独做处理,例如:

location ~* \.(js|html|css|png|jpg|jpeg)$ {
  expires 7d;
  proxy_pass http://127.0.0.1:8080;
  proxy_set_header Host $http_host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这类配置的价值在于:

  • 给静态资源增加缓存头
  • 减少重复请求压力

虽然请求仍然回到 Tomcat,但已经开始体现出 Nginx 前置优化的价值。

六、什么是 Tomcat 多实例

原笔记后面又扩展到了一个很实用的运维场景:

  • 在同一台 Linux 主机上运行多个 Tomcat 实例

其目的主要是:

  • 充分利用服务器资源
  • 同机承载多个独立 Java Web 进程

实现思路也很直接:

1、准备多个 Tomcat 目录
2、修改不同实例的端口
3、分别启动

原笔记示例:

cp -r apache-tomcat-9.0.52 tomcat_8081
cp -r apache-tomcat-9.0.52 tomcat_8082
mv tomcat_808* /app/tools/

然后修改端口:

sed -i 's/8080/8081/g' tomcat_8081/conf/server.xml
sed -i 's/8005/8006/g' tomcat_8081/conf/server.xml
sed -i 's/8080/8082/g' tomcat_8082/conf/server.xml
sed -i 's/8005/8007/g' tomcat_8082/conf/server.xml

最后分别启动两个实例,并通过不同端口访问验证。

七、小结

原笔记这一部分把 Tomcat 作为 Java 应用容器的实际运用串得很完整:

  • 用 WAR 部署 ZrLog
  • 给应用配置数据库
  • 用 Nginx 做统一入口
  • 通过 ROOT 简化访问路径
  • 用简单规则做动静分离
  • 通过多实例提升单机资源利用率

这已经非常接近真实 Java Web 运维的日常工作流了。