tomcat

实验1:Tomcat安装

[root@localhost ~]#cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)

[root@localhost ~]#uname -r
3.10.0-862.el7.x86_64

使用系统自带的jdk
yum install -y java-1.8.0-openjdk-devel
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr

安装Tomcat
yum install tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat -y
systemctl start tomcat
在这里插入图片描述
tcp/8005,8009,8080都已打开,tomcat已启动

提供一测试类应用
cd /var/lib/tomcat/webapps/
mkdir ./test/{classes,lib,META-INF,WEB-INF} -pv
cd test/
vim index.jsp

<%@ page language="java" %>
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="green">TomcatB.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

通过浏览器访问
在这里插入图片描述
实验2:配置nginx反代负载均衡tomcat

在这里插入图片描述
按照实验1搭建好两台tomcat主机

配置nginx
yum install nginx -y
vim /etc/nginx/nginx.conf

    upstream tomcatsrvs{
        server 192.168.91.139:8080;
        server 192.168.91.137:8080;
    }
	server {
		server_name  www.magedu.com;
		location / {
			proxy_pass http://tomcatserver;
        }
	}

实验3:配置httpd反代负载均衡tomcat
yum install -y httpd
vim /etc/httpd/conf.d/httpd_tomcat.conf

<proxy balancer://tomcatserver>		定义后端服务器组,名为tomcatserver
        balancermember http://192.168.91.139:8080
        balancermember http://192.168.91.137:8080			如果与后端服务器使用ajp协议连接,把http改为ajp
        proxyset lbmethod=byrequests		相当于轮询(rr)
</proxy>

<virtualhost *:80>
        servername www.magedu.com
        proxyrequests off
        proxypreservehost on
        proxyvia on
        <proxy *>
                require all granted
        </proxy>
        proxypass / balancer://tomcatserver/
        proxypassreverse / balancer://tomcatserver/
        <location />
                require all granted
        </location>
</virtualhost>

balancermember有后端检查功能,也可定义权重调度算法等等;参考文档:
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
httpd反代相关设置:
http集群调度算法:
byrequests:轮询(默认)
bybusyness:加权轮询
bytraffic:基于流量调度
定义后端调度主机状态status:
D:相当于down不接受请求
I:强行设置为健康
H:热备,相当于backup
E:错误
N:不接受新请求

实验4:httpd实现session sticky
vim /etc/httpd/conf.d/httpd_tomcat.conf

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://tomcatserver>
        balancermember http://192.168.91.139:8080 route=TomcatA
        balancermember http://192.168.91.137:8080 route=TomcatB
        proxyset lbmethod=byrequests
        proxyset stickysession=ROUTEID
</proxy>

<virtualhost *:80>
        servername www.magedu.com
        proxyrequests off
        proxypreservehost on
        proxyvia on
        <proxy *>
                require all granted
        </proxy>
        proxypass / balancer://tomcatserver/
        proxypassreverse / balancer://tomcatserver/
        <location />
                require all granted
        </location>
</virtualhost>

在这里插入图片描述
在这里插入图片描述
发现不论怎么刷新都只会调度都固定的一台后端服务器,并且Session ID不会改变

实验5:Nginx实现session sticky
vim /etc/nginx/nginx.conf

    upstream tomcatserver {
        server 192.168.91.139:8080;
        server 192.168.91.137:8080;
        hash $request_uri consistent;
    }

实验6:httpd, tomcat cluster实现session sticky
官方文档:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
vim /etc/tomcat/server.xml
在server.xml中的Engine或Host下插入下面的代码

        <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"						##每隔0.5s发送一次心跳检测
                        dropTime="3000"/>					##3s没收到心跳检测表明对方down
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"							##不建议用auto,更改为本机提供服务的IP
                      port="4000"
                      autoBind="100"							##自动绑定事件
                      selectorTimeout="5000"
                      maxThreads="6"/>					##集群内部最大线程,表明集群中最多有7台主机

            <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.MessageDispatch15Interceptor"/>
          </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.JvmRouteSessionIDBinderListener"/>			##官方文档这里有错误,少了结尾的/
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>			####官方文档这里有错误,少了结尾的/
        </Cluster>

在对应的站点目录下,创建WEB-INF/web.xml文件,因为是测试所以直接复制全局的web.xml
cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/
vim /var/lib/tomcat/webapps/test/WEB-INF/web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0">

<distributable/>				##添加这一段代码,注意,不要放到注释内部,开头和结尾

systemctl restart tomcat

在httpd主机上
vim /etc/httpd/conf.d/vhost.conf

<proxy balancer://tcsrvs>
        BalancerMember http://192.168.91.139:8080
        BalancerMember http://192.168.91.137:8080
</Proxy>
<VirtualHost *:80>
        ServerName www.magedu.com
        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost On
        <proxy *>
                require all granted
        </proxy>
        ProxyPass / balancer://tcsrvs/
        ProxyPassReverse / balancer://tcsrvs/
        <location />
                require all granted
        </location>
</VirtualHost>

测试
在这里插入图片描述
在这里插入图片描述
发现轮询调度到两台服务器上,但是Session ID保持不变

实验6:使用memcache作为tomcat的session server
简述
memcach是 高性能、分布式的内存对象缓存系统,memcache缓存时键和值都在内存中存储,所以访问速度很快,memcache缓存时要依赖于客户端的智能,缓存的过程是客户端先去访问后端的tomcat服务器,然后再请求memcache将访问的数据缓存下来,下次再访问时就直接会访问memcache中的缓存,这一点与varnish不同,varnish是客户端直接去访问varnish缓存服务器,如果缓存上面没有,varnish会替客户端到后端服务器上去寻找,然后缓存下来,所以memcache就被称为旁挂式缓存,强依赖于客户端的智能

特性
缓存:cache,无持久存储功能,因为存储于内存当中断电就会丢失;
bypass缓存,依赖于客户端的智能;
k/v cache,仅支持存储可流式化数据,也就是发送数据之前打碎,然后到接收端再重组的过程称为可流式化。

安装和配置
yum install memcached
监听的端口:11211/tcp, 11211/udp
memcached -h —可以查看程序命令常用选项

命令:
统计类:stats, stats items, stats slabs, stats sizes
存储类:set, add, replace, append在后面插入值, prepend在前面插入值
命令格式:

<command name> <key> <flags标志位> <exptime> <bytes>
<cas unique>

检索类:get, delete, incr/decr自增和减
清空:flush_all

要想将会话保存至后端memcache中,并且每个memcache都保存相同的会话,需要一个管理项目memcached-session-manager
项目地址:https://github.com/magro/memcached-session-manager

下载如下jar文件至各tomcat的/usr/share/tomcat/lib/目录中,其中的 v e r s i o n 要 换 成 你 所 需 要 的 版 本 号 , t c {version}要换成你所需要的版本号,tc versiontc{6,7,8}要换成与tomcat版本相同的版本号。
asm-6.0.jar
minlog-1.3.1.jar
kryo-4.0.1.jar
msm-kryo-serializer-2.1.1.jar
kryo-serializers-0.42.jar
objenesis-2.6.jar
memcached-session-manager-2.1.1.jar
reflectasm-1.11.3.jar
memcached-session-manager-tc7-2.1.1.jar
spymemcached-2.11.1.jar

vim /etc/tomcat/context.xml

<Context>
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
         memcachedNodes="n1:192.168.91.139:11211,n2:192.168.91.137:11211"
         lockingMode="auto"
         sticky="false"
         sessionBackupAsync="false"
         sessionBackupTimeout= "1000"  
         copyCollectionsForSerialization="true"
         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"                   
         transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    
    />                                                                             
</Context>               

yum install -y memcached
systemctl start tomcat memcached

实现前端httpd反代

<proxy balancer://tomcatserver>		定义后端服务器组,名为tomcatserver
        balancermember http://192.168.91.139:8080
        balancermember http://192.168.91.137:8080			如果与后端服务器使用ajp协议连接,把http改为ajp
        proxyset lbmethod=byrequests		相当于轮询(rr)
</proxy>

<virtualhost *:80>
        servername www.magedu.com
        proxyrequests off
        proxypreservehost on
        proxyvia on
        <proxy *>
                require all granted
        </proxy>
        proxypass / balancer://tomcatserver/
        proxypassreverse / balancer://tomcatserver/
        <location />
                require all granted
        </location>
</virtualhost>

systemctl start httpd

测试
在这里插入图片描述
在这里插入图片描述
请求轮询调度到后台服务器上,Session ID始终不变

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值