【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 [email protected]: /usr/localapache-tomcat-9.0.93 
[root@tomcat-node1 ~]# rsync -ar /usr/bin/tomcat [email protected]:/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 [email protected]:/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服务停止后继续提交信息看是否可以读取到之前的会话信息。

相关推荐
愚润求学16 分钟前
【Linux】进程间通信(一):认识管道
linux·运维·服务器·开发语言·c++·笔记
SHUIPING_YANG27 分钟前
Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查
运维·nginx·gateway
光不度AoKaNa39 分钟前
计算机操作系统概要
linux·运维·服务器
晚秋大魔王1 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——wget
java·linux·运维·开发语言·华为·harmonyos
孤的心了不冷1 小时前
【Linux】Linux安装并配置MongoDB
linux·运维·mongodb·容器
南棱笑笑生1 小时前
20250517让NanoPi NEO core开发板在Ubuntu core16.04.2下支持TF卡的热插拔
linux·运维·ubuntu
越来越无动于衷1 小时前
手写tomcat:基本功能实现(3)
java·tomcat
qq_543248521 小时前
Tomcat的调优
java·tomcat
越来越无动于衷2 小时前
手写tomcat:基本功能实现(4)
java·tomcat
jinlei20092 小时前
配置ssh服务-ubuntu到Windows拷贝文件方法
运维·ubuntu·ssh