tomcat

實驗1:Tomcat安裝css

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

[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=/usrjava

安裝Tomcat
yum install tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat -y
systemctl start tomcat
在這裏插入圖片描述
tcp/8005,8009,8080都已打開,tomcat已啓動nginx

提供一測試類應用
cd /var/lib/tomcat/webapps/
mkdir ./test/{classes,lib,META-INF,WEB-INF} -pv
cd test/
vim index.jspgit

<%@ 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反代負載均衡tomcatgithub

在這裏插入圖片描述
按照實驗1搭建好兩臺tomcat主機web

配置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.confapache

<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 {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始終不變