企业级WEB应用服务器TOMCAT


Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理 HTML 页面的功能,它还是一个 Servlet 和 JSP容器

1、安装****Tomcat

(1)、tomcat****的文件结构和组成

目录结构
目录 说明

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

(2)、查看tomcat相关目录和文件

复制代码
[root@tomcat ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat ~]# ls /usr/local/tomcat/
bin conf lib logs README.md RUNNING.txt
webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work

A、tomcat环境部署

复制代码
[root@cat10 conf]# chmod +x /usr/bin/tomcat

2、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

(1)、利用nginx反向代理实现


利用 nginx 反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个 tomcat 主机
利用 nginx 指令 proxy_pass 可以向后端服务器转发请求报文 , 并且在转发时会保留客户端的请求报文中的 host首部

(2)、实现tomcat中的负载均衡

动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压 力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance 负载
均衡。
当单机 Tomcat ,演化出多机多级部署的时候,一个问题便凸显出来,这就是 Session 。而这个问题的由来,都是由于HTTP 协议在设计之初没有想到未来的发展。
B、tomecat反向代理及负载均衡

复制代码
[root@cat10 ~]# ls
-  anaconda-ks.cfg  apache-tomcat-9.0.93.tar.gz  test.jsp
[root@cat10 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@cat10 ~]# scp test.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/
root@172.25.254.20's password: 
test.jsp                                           100%  968   801.0KB/s   00:00  



[root@cat10~]# cd /usr/local/nginx/conf.d
[root@cat10 conf.d]# ls
vhosts.conf
[root@cat10 conf.d]# vim vhosts.conf
upstream tomcat {
ip_bash;
#hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name lee.ll.org;
root /webdataw/nginx/ll.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;
}
}

[root@cat10 conf.d]#nginx -s reload

C、负载均衡

复制代码
[root@tomcat ~]# vim /usr/local/nginx/conf.d/tomcat.conf
upstream tomcat {
    hash $cookie_JSESSIONID;
    server 172.25.254.10:8080;
    server 172.25.254.20:8080;
}
server {
    listen 80;
    server_name www.ll.org;
    root /data/web/html;
    index index.html;
    location ~ \.jsp$ {
        proxy_pass http://tomcat;
    }
}
[root@tomcat ~]# nginx -s reload

# 模拟tomcat2出现故障
[root@cat10 ~]# systemctl stop tomcat

3、Memcached

(1)、简介

Memcached 只支持能序列化的数据类型,不支持持久化,基于 Key-Value 的内存缓存系统 memcached虽然没有像redis 所具备的数据持久化功能,比如 RDB 和 AOF 都没有,但是可以通过做集群同步的方式, 让各memcached 服务器的数据进行同步,从而实现数据的一致性,即保证各 memcached 的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候 , 可以自动从有数据的 memcached 当中自动获取数据并提供服务。
Memcached 借助了操作系统的 libevent 工具做高效的读写。 libevent 是个程序库,它将 Linux epoll 、 BSD类操作系统的 kqueue 等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached 使用这个 libevent 库,因此能在 Linux 、 BSD 、 Solaris 等操作系统上发挥其高性能

D、memcached****的安装与启动

复制代码
[root@cat10 ~]# yum install memcached -y
[root@cat10 ~]#  vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

[root@cat10 ~]# systemctl enable --now memcached
[root@cat10 ~]# netstat -antlupe | grep memcache
tcp    0   0 0.0.0.0:11211     0.0.0.0:*       LISTEN  975    122107     43014/memcached 
tcp6   0   0 ::1:11211         :::*            LISTEN  975    122108     43014/memcached 


[root@cat20 ~]# yum install memcached -y
[root@cat20 ~]#  vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"

[root@cat20 ~]# systemctl enable --now memcached
[root@cat20 ~]# netstat -antlupe | grep memcache

(2)、操作命令

set 多数据存储在缓存中,如果指定的键已经存在,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

4、session****共享服务器

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

E、seesion会话保持的实现

复制代码
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录
中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。
kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar


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

cat10、cat2中修改tomcat配置
[root@cat10 ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
    . . . . . .
    <Manager pathname="" />
    -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="m1:172.25.254.10:11211,m2:172.25.254.20:11211"
        failoverNodes="m1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        	transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
[root@cat10 ~]# systemctl restart memcached


[root@cat20 ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
    . . . . . .
    <Manager pathname="" />
    -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="m1:172.25.254.10:11211,m2:172.25.254.20:11211"
        failoverNodes="m1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        	transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>
[root@cat20 ~]# systemctl restart memcached

tomcat(50)中修改配置
[root@tomcat ~]# 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 ll.ll.org;
root /webdataw/nginx/ll.org/ll;
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;
}
}

测试:http://ll.timinglee.org/test.jsp

相关推荐
寻星探路43 分钟前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅2 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
曹牧3 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
passerby60613 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅3 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法4 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7254 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎4 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven