Tomcat

作者: Liang_JC | 来源:发表于2020-06-15 11:22 被阅读0次

安装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 设置线程的栈大小

相关文章

网友评论

      本文标题:Tomcat

      本文链接:https://www.haomeiwen.com/subject/yfrptktx.html