Tomcat配置Session復制
Session是由應用服務器維持的一個服務器端的存儲空間,用戶在連接服務器時,會由服務器生成一個唯一的Session ID,客戶端使用該Session ID為標識符來存取服務器端的Session存儲空間。而Session ID則保存到客戶端,使用瀏覽器Cookie保存,用戶提交頁面時,也會將Session ID提交到服務器端,來存取Session數據。服務器也通過URL重寫的方式來傳遞Session ID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則服務器可以自動通過重寫URL的方式來保存Session的值,並且這個過程對程序員透明。
Web應用中將這些多次請求修改使用的上下文對象稱作會話(Session),單機情況下,Session可由部署在服務器上的Web容器(Tomcat、Resin)進行管理。但在使用高可用負載均衡的集群環境中,由於負載均衡服務器可能會將每次請求分發到集群任何一臺應用服務器上,所以保證每次請求依然能夠獲得正確的Session比在單機上實現要復雜的多。
Session復制是小型企業應用使用較多的一種服務器集群Session管理機制。應用服務器開啟Web容器的Session復制功能,在集群中的幾臺服務器之間同步Session對象,使每臺服務器上都保存了所有用戶的Session信息,這樣任何一臺機器宕機都不會導致Session數據的丟失,而服務器使用Session時,也只需要在本機獲取即可。
Session復制方案只能應用在集群規模比較小的環境下,當集群規模較大時,集群服務器間需要大量的通信進行Session復制,占用服務器和網絡的大量資源。而且由於所有用戶的Session信息在每臺服務器上都有備份,在大量用戶訪問的情況下,會出現服務器內存不夠Session使用的情況。
環境描述
操作系統 | IP地址 | 主機名 | 軟件包列表 |
CentOS6.8-x86_64 | 192.168.200.101 | nginx | nginx |
CentOS6.8-x86_64 | 192.168.200.103 | Node1 | JDK Tomcat |
CentOS6.8-x86_64 | 192.168.200.104 | Node2 | JDK Tomcat |
步驟一:配置Nginx服務器
[root@nginx ~]# yum -y install pcre-devel zlib-devel openssl-devel
[root@nginx ~]# yum -y install nginx
[root@nginx ~]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
upstream tomcat_pool {
server 192.168.200.103:8080;
server 192.168.200.104:8080;
}
server {
listen 80;
server_name 192.168.200.101:80;
location / {
proxy_pass http://tomcat_pool;
proxy_set_header X-Real-IP $remote_addr;
}
}
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
[root@nginx ~]# service nginx start
步驟二:配置JDK(兩臺web服務器一致)
[root@nginx ~]# rpm -qa | grep jdk //刪除系統自帶的jdk版本
java-1.6.0-openjdk-1.6.0.38-1.13.10.4.el6.x86_64
java-1.7.0-openjdk-1.7.0.99-2.6.5.1.el6.x86_64
[root@nginx ~]# rpm -e java-1.6.0-openjdk
[root@nginx ~]# rpm -e java-1.7.0-openjdk --nodeps
[root@node1 ~]# tar xf jdk-7u65-linux-x64.tar.gz
[root@node1 ~]# mv jdk1.7.0_65/ /usr/local/java
[root@node1 ~]# vim /etc/profile //添加環境變量
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
[root@node1 ~]# source /etc/profile //使配置生效
[root@node1 ~]# java -version
java version "1.7.0_99"
OpenJDK Runtime Environment (rhel-2.6.5.1.el6-x86_64 u99-b00)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
步驟三、部署Tomcat(兩臺web服務器一致)
[root@node1 ~]# tar xf apache-tomcat-7.0.54.tar.gz
[root@node1 ~]# mv apache-tomcat-7.0.54 /usr/local/tomcat
步驟四:配置Session復制
Tomcat支持Session集群,可在Tomcat服務器間復制全部Session信息,當後端一臺服務器宕機後,Nginx重新調度請求分配到另外一臺服務器,客戶端可從另一臺Tomcat上獲取用戶的session信息。Session集群可在Tomcat服務器規模在10臺以下時使用,否則會導致Session復制時性能代價過高。
[root@node1 ~]# vim /usr/local/tomcat/conf/server.xml
104 <Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> //node2主機寫node2
109 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> //去掉註釋
[root@node1 ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
32 <distributable/> #添加內容,在</web-app>上添加
步驟五:建立測試頁面
[root@node1 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.200.103");%>
[root@node2 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.200.104");%>
步驟六:啟動tomcat
[root@node1 ~]# /usr/local/tomcat/bin/startup.sh
[root@node2 ~]# /usr/local/tomcat/bin/startup.sh
步驟七:測試
刷新瀏覽器
可以看到session編號是不變的,而node標簽在變化。
Tomcat配置Session復制