当前位置: 首页 > web >正文

在 RHEL9 上搭建企业级 Web 服务(Tomcat)

一、准备工作:认识 Tomcat 与环境规划

1. 什么是 Tomcat?

Tomcat 就像一个 "Java 网页容器",专门用来运行 Java 编写的 Web 应用(比如 JSP、Servlet)。它轻量级、免费且稳定,中小公司几乎都在用它部署网站后台。简单说:如果你的网页用 Java 写的,就需要 Tomcat 来 "跑" 起来。

2. 服务器规划

服务器 IP角色作用说明
172.25.254.16Nginx 反向代理服务器接收用户请求,转发给 Tomcat
172.25.254.17Tomcat 服务器 1运行 Web 应用(主服务器)
172.25.254.18Tomcat 服务器 2用于负载均衡(分担 17 的压力)
172.25.254.19Memcached 服务器存储会话数据(实现多 Tomcat 共享登录状态)

3. 前置知识

  • 服务器已联网(需要下载软件)

  • 关闭防火墙或开放必要端口

  • RHEL9 默认用dnf命令管理软件(和yum用法一样,本文统一用dnf

二、Step 1:安装 Java 环境(所有 Tomcat 服务器必做)

Tomcat 是 Java 写的,必须先装 Java 环境!在 17 和 18 服务器上操作(因为它们是 Tomcat 服务器)。

1. 检查是否已安装 Java

java -version

如果显示 "command not found",说明未安装,继续下一步。

2. 安装 OpenJDK 1.8(Tomcat 推荐版本)

dnf install java-1.8.0-openjdk-devel.x86_64 -y
  • 解释java-1.8.0-openjdk-devel是开源的 Java 开发环境,包含运行 Tomcat 所需的所有组件;-y表示自动确认安装。

3. 验证安装

java -version

三、Step 2:安装与配置 Tomcat(17 和 18 服务器)

以 172.25.254.17 为例,18 服务器操作完全相同,只需将步骤中的 IP 换成 18 即可。

1. 下载 Tomcat 9(稳定版)

# 进入/usr/local目录(软件通常装在这里)
cd /usr/local# 下载Tomcat 9压缩包(官网地址,速度可能慢,可提前下载上传)
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.80/bin/apache-tomcat-9.0.80.tar.gz
  • 解释:Tomcat 无需编译,解压即可用,这里选 9.0 版本(企业常用)。

2. 解压并重命名(方便操作)

# 解压
tar -zxf apache-tomcat-9.0.80.tar.gz# 重命名为tomcat(太长的名字不好记)
mv apache-tomcat-9.0.80 tomcat

3. 启动 Tomcat 测试

# 进入Tomcat的bin目录(存放启动/停止命令)
cd /usr/local/tomcat/bin# 启动Tomcat
./startup.sh

  • 成功会显示Tomcat started.

  • 解释startup.sh是启动脚本,./表示执行当前目录下的脚本。

4. 验证 Tomcat 是否启动

# 查看8080端口(Tomcat默认端口)是否被占用
netstat -antlupe | grep 8080

如果显示LISTEN状态,说明启动成功。

5. 开放防火墙端口

# 开放8080端口
firewall-cmd --add-port=8080/tcp --permanent# 重新加载防火墙规则
firewall-cmd --reload
  • 解释:RHEL9 默认防火墙会阻止外部访问 8080 端口,必须手动开放。

6. 浏览器访问测试

在本地电脑浏览器输入:http://172.25.254.17:8080


如果看到 Tomcat 的欢迎页面,说明安装成功!

7. 配置 Tomcat 为系统服务(开机自启)

每次手动启动太麻烦,配置成系统服务更方便:

# 创建Tomcat配置文件
vim /usr/local/tomcat/conf/tomcat.conf

在文件中输入:

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
  • 解释:告诉 TomcatJava 的安装路径。

# 创建系统服务文件
vim /lib/systemd/system/tomcat.service

输入以下内容:

[Unit]
Description=Tomcat Server
After=network.target[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
User=root
Group=root
Restart=always[Install]
WantedBy=multi-user.target
  • 解释[Unit]定义服务描述和依赖;[Service]定义启动 / 停止命令和用户;[Install]定义开机自启。

# 重新加载系统服务
systemctl daemon-reload# 设置开机自启并启动Tomcat
systemctl enable --now tomcat

8. Tomcat 目录结构详解

/usr/local/tomcat/
├── bin/        # 启动、停止等脚本(startup.sh、shutdown.sh)
├── conf/       # 配置文件(server.xml核心配置)
├── lib/        # Tomcat依赖的Java库
├── logs/       # 日志文件(出问题看这里!)
├── webapps/    # 存放Web应用的目录(部署项目放这里)
└── work/       # JSP编译后的临时文件

四、Step 3:部署第一个 JSP 应用(17 服务器)

让我们部署一个简单的 JSP 页面,感受 Tomcat 的作用。

1. 创建 Web 应用目录

# 在webapps下创建一个名为"myapp"的应用目录
mkdir -p /usr/local/tomcat/webapps/myapp

2. 编写一个简单的 JSP 页面

vim /usr/local/tomcat/webapps/myapp/index.jsp

输入内容:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><title>我的第一个Tomcat应用</title>
</head>
<body><h1>Hello, Tomcat!</h1><p>当前服务器IP:172.25.254.17</p><p>当前时间:<%= new java.util.Date() %></p>
</body>
</html>
  • 解释<%= ... %>是 JSP 语法,用于在网页中插入 Java 代码,这里显示当前时间。

3. 重启 Tomcat 使应用生效

systemctl restart tomcat

4. 访问应用

浏览器输入:http://172.25.254.17:8080/myapp


会看到显示 "Hello, Tomcat!" 和当前时间,说明应用部署成功!

五、Step 4:配置 Nginx 反向代理(16 服务器)

为什么需要 Nginx?Tomcat 处理动态请求(JSP)强,但处理静态文件(图片、CSS)效率低。让 Nginx 来接收所有请求,静态文件直接返回,动态请求转发给 Tomcat。

1. 在 16 服务器安装 Nginx

# 安装Nginx
dnf install nginx -y# 启动并设置开机自启
systemctl enable --now nginx# 开放80端口(Nginx默认端口)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload

2. 配置 Nginx 反向代理

# 创建虚拟主机配置文件
vim /etc/nginx/conf.d/tomcat-proxy.conf

输入内容:

server {listen 80;server_name tomcat.example.com;  # 可以用域名,小白直接用IP访问# 静态文件由Nginx直接处理(如图片、CSS、JS)location ~* \.(jpg|jpeg|png|gif|css|js)$ {root /usr/share/nginx/html;  # Nginx静态文件目录expires 30d;  # 缓存30天,提高速度}# 动态请求(.jsp)转发给Tomcatlocation ~ \.jsp$ {proxy_pass http://172.25.254.17:8080;  # 指向Tomcat服务器proxy_set_header Host $host;  # 传递主机名proxy_set_header X-Real-IP $remote_addr;  # 传递真实IP}
}
  • 解释location ~ \.jsp$表示所有以.jsp结尾的请求,都转发给 17 的 Tomcat。

3. 检查 Nginx 配置并重启

# 检查配置是否有误
nginx -t# 重启Nginx
systemctl restart nginx

4. 测试反向代理

浏览器输入:http://172.25.254.16/myapp/index.jsp


会看到和直接访问 Tomcat 相同的页面,但此时请求先经过 Nginx,再转发给 Tomcat,成功!

六、Step 5:实现 Tomcat 负载均衡(16、17、18 服务器)

当访问量增大,单台 Tomcat 扛不住,用两台 Tomcat(17 和 18)分担压力,由 Nginx 决定请求发给谁。

1. 确保 18 服务器的 Tomcat 已部署相同应用

在 18 服务器上重复步骤二和步骤四,部署myapp应用,注意 JSP 中的 IP 改为172.25.254.18,方便测试。

2. 在 16 服务器修改 Nginx 配置(负载均衡)

vim /etc/nginx/conf.d/tomcat-proxy.conf

修改为:

# 定义Tomcat服务器集群
upstream tomcat_cluster {server 172.25.254.17:8080;server 172.25.254.18:8080;# 默认轮询策略:第一个请求给17,第二个给18,依次循环
}server {listen 80;server_name tomcat.example.com;location ~* \.(jpg|jpeg|png|gif|css|js)$ {root /usr/share/nginx/html;expires 30d;}# 动态请求转发给集群location ~ \.jsp$ {proxy_pass http://tomcat_cluster;  # 指向集群proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

3. 重启 Nginx

systemctl restart nginx

4. 测试负载均衡

多次刷新http://172.25.254.16/myapp/index.jsp,会看到页面中的 IP 在 17 和 18 之间切换,说明 Nginx 成功分发请求!

七、Step 6:解决 Session 共享问题(19 服务器 + Memcached)

问题:用户登录后,Session(登录状态)存在某台 Tomcat 上,如果 Nginx 下次把请求发给另一台 Tomcat,用户会被要求重新登录。用 Memcached 存储 Session,让所有 Tomcat 共享。

1. 在 19 服务器安装 Memcached

# 安装Memcached
dnf install memcached -y# 配置Memcached(允许所有服务器访问)
vim /etc/sysconfig/memcached

修改OPTIONS为:

OPTIONS="-l 0.0.0.0"  # 监听所有IP,允许其他服务器连接
# 启动并设置开机自启
systemctl enable --now memcached# 开放11211端口(Memcached默认端口)
firewall-cmd --add-port=11211/tcp --permanent
firewall-cmd --reload

2. 在 17 和 18 服务器配置 Tomcat 连接 Memcached

(1)下载所需 JAR 包(17 和 18 都要做)

# 进入Tomcat的lib目录
cd /usr/local/tomcat/lib# 下载必要的JAR包(用于连接Memcached和序列化Session)
wget https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.2/memcached-session-manager-2.3.2.jar
wget https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc9/2.3.2/memcached-session-manager-tc9-2.3.2.jar
wget https://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar
wget https://repo1.maven.org/maven2/com/esotericsoftware/kryo/3.0.3/kryo-3.0.3.jar
wget https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.9/reflectasm-1.11.9.jar
wget https://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar

(2)修改 Tomcat 配置(17 服务器)

vim /usr/local/tomcat/conf/context.xml

<Context>标签内添加:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:172.25.254.19:11211"  # 指向Memcached服务器requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  # 忽略静态文件transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"  # 序列化方式
/>

(3)18 服务器的配置和 17 完全相同

vim /usr/local/tomcat/conf/context.xml

添加相同的<Manager>配置。

(4)重启 17 和 18 的 Tomcat

systemctl restart tomcat

3. 测试 Session 共享

(1)在myapp应用中添加一个测试登录状态的 JSP 页面(17 和 18 都要放):

vim /usr/local/tomcat/webapps/myapp/session.jsp

内容:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head><title>Session测试</title>
</head>
<body><h1>Session ID: <%= session.getId() %></h1>  # 显示当前Session ID<p>服务器IP:172.25.254.17(18服务器这里改18)</p><p>登录状态:<%= session.getAttribute("user") == null ? "未登录" : "已登录:" + session.getAttribute("user") %></p><form method="post">用户名:<input type="text" name="user"><input type="submit" value="登录"></form><%String user = request.getParameter("user");if (user != null && !user.isEmpty()) {session.setAttribute("user", user);  # 存储登录状态到Session}%>
</body>
</html>

(2)浏览器访问http://172.25.254.16/myapp/session.jsp,输入用户名登录,多次刷新:

  • 无论请求被转发到 17 还是 18,Session ID始终相同

  • 登录状态不会丢失,说明 Session 共享成功!

八、总结与扩展

按照以上步骤从 0 开始完成了 Tomcat 的安装、部署、反向代理、负载均衡和 Session 共享,这已经是企业级 Web 服务的基础架构了。

后续可以尝试:

  1. 给 Tomcat 配置用户名密码(管理后台)

  2. 部署 Java Web 框架(如 Spring Boot)应用

  3. 配置 SSL 证书,实现 HTTPS 访问

  4. 用监控工具(如 Prometheus)监控 Tomcat 性能

http://www.xdnf.cn/news/17645.html

相关文章:

  • Android Audio实战——获取活跃音频类型(十五)
  • 深度学习与遥感入门(五)|GAT 构图消融 + 分块全图预测:更稳更快的高光谱图分类(PyTorch Geometric 实战)
  • 【数据可视化-86】中国育儿成本深度可视化分析(基于《中国统计年鉴2023》数据):用Python和pyecharts打造炫酷可视化大屏
  • 论文阅读 arxiv 2024 MemGPT: Towards LLMs as Operating Systems
  • Apache IoTDB 全场景部署:基于 Apache IoTDB 的跨「端-边-云」的时序数据库 DB+AI
  • Java 之抽象类和接口
  • SSH远程连接TRAE时显示权限被拒绝检查方案
  • 可视化程序设计(4) - 第一个图形窗口程序
  • Java进阶之单列集合Set接口下的通用方法
  • Linux下的软件编程——标准IO
  • ECharts Y轴5等分终极解决方案 - 动态适配缩放场景
  • 后量子密码学的迁移与安全保障:迎接量子时代的挑战
  • NLP---IF-IDF案例分析
  • FreeRTOS学习:优化系统
  • LeetCode_哈希表
  • 论文阅读:Aircraft Trajectory Prediction Based on Residual Recurrent Neural Networks
  • OpenAI正式发布GPT-5:迈向AGI的关键一步
  • sqllabs——Less1
  • MySQL面试题及详细答案 155道(041-060)
  • ThreadLocal有哪些内存泄露问题,如何避免?
  • Mysql笔记-存储过程与存储函数
  • 【Linux】使用静态 BusyBox 解决操作系统“塌方”问题
  • ADK[3]历史对话信息保存机制与构建多轮对话机器人
  • 单片机捷径
  • nginx下lua的实现机制、Lua错误处理、面向对象
  • Unity 遮挡显示效果 Shader
  • 异步问题的概念和消除问题技巧
  • 机器学习 DBScan
  • Java语言简介
  • 《算法导论》第 17 章 - 摊还分析