Tomcat
2020-06-15 本文已影响0人
Liang_JC
安装tomcat
#先安装jdk
#yum install java-1.8.0-openjdk
yum install jdk-8u191-linux-x64.rpm #oracle官方jdk
vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
. /etc/profile.d/jdk.sh
#yum安装
yum install tomcat tomcat-admin-webapps tomcat-webapps
#采用Apache官网下载,下载8.x.x
tar -xf apache-tomcat-8.5.42.tar.gz -C /apps/
ln -sv /apps/apache-tomcat-8.5.42/ /apps/tomcat
cd /apps/tomcat/
[root@ha1 tomcat]# bin/catalina.sh version
Using CATALINA_BASE: /apps/tomcat
Using CATALINA_HOME: /apps/tomcat
Using CATALINA_TMPDIR: /apps/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.42
Server built: Jun 4 2019 20:29:04 UTC
Server number: 8.5.42.0
OS Name: Linux
OS Version: 3.10.0-957.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_181-b13
JVM Vendor: Oracle Corporation
#启动
bin/catalina.sh start
bin/startup.sh
#停止
bin/catalina.sh stop
bin/shutdown.sh
#帮助
bin/catalina.sh --help
#使用普通用户启动服务
useradd -r java
chown -R java.java ./*
su - java -c '/apps/tomcat/bin/catalina.sh start'
ps -aux | grep tomcat
添加一个页面测试
vim webapps/ROOT/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("hello jsp");
%>
<br>
<%=request.getRequestURL()%>
</body>
</html>
http://192.168.37.7:8080/test.jsp
添加一个应用
mkdir /data/projects/myapp/{WEB-INF,classes,lib} -pv
vim /data/projects/myapp/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<%
out.println("hello jsp");
%>
<br>
<%=request.getRequestURL()%>_project1
</body>
</html>
cp -r /data/projects/myapp/ /apps/tomcat/webapps/
用户验证
vim conf/tomcat-users.xml
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="centos" roles="manager-gui,admin-gui"/>
</tomcat-users>
vim webapps/manager/META-INF/context.xml
vim webapps/host-manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+"
bin/catalina.sh stop
bin/catalina.sh start
http://192.168.37.7:8080
Manager App
Host Manager
配置虚拟主机
#虚拟主机
vim conf/server.xml
<Engine>
<Host name="node1.magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true" />
</Engine>
mkdir /data/webapps -pv
cp -r /data/projects/myapp/ /data/webapps/ROOT
bin/catalina.sh stop
bin/catalina.sh start
http://node1.magedu.com:8080/
#context路径映射
<Host name="node1.magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true" >
<Context path="/web2" docBase="/data/web2" reloadable="false" />
</Host>
cp -r /data/projects/myapp/ /data/web2
http://node1.magedu.com:8080/web2/
nginx+tomcat
#nginx做反向代理
yum install nginx -y
vim /etc/nginx/nginx.conf
location / {
proxy_pass http://node1.magedu.com:8080; #全部做代理
}
echo "192.168.37.7 node1.magedu.com" >> /etc/hosts
nginx -t
systemctl start nginx
http://node1.magedu.com/
#动静分离
vim /etc/nginx/nginx.conf
location / {
root /data/webapps/ROOT;
index index.html;
}
location ~* \.jsp$ { #动态分离
proxy_pass http://node1.magedu.com:8080;
}
echo "hello" > /data/webapps/ROOT/index.html
systemctl reload nginx
http://node1.magedu.com/
http://node1.magedu.com/index.jsp
#实际上Tomcat不太适合做动静分离,用它来管理程序的图片不好做动静分离部署
session sticky会话黏性
#三台机器
# t0-192.168.37.7:nginx t1-192.168.37.17:tomcat t2-192.168.37.27:tomcat
#t0
vim /etc/nginx/nginx.conf
http {
...
upstream tomcats {
ip_hash;
server t1.magedu.com:8080;
server t2.magedu.com:8080;
}
server {
location / {
proxy_pass http://tomcats;
}
}
...
}
echo -e "192.168.37.7 t0.magedu.com\n192.168.37.17 t1.magedu.com\n192.168.37.27 t2.magedu.com\n" >> /etc/hosts
#t1、t2测试页面
mkdir -pv /data/webapps/ROOT
vim /data/webapps/ROOT/index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>lbjsptest</title>
</head>
<body>
<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>
echo -e "192.168.37.7 t0.magedu.com\n192.168.37.17 t1.magedu.com\n192.168.37.27 t2.magedu.com\n" >> /etc/hosts
#t1配置
vim conf/server.xml
<Engine name="Catalina" defaultHost="t1.magedu.com">
<Host name="t1.magedu.com" appBase="/data/webapps" autoDeploy="true" jvmRoute="Tomcat1" />
</Engine>
bin/catalina.sh start
#t2配置
vim conf/server.xml
<Engine name="Catalina" defaultHost="t2.magedu.com">
<Host name="t2.magedu.com" appBase="/data/webapps" autoDeploy="true" jvmRoute="Tomcat2" />
</Engine>
bin/catalina.sh star
#测试
http://t0.magedu.com
bin/catalina.sh stop #关掉对应tomcat,重启后观察session的变化
session复制集群
#t0
vim /etc/nginx/nginx.conf
upstream tomcats {
#ip_hash; #注释掉
}
nginx -s reload
#t1
vim conf/server.xml
<Host name="t1.magedu.com" appBase="/data/webapps" autoDeploy="true" jvmRoute="Tomcat1" >
<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="192.168.37.17"
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"/>
</Cluster>
</Host>
mkdir /data/webapps/ROOT/WEB-INF
cp conf/web.xml /data/webapps/ROOT/WEB-INF
vim conf/web.xml #添加标签" <distributable/> "
<web-app>
<distributable/> #开启集群
</web-app>
#t2
vim conf/server.xml
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.37.27"
mkdir /data/webapps/ROOT/WEB-INF
cp conf/web.xml /data/webapps/ROOT/WEB-INF
vim conf/web.xml #添加标签" <distributable/> "
<web-app>
<distributable/> #开启集群
</web-app>
bin/catalina.sh stop && bin/catalina.sh start
#测试
http://t0.magedu.com
session server
#tomcat+memcached
1、上传以下jar包到/apps/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-tc8-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
2、配置sticky
#去掉复制集群
#t1
yum install memcached -y
vim conf/context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.37.17:11211,n2:192.168.37.27:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
#t2
yum install memcached -y
vim conf/context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.37.17:11211,n2:192.168.37.27:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
bin/catalina.sh stop && bin/catalina.sh start
systemctl start memcached
http://t0.magedu.com
#python获取session值
vim tomcat_get_session.py
import memcache # pip install python-memcached
mc = memcache.Client(['192.168.142.152:11211', '192.168.142.153:11211'], debug=True)
stats = mc.get_stats()[0]
print(stats)
for k,v in stats[1].items():
print(k, v)
print('-' * 30)
# 查看全部key
print(mc.get_stats('items')) # stats items 返回 items:4:number 1
print('-' * 30)
for x in mc.get_stats('cachedump 4 0'):# stats cachedump 4 0 # 4和上面的items返回的值有关;0表示全部
print(x)
chmod +x tomcat_get_session.py
./tomcat_get_session.py
#手动查看
telnet 192.168.37.17 11211
stats items #查看所有keys
stats cachedump 4 0 #查看key4所有信息
#停止memcached查看seesion是否改变
systemctl stop memcached
#tomcat+redis配置方法
1、停止所有memcached,下载jedis.jar,放到/apps/tomcat/lib
#t1
yum install redis -y
vim /etc/redis.conf
bind 192.168.37.7
2、配置non-sticky
#t1、t2
vim conf/context.xml
<Context>
#删除原来的memcached配置,添加以下内容
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="redis://192.168.37.17:6379"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
systemctl start redis
bin/catalina.sh stop && bin/catalina.sh start
#测试
http://t0.magedu.com
http://t1.magedu.com
http://t2.magedu.com
#python获取redis里的session值
#!/usr/bin/env python
import redis
client = redis.Redis(host='192.168.37.17', port=6379, db=0)
print(client.keys())
#手动查看
redis-cli -h 192.168.37.17 -p 6379
keys *
get key
Tomcat优化
默认不指定,-Xmx大约使用了1/4的内存,当前本机内存指定约为1G。
在bin/catalina.sh中增加
JAVA_OPTS="-server -Xmx512m -Xms128m -XX:NewSize=48m -XX:MaxNewSize=200m"
# -server:服务器模式
# -Xms:堆内存初始化大小;
# -Xmx:堆内存空间上限;
# -XX:NewSize=:新生代空间初始化大小;
# -XX:MaxNewSize=:新生代空间最大值;
参数 | 说明 | 举例 |
---|---|---|
-Xms | 设置应用程序初始使用的堆内存大小(新生代+老 年代) | -Xms2g |
-Xmx | 设置应用程序能获得的最大堆内存 早期JVM不建议超过32G,内存管理效率下降 | -Xms4g |
-XX:NewSize | 设置初始新生代大小 | |
-XX:MaxNewSize | 设置最大新生代内存空间 | |
-XX:NewRatio | 以比例方式设置新生代和老年代 | -XX:NewRatio=2 new/old=1/2 |
- XX:SurvivorRatio | 以比例方式设置eden和survivor | - XX:SurvivorRatio=6 eden/survivor=6/1 survivor/new=1/8 |
-Xss | 设置线程的栈大小 |