【tomcat详解】功能+部署+Nginx反向代理+Memcached+session会话

目录

一、Tomcat简介

二、Tomcat功能介绍

[2.2 tomcat文件组成](#2.2 tomcat文件组成)

[2.3 生成tomcat启动文件](#2.3 生成tomcat启动文件)

三、Tomcat部署

[3.1 常见部署方式介绍](#3.1 常见部署方式介绍)

[3.2 利用nginx实现反向代理](#3.2 利用nginx实现反向代理)

四、Memcached

[4.1 memcached安装启动](#4.1 memcached安装启动)

[4.2 memcached操作命令](#4.2 memcached操作命令)

五、Session共享服务器

[5.1 msm介绍](#5.1 msm介绍)


一、Tomcat简介

Tomcat是一个免费开源的Servlet/JSP容器,由apache软件基金会(ASF)结合JServ开源成为顶级项目。主要作为轻量级、高性能应用服务器使用,在中小型系统和并发访问用户不是很多的场合下被普遍使用,不仅支持JavaEE规范和Servlet/JSP类库,还能作为一个完整的应用服务程序来运行企业级的java应用程序。

主要功能:

  • Web容器功能:可以部署Web应用,处理HTTP请求和生成HTTP响应。

  • Servlet/JSP容器功能: 进行Servlet生命周期/上下文管理,支持JSP标签库编译和执行。

  • 连接管理功能: 进行网络连接处理、超时和保持。

  • 安全管理功能: 配置用户认证和授权,并支持SSL/TLS。

  • 日志记录功能: 记录客户端对服务器的访问日志和服务器的运行日志。

特点:

  • 开源免费: 可以免费使用、修改和分发,为开发者/企业节省成本,并提供良好的技术支持。

  • **轻量级:**安装部署简单,占用系统资源较少,满足开发环境高并发的需求。

  • **易于使用:**配置文件和管理界面直观,并提供丰富的文档和示例,可以快熟搭建起开发和测试环境。

  • **高度可定制:**允许用户根据需求进行高度定制,通过修改配置文件来调整服务器的各种参数,还支持插件扩展,通过安装插件来增强器功能。

  • **支持多种技术标准:**遵循Serlet/JSP规范,确保与其他符合标准的Java Web技术兼容,还支持其他的技术标准,满足不同类型的Web应用需求。

  • **良好的性能:**采用先进的请求处理机制,能够快速响应客户端i请求;对内存的管理进行了优化,能够有效地利用内存资源;具有良好的可扩展性,通过集群和负载均衡等方式来提高性能和可靠性。

  • **活跃的社区支持:**拥有一个庞大而活跃的社区,为用户提供丰富的资源和支持,并添加功能和改进性能。

缺点:

  • **功能相对单一:**主要专注于Servlet/JSP容器功能,在构建复杂的企业级应用时,可能需要结合其他技术或框架来实现这些功能。

  • **性能瓶颈:**在处理大量的长连接、高并发的实时通信应用时,性能可能会受到一定的影响。

  • **安全性问题:**在安全性方面存在一些潜在的风险,对于一些高级的安全需求,可能需要借助其他安全工具来实现。

  • **管理复杂性:**随着应用的规模和复杂性增加,管理也会变得更加复杂。对于一些高级的管理任务,需要具备一定的专业知识和经验。

  • **版本兼容性问题:**版本更新比较频繁,不同版本之间可能存在一些兼容性问题。Tomcat版本升级对于一些依赖于Tomcat的应用产生影响。

二、Tomcat功能介绍

2.1 tomcat安装

【tomcat-node1 】172.25.254.10

链接:百度网盘 请输入提取码 提取码:2oby

bash 复制代码
[root@tomcat-node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y  #下载jdk,支持java运行环境
[root@tomcat-node1 ~]# ll /etc/alternatives/jre_openjdk  #jdk环境所在
#tomcat压缩包下载
[root@tomcat-node1 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.93/bin/apache-tomcat-9.0.93.tar.gz
#指定目录解压
[root@tomcat-node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
#构建软连接
[root@tomcat-node1 ~]# ln -s /usr/local/apache-tomcat-9.0.93 /usr/local/tomcat  
[root@tomcat-node1 ~]# /usr/local/tomcat/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/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
#查看端口
[root@tomcat-node1 ~]# netstat -naltupe | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       33327      3305/java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       32758      3305/java
#浏览器查看测试页面

tomcat-node2.chuling 172.25.254.20 【相同配置】

2.2 tomcat文件组成

目录结构

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

2.3 生成tomcat启动文件

bash 复制代码
#生成tomcat的主配置文件
[root@tomcat-node1 ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
#生成启动文件
[root@tomcat-node1 ~]# useradd -s /sbin/nologin -M tomcat
[root@tomcat-node1 ~]# chown -R tomcat.tomcat /usr/local/apache-tomcat-9.0.93
[root@tomcat-node1 ~]# vim /lib/systemd/system/tomcat.service
[root@tomcat-node1 ~]# 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
#赋予权限,如若不行则赋予 777 权限,在执行一次用户组命令 chown -R tomcat.tomcat /usr/local/apache-tomcat-9.0.93
[root@tomcat-node1 ~]# chmod +x /usr/local/tomcat/bin/startup.sh
[root@tomcat-node1 ~]# chmod +x /usr/local/tomcat/bin/shutdown.sh
#重启服务
[root@tomcat-node1 ~]# systemctl daemon-reload
[root@tomcat-node1 ~]# systemctl enable --now tomcat
bash 复制代码
#远程复制
[root@tomcat-node1 ~]# rsync -ar /usr/local/apache-tomcat-9.0.93 root@172.25.254.20: /usr/localapache-tomcat-9.0.93 
[root@tomcat-node1 ~]# rsync -ar /usr/bin/tomcat root@172.25.254.20:/usr/bin
#创建软连接及用户组
[root@tomcat-node2 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat
[root@tomcat-node2 ~]# chown -R tomcat /usr/local/tomcat

三、Tomcat部署

3.1 常见部署方式介绍

**standalone模式:**Tomcat单独运行,直接接收用户的请求,不建议选择

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

模式 模块
LNMT Linux + Nginx + MySQL + Tomcat
LAMT Linux + Apache + MySQL + Tomcat

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

多级代理:

模式 模块
LNNMT Linux + Nginx + MySQL + Tomcat

3.2 利用nginx实现反向代理

需求:

(1)利用nginx反向代理功能,实现途中的代理功能,将用户请求转发至指定的同一个tommcat主机。

(2)利用nginx指令proxy_pass 可以向后端服务转发请求报文,并且在转发时会保留客户端的请求报文中的host首部

bash 复制代码
[root@tomcat-node1 ~]# cat test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>

test.jps的效果页面:

【tomcat-node1】

bash 复制代码
[root@tomcat-node1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
#远程传输文件
[root@tomcat-node1 ~]# scp test.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/

【nginx-node1】 172.25.254.100

bash 复制代码
#编辑代理服务文件
[root@nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream memcache {
	server 172.0.0.1:11211;
	keepalive 512;
}
upstream tomcat {
	hash $cookie_JSESSIONID;
	server 172.25.254.10:8080;
	server 172.25.254.20:8080;
}
server {
	listen *:80;
	server_name www.chuling.org;
	root /data?web/html;
	index index.html;
	
	location ~ \.jsp$ {
		proxy_pass http://tomcat
	}
}
#重载服务
[root@nginx ~]# nginx -s reload

测试:

172..25.254.10:8080/test.jsp

四、Memcached

4.1 memcached安装启动

【tomcat-node1】

bash 复制代码
[root@tomcat-node1 ~]# yum install memcached -y
[root@tomcat-node1 ~]# vim /etc/sysconfig/memcached
[root@tomcat-node1 ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-1.0.0.0,::1"
[root@tomcat-node1 ~]# systemctl enable --now memcached
[root@tomcat-node1 ~]# netstat -anltupe | grep  memcache

测试:

bash 复制代码
[root@tomcat-node2 ~]# yum install telnet -y
[root@tomcat-node2 ~]# telnet 172.25.254.20 11211

4.2 memcached操作命令

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

五、Session共享服务器

5.1 msm介绍

session分类:

类名 压缩包
管理类 memcached-ssesion-manager-2.3.2.jar /memcached-session-manager-tc9-2.3.2.jar
序列/反序列化类 kyro.3.0.3.jar / kryo-serializers-0.45.jar
驱动类 (memcached)spymemcached.jar / (Redis)jedis.jar

下载相关jar包

附加链接: 百度网盘 请输入提取码 提取码:karn

修改tomcat配置

bash 复制代码
[root@tomcat-node1 ~]# cd jar/
[root@tomcat-node1 ~]# ls
[root@tomcat-node1 jar]# cp *.jar /usr/local/tomcat/lib/
[root@tomcat-node1 jar]# vim /usr/local/tomcat/conf/context.xml
 <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@tomcat-node2 jar]# vim /usr/local/tomcat/conf/context.xml
 <Manager pathname="" />
    -->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
        failoverNodes="n2"  
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

修改Nginx配置

bash 复制代码
[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 mu.chuling.org;
	root /webdataw/nginx/chuling.org/mu;
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	try_files $uri.html $uri/index.html /error/default.html;
	
	location ~ \.jsp$ {
		proxy_pass http://tomcat;
	}

}

测试:

1.在两台tomcat主机开启的情况下访问 http://mu.chuling.org/test.jsp

2.在tomcat-node1服务停止后继续提交信息看是否可以读取到之前的会话信息。

相关推荐
BIO系统32 分钟前
ASUS/华硕灵耀14 UX3402ZA 原厂win11系统 工厂文件 带ASUS Recovery恢复
运维·5g·电脑·个人开发
✿ ༺ ོIT技术༻34 分钟前
Linux:进程间通信之进程池和日志
linux·运维·服务器
慧都小妮子40 分钟前
质量留住用户:如何通过测试自动化提供更高质量的用户体验
运维·软件测试·自动化·ux
Holen&&Beer1 小时前
【Linux】安装cuda
linux·运维·服务器
是阿建吖!1 小时前
【Linux】进程优先级
linux·运维·服务器
朝九晚五ฺ1 小时前
【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间
linux·运维·学习
希忘auto2 小时前
详解Servlet的使用
java·servlet·tomcat
做人不要太理性2 小时前
Linux常用指令(1)
linux·运维·服务器
南暮思鸢6 小时前
应急响应靶机——linux1
linux·运维·网络安全·centos·write up·应急响应靶机·蓝队溯源
weixin_414321986 小时前
Linux 编译Ubuntu24内核
linux·运维·服务器