本章概要
Oracle JDK的安装
vim /etc/profile.d/java.sh
JAVA_HOME=/usr/java/latest
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
openjdk的安装
[root@centos7 ~]# which java
/usr/bin/java
[root@centos7 ~]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Nov 21 09:42 /usr/bin/java -> /etc/alternatives/java
[root@centos7 ~]# ll /etc/alternatives/java
lrwxrwxrwx 1 root root 73 Nov 21 09:42 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre/bin/java
二进制源码安装
YUM安装Tomcat
[root@centos7 tomcat]# tree work/
work/
└── Catalina
└── localhost
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp
├── index_jsp.class
└── index_jsp.java
注意:真正负责运行的是servlet,而jsp只是运行过程中进行代码转换的一个环节
tomcat内部关键的类
server {
service {
connector{}
engine {
host {}
host {
context
}
}
}
}
配置文件介绍
Tomcat部署方式
<%@ page language="java" %>
<%@ page import="java.util.*" %>
Test Page
<% out.println("hello world");
%>
注意:在部署时,推荐把网页文件复制到webapps目录下并创建软链接,把软链接为网站家目录,这样方便网站的发布和回滚
Tomcat认证相关配置
vim /etc/tomcat/tomcat-user.xml
#角色只能单独定义
#用户可以多个定义
重启服务
systemctl restart tomcat
允许访问ManagerAPP的用户为以下四种:
manager-gui - allows access to the HTML GUI and the status pages
manager-script - allows access to the text interface and the status pages
manager-jmx - allows access to the JMX proxy and the status pages
manager-status - allows access to the status pages only
注意:网页主站页面即/etc/tomcat/webapps/ROOT目录
vim /etc/tomcat/tomcat-user.xml
#角色只能单独定义
#用户可以多个定义
重启服务
systemctl restart tomcat
允许访问Host-Manager的用户为以下两种:
admin-gui - allows access to the HTML GUI
admin-script - allows access to the text interface
tomcat的常用组件配置
[root@centos7 ~]# openssl rand -base64 16
JvAYxww7H0JTuDZ07QEOCQ==
vim /etc/tomcat/server.xml
重启tomcat服务
注意:为了确保server.xml中的“SHUTDOWN”指令不被其他用户看到,要更改server.xml文件的权限:即去除其他用户的读权限
chmod o= server.xml
任何由连接器转给此engine的请求当中,engine会判断请求报文首部的host首部的值与哪个内部的host主机的hostname一致,用户的请求就会路由至哪个host;如果没有任何一致的地方,就默认转给默认的host主机
对每一个虚拟主机来讲,还应该定义网页文件根目录,注意:这里要使用特殊的符号,即appBase为网站家目录
如果用户部署的时候,扔进主机内部一个没有展开的war文件,要对其进行自动展开,即unpackWARs=true,
autoDeploy="true"是指是否自动部署,注意:在生产环境中,为了安全起见,不建议启动自动部署
注意:appBase="webapps"使用的是相对路径,相对于CATALINA_BASE,即/var/lib/tomcat或/usr/share/tomcat
注意:如果内部不再嵌套其他组件,可以进行自封装,即在语句最后直接机上斜线;否则,去掉结尾的斜线/,另起一行加上进行封装
此时,启用的web页面默认路径为/data/webapps/myapp,即访问test1.magedu.com相当于访问/data/webapps/myapp下的主页面
# mkdir -pv /data/webapps
# mkdir -pv /data/webapps/ROOT/{lib,classes,WEB-INF}
vim /data/webapps/ROOT/index.jsp #创建网页文件index.jsp
This is TestPage!
[root@centos7 myapp]# tree /data/webapps/myapp
.
├── ROOT
│ ├── class
│ ├── index.jsp
│ ├── lib
│ └── WEB-INF
└── testapp
├── class
├── index.jsp
├── lib
└── WEB-INF
注意:这里的ROOT属于网站主目录,访问时只需输入:test1.magedu.com:8080;而testapp属于非网站主目录,要想访问testapp目录下的网页,需要在访问的url中加上该目录,如:test1.magedu.com:8080/testapp
另外,网页文件index.jsp存放位置不同:配置文件中中没有定义context组件时,网站主目录中网页文件index.jsp必须存放在ROOT目录下,如:/data/webapps/myapp/ROOT/index.jsp;
非网站主目录中网页文件index.jsp只需存放在非网站主目录下即可,非网站主目录下不需要ROOT目录,如:/data/webapps/myapp/testapp/index.jsp。
示例:通过context组件,实现访问位于非网站主目录下的网页文件
创建hiapps目录
mkdir -pv /hiapps/hiapp/{lib,classes,WEB-INF}
创建网页文件index.jsp
vim /hiapps/hiapp/index.jsp
hello tomcat!
定义context路径
vim /etc/tomcat/server.xml
通过访问test1.magedu.com:8080/hiapp访问/hiapps/hiapp网页文件,即实现了访问不在appBase(/data/webapps/myapp)路径下的文件
注意:不在默认路径/data/webapps/myapp下的其他访问路径目录/hiapps/hiapp下也不需要ROOT目录
Context url路径
docBase 网页文件路径
reloadable 是否支持自动重载
定义访问日志:org.apache.catalina.valves.AccessLogValve
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
CIDR表示法,拒绝172.16.100.67
基于主机名进行控制,需要对.进行转义,即172\.16\.100\.67
LNMT架构
location / {
proxy_pass http://tc1.magedu.com:8080;
}
location ~* \.(jsp|do)$ {
proxy_pass http://tc1.magedu.com:8080;
}
示例:nginx反代tomcat
location / {
root /usr/share/tomcat/webapps/ROOT;
}
location ~* \.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
}
LAMT架构
ServerName tc1.magedu.com
ProxyRequests Off
ProxyVia On #在响应报文中添加Via首部,指明是由谁代理发过去的
ProxyPreserveHost On #指是否保留客户端请求时的主机头,以根据主机头响应后端不同的虚拟主机
Require all granted
ProxyPass / http://tc1.magedu.com:8080/
ProxyPassReverse / http://tc1.magedu.com:8080/
Require all granted
ProxyPass / http://tc1.magedu.com:8080/
当后端tomcat存在两个虚拟主机如node01.magedu.com和www.magedu.com,对后端反代时,一个proxypass只能反代给一个后端的虚拟主机,要想对后端两个虚拟主机进行反代,有两个方法:
(1)前端反代服务器设置两个虚拟主机分别对不同虚拟主机进行反代
(2)在反向代理服务器发送给后端虚拟主机的请求报文头部中添加不同的主机头,此时反代的路径不重要,重要的是报文首部中附加的主机头信息
注意:实现第二种方法的指令就是ProxyPreserveHost,是指是否保留客户端请求时的主机头
本机实验示例:
[root@centos7 ~]# vim /etc/httpd/conf.d/http-tomcat.conf
ServerName test1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
Require all granted
重启httpd服务
systemctl restart httpd
在客户端192.168.32.128进行测试:
访问192.16.32.131时为主站目录
访问test1.magedu.com时为另外一个虚拟主机
这就是ProxyPreserveHost指令开启后的作用,基于不同的主机名反代给后端不同虚拟主机
注意:客户端配置dns解析
ServerName tc1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / ajp://tc1.magedu.com:8009/
ProxyPassReverse / ajp://tc1.magedu.com:8009/
Require all granted
本机实验示例:
[root@centos7 conf.d]# vim ajp-tomcat.conf
Listen 9090
#防止地址冲突,使用9090端口
ServerName test1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
Require all granted
会话保持
Tomcat集群
BalancerMember http://172.18.100.67:8080
BalancerMember http://172.18.100.68:8080
ProxySet lbmethod=byrequests #指定调度算法
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
Require all granted
BalancerMember介绍
BalancerMember http://172.18.100.67:8080 route=TomcatA loadfactor=1
BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
Require all granted
启用管理接口:
SetHandler balancer-manager
ProxyPass !
Require all granted
示例程序:
演示效果,在TomcatA上某context中(如/test),提供如下页面
<%@ page language="java" %>
TomcatA
TomcatA.magedu.com
Session ID
<% session.setAttribute("magedu.com","magedu.com"); %>
<%= session.getId() %>
Created on
<%= session.getCreationTime() %>
演示效果,在TomcatB上某context中(如/test),提供如下页面
<%@ page language="java" %>
TomcatB
TomcatB.magedu.com
Session ID
<% session.setAttribute("magedu.com","magedu.com"); %>
<%= session.getId() %>
Created on
<%= session.getCreationTime() %>
BalancerMember ajp://172.18.100.67:8009
BalancerMember ajp://172.18.100.68:8009
ProxySet lbmethod=byrequests
ServerName lb.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
Require all granted
SetHandler balancer-manager
ProxyPass !
Require all granted
保持会话的方式参考前一种方式。
使用docker启用两个tomcat容器,使用nginx作为反向代理服务器
docker run --name tc1 --hostname tc1.magedu.com -d --network bridge -v /data/tc1:/usr/local/tomcat/webapps/myapp tomcat:8.5-slim #启用存储卷,把宿主机/data/tc1挂载到docker容器的网站子目录myapp下
docker run --name tc2 --hostname tc2.magedu.com -d --network bridge -v /data/tc2:/usr/local/tomcat/webapps/myapp tomcat:8.5-slim #启用存储卷,把宿主机/data/tc1挂载到docker容器的网站子目录myapp下
为t1制作网页文件
mkdir /data/tc{1,2}
cd /data/tc1
mkdir -p lib class WEB-INF
vim index.jsp
TomcatA
TomcatA.magedu.com
Session ID
<% session.setAttribute("magedu.com","magedu.com"); %>
<%= session.getId() %>
Created on
<%= session.getCreationTime() %>
为t2制作网页文件
cd /data/tc2
mkdir -p lib class WEB-INF
vim index.jsp
TomcatA
TomcatB.magedu.com
Session ID
<% session.setAttribute("magedu.com","magedu.com"); %>
<%= session.getId() %>
Created on
<%= session.getCreationTime() %>
测试:
使用curl命令访问
curl http://172.17.0.2:8080/myapps #自动连接docker0获取172.17.0.2
curl http://172.17.0.3:8080/myapps
使用elinks访问
elinks -dump http://172.17.0.2:8080/myapp/
配置nginx反向代理:
把某个目录反向代理到后端服务器
主配置文件中:
http {
upstream tcsrvs {
server 172.17.0.2:8080;
server 172.17.0.3:8080;
}
server {
listen 80 default_server;
include /etc/nginx/default.d/\*.conf;
location / {
root /usr/share/html;
}
location /myapp/ {
proxy_pass http://tcsrvs/myapp/;
}
location ~* \.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
}
......
}
重启nginx服务
测试:在浏览器访问test1.magedu.com/myapp/
把整个网站代理向后端服务器
http {
upstream tcsrvs {
server 172.17.0.2:8080;
server 172.17.0.3:8080;
}
server {
listen 80 default_server;
include /etc/nginx/default.d/\*.conf;
location / {
root /usr/share/html;
proxy_pass http://tcsrvs/;
}
location ~* \.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
}
......
}
重启nginx服务
测试:在浏览器访问主页:http://test1.magedu.com
访问myapp网页 http://test1.magedu.com/myapp/
vim /etc/httpd/conf.d/http-tomcat.conf
BalancerMember http://172.17.0.2:8080
BalancerMember http://172.17.0.3:8080
ProxySet lbmethod=byrequests #调用算法模块
ServerName test1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/ #使用balancer格式指定代理服务器
ProxyPassReverse / balancer://tcsrvs/ #使用balancer格式指定代理服务器
Require all granted
status 设置后端服务器状态
loadfactor 设置权重
如:BalancerMember http://172.17.0.2:8080 status=D #设置为拒绝状态
重启httpd服务
测试访问:http://test1.magedu.com/myapp/
(2)配置httpd作为反向代理服务器,使用ajp连接器连接engine
配置ajp连接器连接engine,监听9090端口
[root@centos7 conf.d]# vim ajp-tomcat.conf
BalancerMember ajp://172.17.0.2:8009
BalancerMember ajp://172.17.0.3:8009
ProxySet lbmethod=byrequests
Listen 9090
ServerName test1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tomcatservers/
ProxyPassReverse / balancer://tomcatservers/
Require all granted
重启httpd服务
测试访问:http://test1.magedu.com:9090/myapp/
启用管理接口:
SetHandler balancer-manager
ProxyPass !
Require all granted
示例:
vim /etc/httpd/conf.d/http-tomcat.conf
BalancerMember http://172.17.0.2:8080
BalancerMember http://172.17.0.3:8080
ProxySet lbmethod=byrequests #调用算法模块
ServerName test1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/ #使用balancer格式指定代理服务器
ProxyPassReverse / balancer://tcsrvs/ #使用balancer格式指定代理服务器
Require all granted
SetHandler balancer-manager
ProxyPass !
Require all granted
重启httpd服务
测试访问管理页面:http://test1.magedu.com/balancer-manager
可以对后端虚拟主机进行管理
[root@centos7 conf.d]# vim http-tomcat.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/"env=BALANCER_ROUTE_CHANGED
BalancerMember http://172.17.0.2:8080 route=tcA #将会在session中的cookie添加上.tcA的字串
BalancerMember http://172.17.0.3:8080 route=tcB #将会在session中的cookie添加上.tcB的字串
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID
ServerName test1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
Require all granted
重启httpd服务
测试访问http://test1.magedu.com/myapp/
使用curl命令测试:
curl命令不带有cookie信息,因此curl访问时不会被绑定到固定的后端虚拟主机上
curl -I http://test1.magedu.com/myapp/
Set-Cookie: ROUTEID=.tcB; path=/ 这里只贴出显示结果行
使用curl命令指定ROUTEID
curl -b ROUTEID=tcA http://test1.magedu.com/myapp/
#资源变动时是否通知侦听器,true表示要通知
#Channel是指定义多播会话通信信道
#集群成员多久没有发送心跳就会被丢弃
#集群最大线程数
#Sender是指发送器,如何把自己的信息发送给其他成员
#通过轮询方式发送会话信息
#探测器,用于探测传输过程中的错误
#探测器,确保报文的完整性
#过滤器,对特定报文进行过滤,ReplicationValve只处理session复制相关的报文
#JvmRouteBinderValve是指JVM路由绑定器
#false指监控未启用
#注意:原内容中该行最后没有添加闭合标签/,因此需要添加上该闭合标签/
#注意:原内容中该行最后没有添加闭合标签/,因此需要添加上该闭合标签/
还需以下配置:
把以上配置复制到server.xml中
要确保ReplicationValve中的Receiver.port要设置正确,不要与其他端口冲突,默认端口范围为4000-4100
要确保打算使用分布式会话的应用程序的web.xml配置文件中存在 元素,
还要编辑每个成员的engine中的jvmRoute有唯一的标识符,即
注意:配置基于session replication的集群后,前端调度器可以配置调度算法,如wrr调度算法,但并不推荐这种做法,而是应该基于cookie做会话绑定,
这是因为把客端的会话请求调度到其他集群节点时,有可能会话信息还未同步到其他成员节点上,导致客户端无法获取会话信息造成访问失败
实验:实现基于会话复制的tomcat集群
实验环境
反向代理服务器:192.168.32.129
集群成员节点1: 192.168.32.130
集群成员节点2: 192.168.32.131
tomcat两个成员节点配置如下:
在两个成员节点上安装软件包
yum -y install java-1.8.0-openjdk-devel tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
成员节点1:192.168.32.130
创建主站目录下所需的子目录
mkdir /webapps/myapp/{lib,class,WEB-INF}
创建网页文件
[root@centos7 ~]# vi /webapps/myapp/index.jsp
TomcatA
TomcatA.magedu.com
Session ID
<% session.setAttribute("magedu.com","magedu.com"); %>
<%= session.getId() %>
Created on
<%= session.getCreationTime() %>
更改tomcat配置文件
vim server.xml
#在engine中添加标识tomcatA
#注意,官方文档中该行默认没有闭合标签/
#注意,官方文档中该行默认没有闭合标签/
#在host内部配置context指定自定义网页文件路径
注意:还要确保每一个集群节点成员的web.xml文件中配置 元素,由于我们所配置的应用程序在/webapps/myapp目录下没有web.xml文件,
如果没有web.xml文件,将会自动使用默认配置文件,而默认配置文件中没有 元素,并且如果在默认配置文件中添加此元素,将会对所有虚拟主机生效。
因此推荐把系统默认的web.xml复制一份到/webapps/myapp目录下并添加 元素
cp /etc/tomcat/web.xml /webapps/myapp/WEB-INF/ #复制默认的web.xml文件到自定义的应用程序目录下
vim /webapps/myapp/WEB-INF/web.xml
#在注释行结束,默认代码起始行的位置添加 元素
default
org.apache.catalina.servlets.DefaultServlet
使用浏览器测试访问应用网页文件
192.168.32.130:8080/myapp/
成员节点2 192.168.32.131
创建主站目录下所需的子目录
mkdir /webapps/myapp/{lib,class,WEB-INF}
创建网页文件
[root@centos7 ~]# vi /webapps/myapp/index.jsp
TomcatB
TomcatB.magedu.com
Session ID
<% session.setAttribute("magedu.com","magedu.com"); %>
<%= session.getId() %>
Created on
<%= session.getCreationTime() %>
更改tomcat配置文件
vim server.xml
#在engine中添加标识tomcatA
#注意,官方文档中该行默认没有闭合标签/
#注意,官方文档中该行默认没有闭合标签/
#在host内部配置context指定自定义网页文件路径
注意:还要确保每一个集群节点成员的web.xml文件中配置 元素,由于我们所配置的应用程序在/wenapps/myapp目录下没有web.xml文件,
如果没有web.xml文件,将会自动使用默认配置文件,而默认配置文件中没有 元素,并且如果在默认配置文件中添加此元素,将会对所有虚拟主机生效。
因此推荐把系统默认的web.xml复制一份到/webapps/myapp目录下并添加 元素
cp /etc/tomcat/web.xml /webapps/myapp/WEB-INF/ #复制默认的web.xml文件到自定义的应用程序目录下
vim /webapps/myapp/WEB-INF/web.xml
#在注释行结束,默认代码起始行的位置添加 元素
default
org.apache.catalina.servlets.DefaultServlet
使用浏览器测试访问应用网页文件
192.168.32.130:8080/myapp/
反向代理服务器:192.168.32.129
配置如下:
安装nginx软件
yum -y install nginx
更改nginx配置文件
vim /etc/nginx/nginx.conf
http {
upstream tcsrvs {
server 192.168.32.130:8080
server 192.168.32.131:8080
}
server {
location / {
proxy_pass http://tcsrvs/; #调用服务器组
}
}
}
启动nginx服务
在浏览器测试访问:http://192.168.32.129/myapp/
注意:反向代理服务器配置问价中,使用proxy_pass进行路径映射时要与访问路径一致,即只能映射根目录,不能映射子目录,否则会有问题。
当映射根目录时,访问子目录只需要在url后添加子目录路径即可
使用haproxy作为反向代理服务器:
配置如下:
vim /etc/haproxy/haproxy.cfg
listen web *:80
server tc1 192.168.32.130:8080 check
server tc2 192.168.32.131:8080 check
启动haproxy服务
使用浏览器测试访问:http://192.168.32.129/myapp/
memcached介绍
memcached配置相关介绍
[root@centos7 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="128"
OPTIONS="-t 8 -f 1.1 -U 0"
[noreply]\r\n
命令 键值 标志位 过期时间 指定存储字节数量
示例:
add mykey 0 30 10 增加数据
magedu.com
STORED
get mykey 查看存储的数据
VALUE mykey 0 10
magedu.com
END
[root@centos7 ~]# memcached-tool 127.0.0.1
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
基于memcached实现session server
基于session server的tomcat集群
memcached实验规划:
为了方便实验,把memcached安装在tomcat主机上,在生产环境中,需要把memcached配置在其他服务器上才有意义
tomcat1主机安装memcached1,简称为m1
tomcat2主机安装memcached2,简称为m2
memcached配置:
分别在tomcat1主机和tomcat2主机安装memcached并更改环境变量文件
yum -y install memcached
vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="128"
OPTIONS="-t 8 -f 1.1 -U 0"
systemctl start memcached.service
Tomcat配置:
对tomcat1主机配置文件进行修改:
vim /etc/tomcat/server.xml
#为tomcat1主机增加TomcatA标识
#配置context,只对当前context配置文件生效,如果不配置context则会对当前主机生效,会影响到主机下的其他context配置
对tomcat2主机配置文件进行修改:
vim /etc/tomcat/server.xml
#为tomcat2主机增加TomcatB标识
#配置context,只对当前context配置文件生效,如果不配置context则会对当前主机生效,会影响到主机下的其他context配置
在tomcat1和tomcat2主机上准备相关类库
github项目站点:
https://github.com/magro/memcached-session-manager
注意:找到与当前tomcat版本一致的文件(当前以tomcat7为例),下载需要的jar包,然后把下载的jar包存放在/usr/share/java/tomcat目录下
下载地址如下:
msm会话管理器
核心类库:适用于tomcat7版本的jar包要求必须是tomcat7.0.23版本以上
下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.2/memcached-session-manager-2.3.0.jar
适用于tomcat7版本的jar包
下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.3.0/memcached-session-manager-tc7-2.3.0.jar
驱动存储系统的jar包
下载地址:http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar
序列化工具组件:
kryo-serializer包含以下jar包组件
msm-kryo-serializer下载地址:http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar
kryo-serializers-0.34+下载地址:http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar
kryo-3.x下载地址:http://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/kryo-4.0.2.jar
minlog下载地址:http://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar
reflectasm下载地址:http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar
asm-5.x下载地址:http://repo1.maven.org/maven2/org/ow2/asm/asm/6.2/asm-6.2.jar
objenesis-2.x下载地址:http://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar
注意:把相关jar分别存放在tomcat1和tomcat2主机上/usr/share/java/tomcat目录下
在tomcat1和tomcat2主机上启动tomcat服务
systemctl start tomcat
在tomcat1上再开启一个窗口并使用tail命令追踪日志信息查看memcached是否启动
tail -f /var/log/tomcat/catalina.2019-01-22.log
Jan 22, 2019 3:23:28 PM de.javakaffee.web.msm.MemcachedSessionService startInternal #memcached会话服务启动
INFO: -------- #具体信息如下
- finished initialization: #完成初始化
- sticky: true #启用粘性会话
- operation timeout: 1000 #超时时长
- node ids: [m2] #活动节点为m2
- failover node ids: [m1] #故障转移节点为m1
- storage key prefix: null
- locking mode: null (expiration: 5s)
--------
在tomcat2上再开启一个窗口并使用tail命令追踪日志信息查看memcached是否启动
tail -f /var/log/tomcat/catalina.2019-01-22.log
Jan 22, 2019 3:23:28 PM de.javakaffee.web.msm.MemcachedSessionService startInternal #memcached会话服务启动
INFO: -------- #具体信息如下
- finished initialization: #完成初始化
- sticky: true #启用粘性会话
- operation timeout: 1000 #超时时长
- node ids: [m2] #活动节点为m2
- failover node ids: [m1] #故障转移节点为m1
- storage key prefix: null
- locking mode: null (expiration: 5s)
--------
测试:
访问tomcat1主机:192.168.32.130:8080/myapp/
访问tomcat2主机:192.168.32.131:8080/myapp/
访问显示如下:
Session ID 9AC02838C484FBC548BE53B905352796-m2.TomcatB
注意:显示结果中,会发现tomcat标识TomcatB在变化,但Session ID:9AC02838C484FBC548BE53B905352796-m2并不会发生改变,说明memcached缓存发生作用
关闭主节点m2,会发现session信息会变为m1节点,这是因为配置了故障转移节点(fialover)为m1,一旦主节点m2发生故障,将会切换到故障转移节点m1上
如果再次开启主节点m2,会发现session信息将会从m1上转移为m2,这是因为主节点一旦修复,将会继续其工作,m1继续作为故障转移节点,这也就是所谓的故障移回(failback)
注意:如果在生产环境,推荐使用redis作为后端存储session信息的session server
知识扩展:Tomcat配置文件中memcached配置示例说明
做sticky session+kryo的配置
...
className 指定存储会话的类
memcachedNodes 指存储节点
failoverNodes 指故障转移节点
failover 故障转移
当主节点出现故障,自动转移到备用节点上,实现冗余或高可用
failback 故障移回
当主节点修复完毕,主节点代替备用节点夺回主节点位置
requestUriIgnorePattern 忽略模式,即凡是以.ico|png|gif|jpg|css|js结尾的将会被忽略掉
transcoderFactoryClass 指定用什么流式化类执行流式化
de.javakaffee.web.msm.serializer是固定前缀
做non-sticky session+kryo的配置
...
该配置不存在failoverNodes,是指不做主从复制,而是双主模式
sticky="false" 是指不做会话粘性
sessionBackupAsync="false" 是指不进行异步同步,否则可能会导致数据访问不一致
lockingMode 锁定的模式
做non-sticky sessions + kryo + Redis配置
...
该配置没有做主从复制,redis支持主从复制功能,支持集群
(1) 内存空间:
/etc/sysconfig/tomcat, /etc/tomcat/tomcat.conf
JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= "
-server:服务器模式
-Xms:堆内存初始化大小;
-Xmx:堆内存空间上限;
-XX:NewSize=:新生代空间初始化大小;
-XX:MaxNewSize=:新生代空间最大值;
(2) 线程池设置:
在tomcat配置文件server.xml中连接器配置中
常用属性:
maxThreads:最大线程数;
minSpareThreads:最小空闲线程数;
maxSpareThreads:最大空闲线程数;
acceptCount:等待队列的最大长度;
URIEncoding:URI地址编码格式,建议使用UTF-8;
enableLookups:是否启用dns解析,建议禁用;
compression:是否启用传输压缩机制,建议“on";
compressionMinSize:启用压缩传输的数据流最小值,单位是字节;
compressableMimeType:定义启用压缩功能的MIME类型;
text/html, text/xml, text/css, text/javascript
(3) 禁用8005端口;
(4) 隐藏版本信息:
Server="SOME STRING"