一、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 运维的日常工作流了。