目录
[2.2 tomcat文件组成](#2.2 tomcat文件组成)
[2.3 生成tomcat启动文件](#2.3 生成tomcat启动文件)
[3.1 常见部署方式介绍](#3.1 常见部署方式介绍)
[3.2 利用nginx实现反向代理](#3.2 利用nginx实现反向代理)
[4.1 memcached安装启动](#4.1 memcached安装启动)
[4.2 memcached操作命令](#4.2 memcached操作命令)
[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服务停止后继续提交信息看是否可以读取到之前的会话信息。