tomcat简单应用
基于Java访问web
AJAX技术,实现网页的部分页面自动刷新
注意:安装tomcat前必须先部署JDK
1、多实例实现
[root@centos8 ~]#mkdir /data/m48/ROOT #注意是要创建ROOT主页面路径,页面文件存放在目录下即可
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
<Engine name="Catalina" defaultHost="localhost"> #指定默认实例
<Connector port="8080" protocol="HTTP/1.1"
#指定监听端口,协议,注意端口不要在1023以下,会没有权限,或更改service文件运行身份为root
connectionTimeout="20000"
redirectPort="8443" />
<Host name="localhost" appBase="webapps" #网页域名和页面文件路径
unpackWARs="true" autoDeploy="true"> #是否自动解压及上传
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" #日志功能
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="m48.magedu.org" appBase="/data/m48/" #网页域名和页面文件路径注意搭配DNS解析
unpackWARs="true" autoDeploy="true"> #是否自动解压及上传
</Host>
</Engine>
</Service>
</Server>
[root@centos8 ~]#systemctl restart tomcat
#访问时需指定端口,10.0.0.8:8080 m48.magedu.org:8080
2、自定义日志格式
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" #日志功能
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
#更改为json格式
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>
#注意上面的是一整行,不要换行
#可使用jq工具处理json格式日志文件
[root@centos8 ~]#yum -y install jq
[root@centos8 ~]#echo 'xxx' |jq
3、反向代理实现
3.1、在单一主机上
3.1.1、在同一主机,单一虚拟主机上
#DNS解析指向nginx代理服务器
#在nginx代理上
[root@nginx ~]#vim /apps/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8080; #添加指向即可
}
[root@nginx ~]#nginx -s reload
#后续访问直接写域名即可,不用写端口号
3.1.2、在同一主机,多虚拟主机上
#DNS解析均指向当前主机ip
#搭建多虚拟主机
[root@centos8 ~]#mkdir /data/tomcat/t{1,2}/ROOT -p
[root@centos8 ~]#echo "t1" > /data/tomcat/t1/ROOT/index.html
[root@centos8 ~]#echo "t2" > /data/tomcat/t2/ROOT/index.html
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
<Host name="t1.magedu.org" appBase="/data/tomcat/t1/"
unpackWARs="true" autoDeploy="true">
</Host>
<Host name="t2.magedu.org" appBase="/data/tomcat/t2/"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
[root@centos8 ~]#systemctl restart tomcat
#配置代理
[root@centos8 ~]#vim /apps/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8080; #添加指向主机即可,也可写域名,但需要解析指向主机
proxy_set_header Host $http_host; #添加转发主机头至后端服务器
}
3.2、在多主机上,实现负载均衡
五台主机
DNS: 10.0.0.7
nginx: 10.0.0.8
tomcat1: 10.0.0.18
tomcat2: 10.0.0.28
客户端: 10.0.0.200
3.2.1、环境准备
#配置tomcat
[root@tomcat1 ~]#mkdir /data/tomcat/t1/ROOT
[root@tomcat1 ~]#echo "t1" > /data/tomcat/t1/ROOT/index.html
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/server.xml
<Host name="www.magedu.org" appBase="/data/tomcat/t1/" #域名主机设置为www,便于后续代理跳转
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
[root@tomcat2 ~]#mkdir /data/tomcat/t2/ROOT
[root@tomcat2 ~]#echo "t2" > /data/tomcat/t2/ROOT/index.html
[root@tomcat2 ~]#vim /usr/local/tomcat/conf/server.xm
<Host name="www.magedu.org" appBase="/data/tomcat/t2/"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
systemctl restart tomcat
#配置DNS
[root@DNS ~]#vim /var/named/magedu.org.zone
t1 A 10.0.0.18
t2 A 10.0.0.28
[root@DNS ~]#rndc reload
#配置nginx代理服务器,实现负载均衡
[root@nginx ~]#vim /apps/nginx/conf/nginx.conf
http { #注意是在http语句块里加下面的指令
upstream tomcat { #添加想跳转的后端服务器
#ip_hash; #会话绑定
hash $cookie_JSESSIONID; #指定根据cookie的JSESSIONID值来进行跳转
server 10.0.0.18:8080; #轮询用法,注意指定端口号
server 10.0.0.28:8080;
}
server{
location / {
root html;
index index.html index.htm;
proxy_pass http://tomcat; #添加跳转后端指向
proxy_set_header Host $http_host; #添加转发主机头至后端服务器
}
}
}
#检查
[root@10.0.0.200 ~]#curl -b 'SessionID=xxx' www.magedu.org #-b指定cookie
3.2.2、https
server {
location / {
listen 80;
server_name www.magedu.org;
return 302 https://$server_name$request_uri; #https跳转,注意是跳转到上一行的域名
}
}
server {
listen 443 ssl;
server_name www.magedu.org;
ssl_certificate /etc/nginx/ssl/www.magedu.org.pem; #证书文件,注意域名匹配
ssl_certificate_key /etc/nginx/ssl/www.magedu.org.key;
client_max_body_size 20m;
location / {
proxy_pass http://tomcat;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3.2.3、tomcat 的 Session 复制集群
Session不变,跳转的主机变了,内部主机的Session复制共享,消耗内存,后端tomcat两三台的情况下可以用
官方文档
https://tomcat.apache.org/tomcat-10.0-doc/cluster-howto.html
将官方文档的方案复制后进行稍加更改即可
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" #指定的多播地址,即相同频道
port="45564" #45564/UDP
frequency="500" #间隔500ms发送
dropTime="3000"/> #故障阈值3s
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" #监听地址,此项建议修改为当前主机的IP
port="4000" #监听端口
autoBind="100" #如果端口冲突,自动绑定其它端口,范围是4000-4100
selectorTimeout="5000" #自动绑定超时时长5s
maxThreads="6"/> #最大线程数
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
#注意上面这行,tomcat7版本最后面少了个/
</Cluster>
网段地址分类
A: 1-126.x.x.x
B: 128-191
C: 192-223
D: 224-239
E: 保留项
3.2.3.1、具体实现
环境和负载均衡一样
#配置nginx代理服务器,实现负载均衡
[root@nginx ~]#vim /apps/nginx/conf/nginx.conf
http {
upstream tomcat {
server 10.0.0.18:8080;
server 10.0.0.28:8080;
}
server {
listen 80;
server_name www.magedu.org;
location / {
proxy_pass http://tomcat;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
[root@nginx ~]#nginx -s reload
#更改tomcat配置,将官方文档里的内容拷贝在host语句块中,且需更改web.xml文件,同理在tomcat2上进行相同操作
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/server.xml
<Host name="www.magedu.org" appBase="/data/tomcat/t1/"
unpackWARs="true" autoDeploy="true">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" #指定的多播地址,频道
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="10.0.0.18" #监听地址,此项建议修改为当前主机的IP
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
#注意上面这行,tomcat7版本最后面少了个/
</Cluster>
</Host>
</Engine>
</Service>
</Server>
[root@tomcat1 ~]#cp -a /usr/local/tomcat/webapps/ROOT/WEB-INF/ /data/tomcat/t1/ROOT/ #注意属性
[root@tomcat1 ~]#vim /data/tomcat/t1/ROOT/web.xml
</description>
<distributable/> #添加此行
</web-app> #在最后一行的上面添加
[root@tomcat1 ~]#systemctl restart tomcat
3.2.4基于memcached搭建Session服务器
可以用redis也可以用memcached
3.2.4.1、配置memcached和tomcat在同一主机上
msm的sticky 模式:前端tomcat和后端memcached有关联(粘性)关系
需提前下载相关jar包
官方文档
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
#注意版本相搭配,否则不兼容
For the most simple integration you just need to have a tomcat (6, 7, 8 or 9) and a memcached or Redis installed (or s.th. supporting the memcached protocol). #仅支持到tomcat9版本
#配置memcached
[root@tomcat1 ~]#yum -y install memcached
[root@tomcat1 ~]#vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64" #内存大小,一般设置为物理内存的一半,单位字节
#OPTIONS="-l 127.0.0.1,::1" #注释掉此行
[root@tomcat1 ~]#systemctl enable --now memcached.service
#配置tomcat
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.48:11211,n2:10.0.0.58:11211" #tomcat服务器的ip及端口
failoverNodes="n1" #故障转移,写的是当前主机
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
#添加上面内容
</Context> #最后一行
#将jar包传到/usr/local/tomcat/lib/目录下
asm-5.2.jar
kryo-3.0.3.jar
kryo-serializers-0.45.jar
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
minlog-1.3.1.jar
msm-kryo-serializer-2.3.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
spymemcached-2.12.3.jar
[root@tomcat1 ~]#systemctl restart tomcat
#准备测试页面文件
[root@tomcat1 ~]#vim /data/tomcat/t1/ROOT/session.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>tomcat test</title>
</head>
<body>
<h1> Tomcat Website1 </h1> #为测试页面效果可以更改字符
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
#同样步骤在tomcat2上进行即可
#配置nginx代理服务器,实现负载均衡
[root@nginx ~]#vim /apps/nginx/conf/nginx.conf
http { #注意是在http语句块里加下面的指令
upstream tomcat { #添加想跳转的后端服务器
#ip_hash; #会话绑定
#hash $cookie_JSESSIONID; #指定根据cookie的JSESSIONID值来进行跳转
server 10.0.0.18:8080; #轮询用法,注意指定端口号
server 10.0.0.28:8080;
}
server {
location / {
}
location ~* \.(jsp|do)$ { #添加转发,跳转
proxy_pass http://tomcat;
#proxy_set_header Host $http_host; #转发主机头至后端服务器
}
}
}
[root@nginx ~]#nginx -t
[root@nginx ~]#nginx -s reload
#访问nginx代理服务器的ip加端口即可进行检查,域名记得配置DNS
3.2.4.2、non-sticky模式
前端tomcat和后端memcached没有关联(粘性)关系,且在memcached上都存放SessionID
#配置tomcat
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:10.0.0.18:11211,n2:10.0.0.28:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
#添加上面内容
</Context> #最后一行
3.2.5、基于redis搭建session服务器
在memcached所需jar包基础上再下载 jedis-3.0.0.jar 包
#配置redis
[root@tomcat1 ~]#yum -y install redis
[root@tomcat1 ~]#sed -Ei 's/(^bind).*/\1 0.0.0.0/' /etc/redis.conf
[root@tomcat1 ~]#systemctl enable --now redis
#配置tomcat
[root@tomcat1 ~]#vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://10.0.0.18" #redis服务器的地址
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
#将jar包传到/usr/local/tomcat/lib/目录下
asm-5.2.jar
kryo-3.0.3.jar
kryo-serializers-0.45.jar
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
minlog-1.3.1.jar
msm-kryo-serializer-2.3.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
spymemcached-2.12.3.jar
jedis-3.0.0.jar
[root@tomcat1 ~]#systemctl restart tomcat