企业级WEB应用服务器TOMCAT

发布于:2025-08-13 ⋅ 阅读:(11) ⋅ 点赞:(0)

一、Tomcat 概述

1.1 什么是 Tomcat

Tomcat 是一款开源的 Java Servlet 容器,同时支持 JavaServer Pages(JSP)、WebSocket 等 Java EE 技术规范,是运行 Java Web 应用的核心服务器。它由 Apache 软件基金会开发维护,兼具轻量性和稳定性,是 Java Web 开发和部署的首选工具之一。

1.2 Tomcat 的发展历史与现状

  • 诞生背景:起源于 1999 年的 Jakarta 项目,最初名为 Catalina,2001 年更名为 Tomcat,旨在提供一个轻量级的 Servlet 容器。
  • 版本迭代:2004 年发布支持 Servlet 2.4/JSP 2.0 的 Tomcat 5,2010 年发布支持 Servlet 3.0 的 Tomcat 7,2022 年发布支持 Jakarta EE 9 的 Tomcat 10(包名从 javax 迁移到 jakarta)。
  • 行业地位:全球超过 60% 的 Java Web 应用部署在 Tomcat 上,广泛应用于企业级系统、电商平台、政务系统等场景。

1.3 Tomcat 与其他 Java 容器的对比

特性 Tomcat Jetty JBoss/WildFly WebLogic
定位 轻量级 Servlet 容器 轻量级嵌入式容器 全功能 Java EE 应用服务器 商业级 Java EE 服务器
体积 小(约 100MB) 极小(约 20MB) 大(约 1GB) 大(约 2GB)
启动速度 较快 极快 较慢
功能 支持 Servlet/JSP 核心功能 支持核心功能,更灵活 支持完整 Java EE 规范 支持完整 Java EE 规范,带商业支持
适用场景 中小型 Java Web 应用 嵌入式应用、微服务 复杂企业级应用 大型商业系统

适用场景:

  • Tomcat:中小型 Java Web 应用、开发环境、需要轻量部署的场景
  • Jetty:嵌入式应用(如 Spring Boot 内置容器)、对启动速度敏感的场景
  • JBoss/WildFly:需要完整 Java EE 功能的企业级应用
  • WebLogic:对稳定性和商业支持有高要求的大型系统

1.4 tomcat的功能介绍

Tomcat 是一款开源的 Java Web 服务器,主要用于运行 Java 开发的 Web 应用程序,是 Java 生态中最常用的服务器之一。

1、运行 Java Web 应用
能解析和执行基于 Servlet、JSP 技术开发的程序,比如企业网站后台、管理系统、API 服务等。开发者编写的 Java Web 代码(如 Spring Boot 应用),最终需要部署到 Tomcat 上才能通过网络访问。

2、处理 HTTP 请求
内置了轻量级的 HTTP 服务器,可直接接收浏览器等客户端发送的 HTTP 请求,将请求传递给对应的 Java 程序处理,再把处理结果(如网页、数据)以 HTTP 响应的形式返回给客户端。

3、管理程序生命周期
作为 Servlet 容器,负责管理 Java Web 组件(如 Servlet)的创建、运行和销毁,提供这些组件运行所需的环境(如内存、网络连接等)。

4、支持多种部署方式
可以直接把 Web 应用打包成 WAR 文件,放到 Tomcat 的指定目录下,它会自动解压并运行,也支持通过管理界面手动部署应用。

二、Tomcat 核心优势

1. 轻量易用

  • 体积小巧:安装包仅 100MB 左右,占用系统资源少,适合中小型应用部署。
  • 部署简单:无需复杂配置,解压后即可运行,支持 Windows、Linux、macOS 等多平台。

2. 规范兼容

  • 严格遵循 Java EE 规范:支持 Servlet、JSP、EL 表达式、WebSocket 等核心技术规范,确保 Java Web 应用的兼容性和可移植性。
  • 版本同步更新:及时跟进 Java EE 规范升级,如 Tomcat 10 支持 Jakarta EE 9,适配最新的 API 标准。

3. 灵活可扩展

  • 模块化设计:核心组件(Catalina、Coyote、Jasper 等)解耦,可按需启用或扩展。
  • 支持自定义配置:通过 XML 配置文件或注解方式,灵活调整容器行为、线程池、连接器等参数。

4. 开发友好

  • 内置管理工具:提供 Web 管理界面(Manager App)和远程部署功能,方便应用管理。
  • 调试便捷:与主流 IDE(Eclipse、IntelliJ IDEA)无缝集成,支持热部署和断点调试。

5. 稳定可靠

  • 成熟的社区支持:Apache 基金会维护,全球开发者贡献代码,Bug 修复及时。
  • 容错机制完善:支持线程池隔离、请求超时控制、异常页面配置等,提升系统稳定性。

三、Tomcat 安装以及相关实验

3.1tomcat的安装

3.1.1 环境准备

192.168.134.100:nginx

192.168.134.10:tomcatA

192.168.134.20:tomcatb

3.1.2安装Java环境

#安装iava环境
[root@tomcatB ~]#  dnf install java-1.8.0-openjdk.x86_64 -y

#查看java版本
[root@tomcatB ~]# java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)

#查看java的环境目录
[root@tomcatB ~]# which java
/usr/bin/java
[root@tomcatB ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 30 10:54 /usr/bin/java -> /etc/alternatives/java

#java的运行环境
[root@tomcatB ~]# cd /etc/alternatives/jre
[root@tomcatB jre]# ls
ASSEMBLY_EXCEPTION  bin  lib  LICENSE  THIRD_PARTY_README

3.1.3 安装并启动tomcat

#解压并生成tomcat的程序目录
[root@tomcatA ~]#  tar -zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
[root@tomcatA ~]# cd /usr/local/
[root@tomcatA local]# ls
apache-tomcat-9.0.107  bin  etc  games  include  lib  lib64  libexec  sbin  shar
[root@tomcatA local]# mv apache-tomcat-9.0.107/ tomcat
[root@tomcatA local]# ls
bin  etc  games  include  lib  lib64  libexec  sbin  share  src  tomcat

#启动tomcat
[root@tomcatA local]# cd tomcat/
[root@tomcatA tomcat]# cd bin/
[root@tomcatA bin]# ls
bootstrap.jar       commons-daemon-native.tar.gz  makebase.sh       tomcat-juli.
catalina.bat        configtest.bat                setclasspath.bat  tomcat-nativ
catalina.sh         configtest.sh                 setclasspath.sh   tool-wrapper
catalina-tasks.xml  daemon.sh                     shutdown.bat      tool-wrapper
ciphers.bat         digest.bat                    shutdown.sh       version.bat
ciphers.sh          digest.sh                     startup.bat       version.sh
commons-daemon.jar  makebase.bat                  startup.sh
[root@tomcatA bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin
Using CATALINA_OPTS:
Tomcat started.

3.1.4 查看端口

[root@tomcatA ~]# netstat -antlupe grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      087/java

【注意:访问前要关闭防火墙】
[root@tomcatA ~]# systemctl disable --now  firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".

3.1.5 访问tomcat

3.2 生成Tomcat启动文件

tomcat的目录结构

目录         说明

-------------------------------------------------------

bin                   服务启动、停止等相关程序和文件

conf                 配置文件

lib                    库目录

logs                 日志目录

webapps         应用程序,应用部署目录,相当于nginx的默认发布目录

work jsp          编译后的结果文件,建议提前预热访问

3.2.1 生成tomcat的主配置文件

[root@tomcatA ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre

3.2.2 生成启动文件

[root@tomcatA conf]# vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target 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
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

3.2.3 生成tomcat用户并设定软件安装目录权限

[root@tomcatA conf]# useradd -s /sbin/nologin -M tomcat
[root@tomcatA conf]# chown tomcat.tomcat /usr/local/tomcat/ -R

3.2.4 用启动脚本开启服务

[root@tomcatA conf]#  systemctl enable --now tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.

3.2.5 查看服务是否开启

3.3 nginx+tomcat多端负载均衡

结合反向代理实现tomcat部署

standalone模式,Tomcat单独运行,直接接受用户的请求,不推荐。

反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代 理给Tomcat

        LNMT:Linux + Nginx + MySQL + Tomcat

        LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat

前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调度,Tomcat上部署的纯动态页面更 适合

        LNMT:Linux + Nginx + MySQL + Tomcat

多级代理

        LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat

3.3.1 安装nginx服务

[root@nginx ~]# dnf install -y nginx

3.3.2 配置子文件

[root@nginx local]# vim /etc/nginx/conf.d/vhosts.conf
upstream tomcat {
        hash $cookie_JSESSIONID;
        server 192.168.134.10:8080;
        server 192.168.134.20:8080;
}
server {
        listen 80;
        server_name www.zx.org;
        location ~ \.jsp$ {
                #proxy_pass http://192.168.134.10:8080;(单机反向)
                proxy_pass http://tomcat;(多机反向)
         }
}

3.3.3  开启服务

#关闭防火墙
[root@nginx ~]# systemctl disable --now firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".

#开启服务
[root@nginx ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@nginx ~]# netstat -antlupe | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          98707      30362/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      0          98708      30362/nginx: master

3.3.4 给tomcat服务器上配置测试文件

[root@tomcatA ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@tomcatA ~]# systemctl restart tomcat

3.3.5 测试

单机反向代理

反向代理多机

3.4 Memcached

Memcached 是一款开源的高性能分布式内存缓存系统,主要用于减轻数据库负载、提高应用程序响应速度。它通过将频繁访问的数据存储在内存中,减少对数据库的直接查询,从而提升系统性能。

核心特性
1、内存存储
数据完全存储在内存中,读写速度极快(微秒级响应),适合存储频繁访问的热点数据(如用户会话、商品信息、计数器等)。

2、分布式架构
支持多服务器集群部署,可通过哈希算法将数据分散到不同节点,实现负载均衡和横向扩展,单节点可处理每秒数十万次请求。

3、简单键值存储
采用键值(Key-Value)结构存储数据,键是字符串(最大 250 字节),值可以是任意数据(最大 1MB),不支持复杂查询(如 SQL)。

4、过期策略
每个键值对可设置过期时间(TTL),过期后自动删除,也支持 LRU(最近最少使用)淘汰机制,当内存不足时自动清理不常用数据。

5、无持久化
数据仅存于内存,不写入磁盘,服务器重启后数据会丢失,因此通常作为 “缓存” 而非 “数据库” 使用,需配合后端数据库持久化数据。

6、轻量级协议
使用简单的文本协议或二进制协议通信,支持多种编程语言(Java、Python、PHP 等)的客户端库。

3.5 session共享服务器

当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备 份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于 备份了一份Session 如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在 memcached1中

3.5.1 安装插件

#安装telnet
[root@tomcatA ~]# dnf install -y telnet

#安装memcache
[root@tomcatA ~]# dnf install -y memcached.x86_64
[root@tomcatA ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcatA ~]# systemctl enable --now memcached
Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service →    /usr/lib/systemd/system/memcached.service.
[root@tomcatA ~]# netstat -antlupe | grep memcache
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN         981        78015      31797/memcached
tcp6       0      0 ::1:11211               :::*                    LISTEN         981        78016      31797/memcached
#安装telnet
[root@tomcatA ~]# dnf install -y telnet

#安装memcache
[root@tomcatA ~]# dnf install -y memcached.x86_64
[root@tomcatA ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcatA ~]# systemctl enable --now memcached
Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service →    /usr/lib/systemd/system/memcached.service.
[root@tomcatA ~]# netstat -antlupe | grep memcache
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN         981        78015      31797/memcached
tcp6       0      0 ::1:11211               :::*                    LISTEN         981        78016      31797/memcached

3.5.2 修改tomcat配置

[root@tomcatA ~]# vim /usr/local/tomcat/conf/context.xml
在context标签中的最后
 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.134.10:11211,n2:192.168.134.20:11211"
        failoverNodes="n1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

[root@tomcatB ~]# vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.134.10:11211,n2:192.168.134.20:11211"
        failoverNodes="n2"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

3.5.3 测试

1.在两台tomcat都开启的情况下:
http://www.zx.org/test.jsp
2.在n1被停止后继续提交信息看是否可以读取到之前的会话信息