企业级WEB应用服务器TOMCAT

发布于:2025-08-04 ⋅ 阅读:(18) ⋅ 点赞:(0)

一.tomcat的功能介绍

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和
并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet
JSP容器起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson
1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级
项目
Tomcat 仅仅实现了Java EE规范中与ServletJSP相关的类库,是JavaEE不完整实现。
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 JSP 1.1规范。
Tomcat 4.x发布时,内建了CatalinaServlet容器)和 JasperJSP engine)等
当前 Tomcat 的正式版本已经更新到 9.0.x 版本,但当前企业中主流版本为 8.x 7.x
官网:
http://tomcat.apache.org/
官网文档:
https://tomcat.apache.org/tomcat-8.5-doc/index.html
帮助文档:
https://cwiki.apache.org/confluence/display/tomcat/
https://cwiki.apache.org/confluence/display/tomcat/FAQ
1.1安装 Tomcat

1.安装java环境

[root@tomcatA ~]# yum install java-1.8.0-openjdk.x86_64   -y

#查看版本信息
[root@tomcatA ~]# java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)

#查看java的环境目录
[root@tomcatA ~]# which java
/usr/bin/java
[root@tomcatA ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 30 10:41 /usr/bin/java -> /etc/alternatives/java
#java的运行环境
[root@tomcatA ~]# cd /etc/alternatives/jre
[root@tomcatA jre]# ls
ASSEMBLY_EXCEPTION bin lib LICENSE THIRD_PARTY_README

2.安装tomcat

#解压并生成tomcat程序目录
[root@tomcatA ~]# tar xzf apache-tomcat-9.0.107.tar.gz  -C /usr/local/
[root@tomcatA ~]# cd /usr/local/
[root@tomcatA local]# ll
total 4
drwxr-xr-x. 9 root root 4096 Jul 30 10:58 apache-tomcat-9.0.107
drwxr-xr-x. 2 root root    6 Aug 10  2021 bin
drwxr-xr-x. 2 root root    6 Aug 10  2021 etc
drwxr-xr-x. 2 root root    6 Aug 10  2021 games
drwxr-xr-x. 2 root root    6 Aug 10  2021 include
drwxr-xr-x. 2 root root    6 Aug 10  2021 lib
drwxr-xr-x. 3 root root   17 Jul 11 13:36 lib64
drwxr-xr-x. 2 root root    6 Aug 10  2021 libexec
drwxr-xr-x. 2 root root    6 Aug 10  2021 sbin
drwxr-xr-x. 5 root root   49 Jul 11 13:36 share
drwxr-xr-x. 2 root root    6 Aug 10  2021 src

[root@tomcatA local]# mv apache-tomcat-9.0.107/ tomcat

#启动文件目录
[root@tomcatA tomcat]# cd bin/
[root@tomcatA bin]# ls
bootstrap.jar                 makebase.sh
catalina.bat                  setclasspath.bat
catalina.sh                   setclasspath.sh
catalina-tasks.xml            shutdown.bat
ciphers.bat                   shutdown.sh
ciphers.sh                    startup.bat
commons-daemon.jar            startup.sh
commons-daemon-native.tar.gz  tomcat-juli.jar
configtest.bat                tomcat-native.tar.gz
configtest.sh                 tool-wrapper.bat
daemon.sh                     tool-wrapper.sh
digest.bat                    version.bat
digest.sh                     version.sh
makebase.bat
#启动
[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.j ar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.

3.查看端口:

[root@tomcatA ~]# netstat -antlupe | grep java
tcp6      0     0 :::8080           :::*     LISTEN     1001       43823      4723/java
tcp6      0     0 127.0.0.1:8005    :::*     LISTEN     1001       42620      4723/java
[root@tomcatA ~]#

4.访问:

1.2 tomcat**的文件结构和组成**

目录结构

目录 说明
-------------------------------------------------------
bin         服务启动、停止等相关程序和文件
conf        配置文件
lib         库目录
logs        日志目录
webapps     应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp    编译后的结果文件,建议提前预热访问
1.3 生成**tomcat的启动文件**

1.生成主配置文件

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

2.生成启动文件

[root@tomcatA ~]# cat /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
[root@tomcatA ~]#
​

3.创建用户tomcat并且设置安装目录权限

[root@tomcatA ~]# useradd -s /sbin/nologin -M tomcat   #-M强制不创建主目录
[root@tomcatA ~]# chown tomcat.tomcat /usr/local/tomcat/ -R 

4.用启动脚本开启服务

[root@tomcatA ~]# systemctl enable --now tomcat

二. 结合反向代理实现tomcat部署

2.1 常见部署方式介绍

  • 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

2.2 利用 nginx 反向代理实现

配置

[root@nginx conf.d]# cat /etc/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name timilee.org;
        root        /web/nginx;
        location ~\.jsp$ {
                 proxy_pass http://192.168.217.10:8080;
         }
}

将test.jsp放到tomcat默认的测试页面目录下
[root@tomcatA ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[root@tomcatA ROOT]# ll
total 168
-rw-r-----. 1 tomcat tomcat 27235 Jul  2 15:01 asf-logo-wide.svg
-rw-r-----. 1 tomcat tomcat   713 Jul  2 15:01 bg-button.png
-rw-r-----. 1 tomcat tomcat  1918 Jul  2 15:01 bg-middle.png
-rw-r-----. 1 tomcat tomcat  1401 Jul  2 15:01 bg-nav.png
-rw-r-----. 1 tomcat tomcat  3103 Jul  2 15:01 bg-upper.png
-rw-r-----. 1 tomcat tomcat 21630 Jul  2 15:01 favicon.ico
-rw-r-----. 1 tomcat tomcat 12234 Jul  2 15:01 index.jsp
-rw-r-----. 1 tomcat tomcat  6902 Jul  2 15:01 RELEASE-NOTES.txt
-rw-r--r--. 1 root   root     968 Jul 30 13:22 test.jsp
-rw-r-----. 1 tomcat tomcat  5584 Jul  2 15:01 tomcat.css
-rw-r-----. 1 tomcat tomcat 67795 Jul  2 15:01 tomcat.svg
drwxr-x---. 2 tomcat tomcat    21 Jul 30 10:58 WEB-INF
[root@tomcatA ROOT]#

测试

 

2.3 实现tomcat中的负载均衡

动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载均衡。

当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。而这个问题的由来,都是由于HTTP协议在设计之初没有想到未来的发展。

2.3.1 HTTP**的无状态,有连接和短连接**
  • 无状态:指的是服务器端无法知道2次请求之间的联系,即使是前后2次请求来自同一个浏览器,也没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie、session机制来判断。

    • 浏览器端第一次HTTP请求服务器端时,在服务器端使用session这种技术,就可以在服务器端产生一个随机值即SessionID发给浏览器端,浏览器端收到后会保持这个SessionID在Cookie当中,这个Cookie值一般不能持久存储,浏览器关闭就消失。浏览器在每一次提交HTTP请求的时候会把这个SessionID传给服务器端,服务器端就可以通过比对知道是谁了

    • Session通常会保存在服务器端内存中,如果没有持久化,则易丢失

    • Session会定时过期。过期浏览器如果再访问,服务端发现没有此ID,将给浏览器端重新发新SessionID

    • 更换浏览器也将重新获得新的SessionID

  • 有连接:是因为它基于TCP协议,是面向连接的,需要3次握手、4次断开。

  • 短连接:Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的影响。所以,自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设置),浏览器再访问该服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率。

服务器端如果故障,即使Session被持久化了,但是服务没有恢复前都不能使用这些SessionID。

如果使用HAProxy或者Nginx等做负载均衡器,调度到了不同的Tomcat上,那么也会出现找不到

SessionID的情况。

2.3.2 tomcat**负载均衡实现**

配置

[root@nginx nginx]# cat /etc/nginx/conf.d/vhosts.conf
upstream tomcat{
       # hash $cookie_JSESSIONID;
        server 192.168.217.10:8080;
        server 192.168.217.20:8080;
   }
server {
    listen 80;
        root    /web/nginx;
    server_name timilee.org;
        access_log /web/nginx/log/access.log;
        error_log /web/nginx/log/error.log;
        location ~\.jsp$ {
                # proxy_pass http://192.168.217.10:8080;
             proxy_pass http://tomcat;
         }
}
[root@nginx nginx]#

三. memcached

3.1 简介

Memcached 是一个开源、高性能、分布式 内存缓存系统,常用于加速动态 Web 应用,减轻数据库负载。它通过在内存中缓存数据和对象来避免频繁访问数据库或 API。

说明
Key-Value存储 简单的字典结构(如 key=user:123 -> value={"name":"Alice"})。
LRU淘汰 内存不足时,自动删除最近最少使用的(LRU)数据。
分布式 多台服务器可组成集群,但 无中心节点,客户端通过一致性哈希分片数据。
非持久化 数据仅存在于内存,重启服务或机器后丢失(需搭配数据库持久化)。

 

5.2 memcached的安装与启动

[root@tomcat ~]# yum install memcached -y
[root@tomcat ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcat ~]# systemctl enable --now memcached
[root@tomcat ~]# netstat -antlupe | grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN
980 97815 34711/memcached
5.3 memcached操作命令

五种基本 memcached 命令执行最简单的操作。这些命令和操作包括:

- set      #修改

- add   #添加
- replace   #

- get     #察看

- delete    #删除


#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>
#参数说明如下:
command set/add/replace
key key 用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes 在缓存中存储的字节数
value 存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes
 

[root@tomcat ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
#增加
add leekey 0 60 4 #0 是否压缩 60 过期时间 4 字长
test
STORED
add leekey1 0 60 3
lee
STORED
#查看
get leekey
VALUE leekey 0 4
test
get leekey1
VALUE leekey1 0 3
lee
#改
set leekey 0 60 5
test1
STORED
get leekey
VALUE leekey 0 5
test1
END
add leekey1 0 60 4
test
#删除
delete leekey
DELETED
get leekey
END
get leekey1
VALUE leekey1 0 3
lee
#清空
flush_all
OK
get leekey1
END

四 session 共享服务器

4.1 msm 介绍

msmmemcached session manager)提供将Tomcatsession保持到memcached可以实现高可用。

项目早期托管在google code,目前在Github
github网站链接: https://github.com/magro/memcached-session-manager
支持Tomcat 6.x7.x8.x9.x
        Tomcat的Session管理类,Tomcat版本不同
                memcached-session-manager-2.3.2.jar
                memcached-session-manager-tc9-2.3.2.jar
Session数据的序列化、反序列化类
        官方推荐kyro
        在webappWEB-INF/lib/
驱动类
        memcached(spymemcached.jar)
        Redis(jedis.jar)
4.2 安装
将jar压缩包解压后把解压后的文件

```bash
[root@tomcatA mnt]# unzip jar.zip
[root@tomcatA mnt]# cd jar/
[root@tomcatA jar]# ls
asm-5.2.jar                          memcached-session-manager-tc9-2.3.2.jar  reflectasm-1.11.9.jar
kryo-3.0.3.jar                       minlog-1.3.1.jar                         spymemcached-2.12.3.jar
kryo-serializers-0.45.jar            msm-kryo-serializer-2.3.2.jar
memcached-session-manager-2.3.2.jar  objenesis-2.6.jar

#将相关的jar文件放到tomcat的lib目录里
[root@tomcatA jar]# cp * /usr/local/tomcat/lib/

[root@tomcatA jar]# ls /usr/local/tomcat/lib/
annotations-api.jar       jasper.jar                               servlet-api.jar          tomcat-i18n-ko.jar
asm-5.2.jar               jaspic-api.jar                           spymemcached-2.12.3.jar  tomcat-i18n-pt-BR.jar
catalina-ant.jar          jsp-api.jar                              tomcat-api.jar           tomcat-i18n-ru.jar
catalina-ha.jar           kryo-3.0.3.jar                           tomcat-coyote-ffm.jar    tomcat-i18n-zh-CN.jar
catalina.jar              kryo-serializers-0.45.jar                tomcat-coyote.jar        tomcat-jdbc.jar
catalina-ssi.jar          memcached-session-manager-2.3.2.jar      tomcat-dbcp.jar          tomcat-jni.jar
catalina-storeconfig.jar  memcached-session-manager-tc9-2.3.2.jar  tomcat-i18n-cs.jar       tomcat-util.jar
catalina-tribes.jar       minlog-1.3.1.jar                         tomcat-i18n-de.jar       tomcat-util-scan.jar
ecj-4.20.jar              msm-kryo-serializer-2.3.2.jar            tomcat-i18n-es.jar       tomcat-websocket.jar
el-api.jar                objenesis-2.6.jar                        tomcat-i18n-fr.jar       websocket-api.jar
jasper-el.jar             reflectasm-1.11.9.jar                    tomcat-i18n-ja.jar

```

tomcat1和m1部署在一台主机上,tomcat2和m2也部署在同一台。

当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于备份了一份Session

如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在memcached1中,就是交叉存储

6.3 配置过程

修改tomcat配置

[root@tomcat-1 ~]# vim /usr/local/tomcat/conf/context.xml
@@@@内容省略@@@@
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.217.10:11211,n2:192.168.217.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
/>

[root@tomcat-2 tomcat]# vim /usr/local/tomcat/conf/context.xml
@@@@内容省略@@@@
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.217.10:11211,n2:192.168.217.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
/>

nginx配置:

[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name lee.timinglee.org;
root /webdataw/nginx/timinglee.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}

测试:

没配置前:

正常在10提交数据,当10的tomcat挂掉后,再继续提交数据就会跳到20,但先前写入的数据会消失,20的tomcat找不到先前提交到数据

[root@tomcatA ~]# systemctl stop tomcat.service

 

配置后:  

停掉tomcat1
[root@tomcatA ~]# systemctl stop tomcat.service
[root@tomcatA ~]#

继续提交数据,tomcat2接手,并且有先前提交的数据


网站公告

今日签到

点亮在社区的每一天
去签到