什麼是session?
其實session是一個存在服務器上的相似於一個散列表格的文件。裏面存有咱們須要的信息,在咱們須要用的時候能夠從裏面取出來。
提及session的做用,簡單的舉個例子:咱們在登陸某些網站的時候,輸入了用戶名密碼,登陸之後再打開新的頁面時,自動顯示的是已登陸的狀態,不須要再次從新登陸。這裏就是session功能的一個小小的體現。
session是一種管理用戶狀態和信息的機制,與cookies的不一樣的是,session的數據是保存在服務器端。說的明白點就是session至關於一個虛擬的瀏覽器,在這個瀏覽器上處於一種保持登陸的狀態。
session的功能:
1.Session是一種Web會話中的經常使用狀態之一。
2.Session提供了一種把信息保存在服務器內存中的方式。他能儲存任何數據類型,包含自定義對象。
3.每一個客戶端的Seesion是獨立存儲的。
4.在整個會話過程當中,只要SessionID的cookie不丟失,都會保存Session信息的。
5.Session不能跨進程訪問,只能由該會話的用戶訪問。應爲提取Session數據的id標識是以Cookie的方式保存到訪問者瀏覽器的緩存裏的。
6.當會話終止,或過時時,服務器就清除Session對象。
7.Session經常使用於保存登陸用戶的ID.
8.Session保存的數據是跨頁面全局型的。
環境配置:
http服務器:192.168.117.6
web服務器TomcatA:192.168.117.4
web服務器TomcatB:192.168.117.5
注:此實驗三臺虛擬機均需關閉selinux,防火牆,以避免沒必要要的報錯
systemctl stop firewalld #關閉防火牆
systemctl disable firewalld #關閉防火牆開機自啓動
getenforce #查看selinux的狀態
setenforce 0 #臨時調整selinux爲寬鬆模式
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #永久關閉selinux
web服務器配置:
注:運行tomcat服務,須要java環境。
[root@tomcat ~]# yum list all | grep jdk
#查看java軟件包,本實例以java-1.8.0-openjdk爲例
[root@tomcat ~]# yum install java-1.8.0-openjdk -y
[root@tomcat ~]# java -version #查看java版本
本實例以apache-tomcat-8.0.30.tar.gz爲例
注:如下兩臺tomcat的配置,除了web界面和server.xml配置不一樣,其餘操做都是同樣的
[root@tomcat ~]# cd /usr/local/src/ #此目錄通常用於存放源碼包,能夠把下載的apache-tomcat-8.0.30.tar.gz放到此目錄下
[root@tomcat src]# tar xf apache-tomcat-8.0.30.tar.gz -C /usr/local/
#解壓tar格式壓縮包,-C(大寫的C)選項,指定解壓目錄
[root@tomcat src]# cd .. #..表明上級目錄
[root@tomcat local]# ls
apache-tomcat-8.0.30 bin etc games include lib lib64 libexec sbin share src
[root@tomcat local]# ln -sv apache-tomcat-8.0.30/ tomcat
#給apache-tomcat-8.0.30做軟連接,能夠簡單(不精確)的認爲軟連接以後,兩目錄徹底相同
[root@tomcat local]# cd tomcat/
[root@tomcat tomcat]# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
#在/etc/profile.d/下建立一個tomcat.sh的文件,用來聲明tomcat bin目錄下的環境變量,換句話說:bin目錄下的全部腳本,能夠在任意路徑下直接運行。
一、建立web虛擬機特有的目錄結構
[root@tomcat ~]# mkdir /data/mywebapps/{lib,classes,WEB-INF,META-INF} -pv
[root@tomcat ~]# tree /data/mywebapps/
/data/mywebapps/
├── classes
├── index.jsp
├── lib
├── META-INF
└── WEB-INF
注:一個webapp目錄至少應有此5個文件
[root@tomcat ~]# mkdir /data/logs #提供此web訪問日誌
二、提供兩個web界面
[root@TomcatA~]# vim /data/mywebapps/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="blue">TomcatA.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>
[root@TomcatB~]# vim /data/mywebapps/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="red">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>
三、添加web虛擬機配置文件:
[root@Tomcat A~]# vim /usr/local/tomcat/conf/server.xml
1) <Engine name="Catalina" defaultHost="web.test.com" jvmRoute="TomcatA">
2) <Host name="web.test.com" appbase="/data/mywebapps">
<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.1.7" #指定多播地址
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.117.4" #指定本機的ip地址(即此web虛擬機的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.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.ClusterSessionListener"/>
</Cluster>
<Context path="" docBase="/data/mywebapps" unpackWARs="true" autoDeploy="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="webA_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@tomcatA ~]# cp /usr/local/tomcat/conf/web.xml /data/webapps/ROOT/WEB-INF/ #提供虛擬機所需的web.xml文件
[root@tomcatA ~]# vim /data/webapps/ROOT/WEB-INF/web.xml
添加 <distributable/> #位置在<web-app>之中
[root@TomcatB~]# vim /usr/local/tomcat/conf/server.xml
1)<Engine name="Catalina" defaultHost="web.test.com" jvmRoute="TomcatB">
2)<Host name="web.test.com" appbase="/data/mywebapps">
<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.1.7" #指定多播地址
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.117.5" #指定本機的ip地址(即此web虛擬機的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.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.ClusterSessionListener"/>
</Cluster>
<Context path="" docBase="/data/mywebapps" unpackWARs="true" autoDeploy="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
prefix="webB_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
[root@tomcatB ~]# cp /usr/local/tomcat/conf/web.xml /data/webapps/ROOT/WEB-INF/ #提供虛擬機所需的web.xml文件
[root@tomcatB ~]# vim /data/webapps/ROOT/WEB-INF/web.xml
添加 <distributable/> #位置在<web-app>之中
[root@tomcat ~]# configtest.sh #查看server.xml配置文件是否有語法錯誤
[root@tomcat ~]# catalina.sh start #啓動tomcat
[root@tomcat ~]# netstat -tan | grep 8005 #管理jvm虛擬機的端口
[root@tomcat ~]# netstat -tan | grep 8009 #ajp協議端口
[root@tomcat ~]# netstat -tan | grep 8080 #http協議端口
tomcat cluster session適用於nginx負載,apache的三種模式的負載等。本次以mod_proxy_http模塊爲例!!!
以mod_proxy_http模塊負載的簡單解析:
http:
mod_proxy、
mod_proxy_http、
mod_proxy_balancer
Tomcat:
http connector
http配置:
[root@httpd ~]# yum install httpd -y
[root@httpd ~]# rpm -ql httpd #查看httpd相關的配置文件
[root@httpd ~]# vim /etc/httpd/conf/httpd.conf
註釋掉 #DocumentRoot "/var/www/html"
[root@httpd ~]# cd /etc/httpd/conf.d/
[root@httpd conf.d]# vim lb_http.conf #建立一個必須以.conf結尾文件
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #session會話綁定
<proxy balancer://lbcluster1> #定義集羣lbcluster1
BalancerMember http://192.168.117.4:8080 loadfactor=10 route=TomcatA #指定集羣成員,loadfactor指定負載權重,route指定web服務器的標籤,集羣能夠經過此標籤找到這個集羣成員
BalancerMember http://192.168.117.5:8080 loadfactor=10 route=TomcatB
ProxySet Stickysession=ROUTEID #session會話綁定
</proxy>
<VirtualHost *:80>
ServerName web.test.com
ProxyVia on
ProxyRequests off #關閉正向代理
ProxyPreserveHost on #開啓web虛擬機
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://lbcluster1/
ProxyPa***everse / balancer://lbcluster1/ #ProxyPass Reverse,由於前面被和諧了,分開寫的,合在一塊兒就能夠了。
<Location />
Require all granted
</Location>
</VirtualHost>
[root@httpd conf.d]# httpd -t #檢查conf文件的語法格式是否正確
[root@httpd conf.d]# systemctl start httpd.service
[root@httpd conf.d]# netstat -tan | grep 80
客戶端驗證(本地物理機):
http://192.168.117.6

html
效果:http前端不管代理到哪臺tomcat服務器,Session ID都是保持不變的