tomcat
一 介绍
前端三大核心技术:
HTML(HyperText Markup Language)超文本标记语言
CSS(Cascading Style Sheets)层叠样式表
Javascript 简称 JS ,是一种动态的弱类型脚本解释性语言
同步:即要更新网页中一小部分(如提交账号密码等)缺将整个网页一起更新
异步:只更新要更新的部分,其他部分不便
WEB框架
web访问流程:

后台应用框架

单体架构:
传统架构(单机系统),一个项目一个工程,统一部署,一个进程
all in one 的架构方式,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。
如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。
Java 实现: JSP 、 Servlet ,打包成一个 jar 、 war 部署
优点:易于开发和测试 : 也十分方便部署 ; 当需要扩展时,只需要将 war 复制多份,然后放到多个服务器上, 再做个负载均衡就可以了。
缺点:如果某个功能模块出问题,有可能全站不可访问,修改 Bug 后、某模块功能修改或升级后,需要停 掉整个服务,重新整体重新打包、部署这个应用war 包,功能模块相互之间耦合度高 , 相互影响 , 不适 合当今互联网业务功能的快速迭代。 特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,我们如何维护、如何分工
合作都是问题。如果项目庞大,管理难度大
微服务
属于 SOA ( Service Oriented Architecture )的子集
将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一
个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能
够被独立地部署到生产环境、类生产环境等。
服务之间采用轻量级的通信机制(通常是基于 HTTP 的 RESTful API )。
web应用服务器
开源的 tomcat 、 jetty 、 glassfish
商用的有 weblogic 、 websphere 、 Jboss
tomcat是免费开源的web应用服务器
官网:https://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
二 安装
实验环境:两个web应用服务器,一个nginx服务器
1.下载安装包
bash
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz
2.部署tomcat
检查是否开启httpd服务,开启要关闭
bash
[root@RS1 ~]# systemctl status httpd
[root@RS1 ~]# systemctl disable --now httpd
Removed "/etc/systemd/system/multi-user.target.wants/httpd.service".
[root@RS1 ~]#
bash
安装运行所需的java
[root@RS1 ~]# yum install java-1.8.0-openjdk.x86_64 -y
[root@RS1 ~]# tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local
z 识别并处理 gzip 格式的压缩包(对应 .tar.gz/.tgz 后缀),自动调用 gzip 解压
x 执行解压操作(extract),是解压场景的核心参数
f 指定要处理的压缩包文件(file),f 后必须紧跟压缩包文件名(不能分开)
-C /usr/local C 是 Change directory 的缩写,指定解压后的文件放到 /usr/local 目录(而非当前目录)
[root@RS1 ~]# cd /usr/local/
[root@RS1 local]# ls
apache-tomcat-9.0.115 bin etc games include lib lib64 libexec sbin share src
[root@RS1 local]# mv apache-tomcat-9.0.115/ tomcat
[root@RS1 local]# cd tomcat/
[root@RS1 tomcat]# ls
bin BUILDING.txt conf CONTRIBUTING.md lib LICENSE logs NOTICE README.md RELEASE-NOTES RUNNING.txt temp webapps work
[root@RS1 tomcat]#
[root@RS1 tomcat]# cd bin
[root@RS1 bin]# ./startup.sh
// #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/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@RS1 bin]# netstat -antlupe | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 0 40232 3833/java
[root@RS1 bin]#
3.制作tomcat的启动脚本
bash
[root@RS1 bin]# vim /usr/local/tomcat/conf/tomcat.conf
1 JAVA_HOME=/etc/alternatives/jre
定义 Tomcat 运行依赖的JAVA_HOME环境变量,指向系统中 JRE(Java 运行环境)的软链接路径(/etc/alternatives/jre是 Linux 系统中 Java 的统一替代路径,避免手动指定具体 JRE 版本),Tomcat 必须通过这个变量找到 Java 环境才能启动。
[root@RS1 bin]# vim /lib/systemd/system/tomcat.service
#systemd管理Tomcat服务的核心配置文件
1 [Unit]
2 Description=Tomcat
3 #After=syslog.target network.target remote-fs.target nss-lookup.target
4 After=syslog.target network.target
5
6 [Service]
7 Type=forking
8 EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
9 ExecStart=/usr/local/tomcat/bin/startup.sh
10 ExecStop=/usr/local/tomcat/bin/shutdown.sh
11 PrivateTmp=true
12 User=tomcat
13 Group=tomcat
14
15 [Install]
16 WantedBy=multi-user.target
[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@RS1 bin]# useradd -s /sbin/nologin -M tomcat
//创建tomcat系统用户:
- -s /sbin/nologin:禁止该用户通过 SSH / 终端登录(仅用于运行服务,提高安全性);
- -M:不创建该用户的家目录(无需登录,节省资源)
[root@RS1 bin]# chown tomcat.tomcat /usr/local/tomcat/ -R
递归修改 Tomcat 安装目录的属主和属组为tomcat:tomcat:
- -R:递归处理所有子文件 / 目录;
- 确保tomcat用户有读写执行权限,避免启动时权限不足。
[root@RS1 bin]# systemctl daemon-reload
重新加载 systemd 的配置文件:因为修改了tomcat.service,需要让 systemd 识别新配置,否则服务管理命令会失效。
[root@RS1 bin]# systemctl enable --now tomcat.service
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.
[root@RS1 bin]# netstat -antlupe | grep java
[root@RS1 bin]# systemctl enable --now tomcat.service
[root@RS1 bin]# netstat -antlupe | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1000 50603 4387/java
tcp6 0 0 :::8080 :::* LISTEN 1000 50591 4387/java
//查看系统网络连接,并过滤和 Java 相关的进程:
- -a:显示所有连接;
- -n:显示端口号(而非服务名);
- -t:显示 TCP 连接;
- -u:显示 UDP 连接;
- -l:显示监听状态的端口;
- -p:显示进程 ID 和进程名;
- -e:显示用户 ID 等扩展信息;
4.访问tomcat(服务器ip:8080)
三 nginx与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
LNMT : Linux + Nginx + MySQL + Tomcat
多级代理:LNNMT : Linux + Nginx + Nginx + MySQL + Tomcat
1.单体架构
利用nginx反向代理实现,编辑子配置文件添加

bash
nginx服务器上:
[root@nginx ~]# cd /usr/local/nginx/conf/conf.d/
[root@nginx conf.d]# ls
anti-leeching.conf.bak proxy.conf.bak ssl_https.conf.bak vhosts_status.conf.bak
php.conf setvariable.conf.bak vhosts.conf.bak WEBrewrite.conf.bak
[root@nginx conf.d]# mv php.conf p
php.conf proxy.conf.bak
[root@nginx conf.d]# mv php.conf php.conf.bak
[root@nginx conf.d]# vim tomcat.conf
1 server {
2 listen 80;
3 server_name app.xier.org;
4 location ~* \.jsp$ {
5 proxy_pass http://172.25.254.10:8080;
6 }
7 }
tomcat服务器上:
先上传准备好的test.jsp文件到root的/usr/local/tomcat/webapps/ROOT/目录下
[root@nginx ~]# scp test.jsp root@172.25.254.10:/usr/local/tomcat/webapps/ROOT/
test.jsp 100% 968 2.1MB/s 00:00
[root@nginx ~]# scp test.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/
[root@nginx ~]#
[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx ~]# nginx -s reload
[root@nginx ~]#
测试:
在windows中设定app.xier.org的解析并在浏览器中访问app.xier.org/test.jsp
即在C:\Windows\System32\drivers\etc\hosts中添加

2.tomcat负载均衡
bash
[root@nginx ~]# cd /usr/local/nginx/conf/conf.d/
[root@nginx conf.d]# ll
总用量 36
-rw-r--r-- 1 root root 377 2月 6 19:00 anti-leeching.conf.bak
-rw-r--r-- 1 root root 568 2月 8 14:28 php.conf.bak
-rw-r--r-- 1 root root 620 2月 6 19:00 proxy.conf.bak
-rw-r--r-- 1 root root 233 2月 6 19:00 setvariable.conf.bak
-rw-r--r-- 1 root root 349 2月 6 19:00 ssl_https.conf.bak
-rw-r--r-- 1 root root 116 2月 13 23:58 tomcat.conf
-rw-r--r-- 1 root root 652 2月 6 19:00 vhosts.conf.bak
-rw-r--r-- 1 root root 205 2月 6 19:00 vhosts_status.conf.bak
-rw-r--r-- 1 root root 636 2月 6 19:00 WEBrewrite.conf.bak
[root@nginx conf.d]# vim tomcat.conf
处理 /root/.vimrc 时发生错误:
第 3 行:
E488: Trailing characters: set relativenumber: #set relativenumber
请按 ENTER 或其它命令继续
1 #server {
2 # listen 80;
3 # server_name app.xier.org;
4 # location ~* \.jsp$ {
5 # proxy_pass http://172.25.254.10:8080;
6 # }
7 #}
8 upstream tomcat {
9 hash $cookie_JSESSIONID;
10 server 172.25.254.10:8080;
11 server 172.25.254.20:8080;
12 }
13 server {
14 listen 80;
15 server_name app.xier.org;
16 location ~* \.jsp$ {
17 proxy_pass http://tomcat;
18 }
19 }
[root@nginx conf.d]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx conf.d]# nginx -s reload
测试
在windows中设定app.xier.org的解析并在两个浏览器中访问app.xier.org/test.jsp

四 tomcat+memcache实现session会话零丢失
Memcached介绍:
Memcached 只支持能序列化的数据类型,不支持持久化,基于 Key-Value的内存缓存系统,
可以通过做集群同步的方式, 让各memcached 服务器的数据进行同步,从而实现数据的一致性,即保证各 memcached 的数据是一样 的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候 , 可以自动从有数据的 memcached 当中自动获取数据并 提供服务。
Memcached 官网: http://memcached.org/
session共享服务器
msm介绍
msm ( memcached session manager )提供将 Tomcat 的 session 保持到 memcached 可以实现高可用。
项目早期托管在 google code, 目前在 Github
github 网站链接 : https://github.com/magro/memcached-session-manager

原理:交叉保存
即
t1 和 m1 部署可以在一台主机上, t2 和 m2 部署也可以在同一台。
当新用户发请求到 Tomcat1 时 , Tomcat1 生成 session 返回给用户的同时 , 也会同时发给 memcached2 备
份。即 Tomcat1 session 为主 session , memcached2 session 为备用 session ,使用 memcached 相当于
备份了一份 Session
如果 Tomcat1 发现 memcached2 失败 , 无法备份 Session 到 memcached2, 则将 Sessoin 备份存放在
memcached1 中
安装
参考链接 : https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将 spymemcached.jar 、 memcached-session-manage 、 kyro 相关的 jar 文件都放到 Tomcat 的 lib 目录
中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是 /usr/local/tomcat/lib
1.tomcat加载模块
先上传jar.zip到RS1
bash
[root@RS1 ~]#
[root@RS1 ~]# unzip jar.zip
Archive: jar.zip
creating: jar/
inflating: jar/asm-5.2.jar
inflating: jar/kryo-3.0.3.jar
inflating: jar/kryo-serializers-0.45.jar
inflating: jar/memcached-session-manager-2.3.2.jar
inflating: jar/memcached-session-manager-tc9-2.3.2.jar
inflating: jar/minlog-1.3.1.jar
inflating: jar/msm-kryo-serializer-2.3.2.jar
inflating: jar/objenesis-2.6.jar
inflating: jar/reflectasm-1.11.9.jar
inflating: jar/spymemcached-2.12.3.jar
[root@RS1 ~]# cd jar/
[root@RS1 jar]# cp * /usr/local/tomcat/lib/
[root@RS1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/
asm-5.2.jar 100% 52KB 37.8MB/s 00:00
kryo-3.0.3.jar 100% 279KB 62.2MB/s 00:00
kryo-serializers-0.45.jar 100% 123KB 54.2MB/s 00:00
memcached-session-manager-2.3.2.jar 100% 163KB 80.4MB/s 00:00
memcached-session-manager-tc9-2.3.2.jar 100% 11KB 20.7MB/s 00:00
minlog-1.3.1.jar 100% 5923 8.3MB/s 00:00
msm-kryo-serializer-2.3.2.jar 100% 37KB 35.4MB/s 00:00
objenesis-2.6.jar 100% 54KB 16.1MB/s 00:00
reflectasm-1.11.9.jar 100% 71KB 56.1MB/s 00:00
spymemcached-2.12.3.jar 100% 463KB 149.7MB/s 00:00
2.安装 memcache
bash
[root@RS2 ~]# dnf install memcached -y
[root@RS1 ~]# dnf install memcached -y
[root@RS1 ~]# vim /etc/sysconfig/memcached
[root@RS2 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
//127.0.0.1 ---0.0.0.0
[root@RS1 ~]# systemctl restart memcached.service
[root@RS1 ~]# netstat -antluple | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 987 40256 2298/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 987 40257 2298/memcached
[root@RS1 ~]#
[root@RS2 ~]# systemctl restart memcached.service
[root@RS2 ~]# netstat -antluple | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 988 45515 5004/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 988 45516 5004/memcached
[root@RS2 ~]#
3.tomcat配置
下载相关 jar 包 , 参考下面官方说明的下载链接(配置文件同样参考官方文档)
https://github.com/magro/memcached-session-manager/wiki/SetupAnd
bash
vim /usr/local/tomcat/conf/context.xml
29 <Manager pathname="" />
30 -->
31 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
32 memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
33 failoverNodes="n2"
34 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
35 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
36 />
37
[root@RS1 ]# vim /usr/local/tomcat/conf/context.xml
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@RS2 ~]# vim /usr/local/tomcat/conf/context.xml
3 <Manager pathname="" />
2 -->
1 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
32 memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
1 failoverNodes="n2"
2 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
3 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
4 />
5 </Context>
[root@RS2 ~]# systemctl restart tomcat.service
[root@RS1 ~]# systemctl restart tomcat.service
测试
在一个浏览器中访问,提交数据后关闭当前服务器10,

bash
[root@RS1 ~]# systemctl stop tomcat.service
跳转到20上后在提交查看数据是否还在
