使用redis實現session複製css
一:概念
對於生產環境有了必定規模的tomcat集羣業務來講,要實現session會話共享,比較穩妥的方式就是使用數據庫持久化session.爲何要持久化session(共享session)呢?由於在客戶端每一個用戶的Session對象存在Servlet容器中,若是Tomcat服務器重啓或者宕機的話,那麼該session就會丟失,而客戶端的操做會因爲session丟失而形成數據丟失;若是當前用戶訪問量巨大,每一個用戶的Session裏存放大量數據的話,那麼就很佔用服務器大量的內存,進而導致服務器性能受到影響。數據庫持久化session,分爲物理數據庫和內存數據庫。物理數據庫備份session,因爲其性能緣由,不推薦;內存數據庫可使用redis和memcached,下面說下redis方式:
可是有一點須要清楚:就是Redis這種方式目前還暫不支持Tomcat8環境(由於如今網上插件不支持tomcat8,非要支持tomcat8,則需修改插件jar包的源代碼)!下面就先說下Tomcat7+Redis+Nginx實現session會話共享的操做記錄:
html
實現達到的效果 當客戶端訪問Nginx服務器時,Nginx負載均衡會自動將請求轉發到Tomcat1節點或Tomcat2節點服務器,以減輕Tomcat壓力,從而達到Tomcat集羣化部署,爲了使各Tomcat之間共享同一個Session,將採用Redis緩存服務來集中管理Session存儲。Nginx實現負載均衡,並使用Redis實現session共享。本案例採用的是redis單點方式(能夠給這個redis節點配置一個從節點,採用redis主從模式,鏈接redis的master節點.redis默認不支持主主模式),若是使用redis集羣方式,則採用Sentinels鏈接。java
二:基礎信息
IP 主機名 應用 軟件
192.168.10.101 Nginx-node Nginx反向代理 nginx-1.12.2.tar.gz
192.168.10.102 Redis-node Redis緩存 redis-3.2.9.tar.gz
192.168.10.103 Tomcat-node1 Tomcat服務器 Tomcat-7
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
tomcat-redis-session-manager1.2.jar
192.168.10.104 Tomcat-node2 Tomcat服務器 node
三:部署流程linux
1:系統基本環境的設置
下面操做在三臺機器上一樣執行:
[root@Nginx-node ~]# cat /etc/redhat-releasenginx
爲了方便測試,關閉iptables防火牆和selinux。若是是生產環境,開啓iptables後,須要開放對應的應用端口。web
[root@Nginx-node ~]# setenforce 0
[root@Nginx-node ~]# getenforce
Disabledredis
[root@Nginx-node ~]# cat /etc/sysconfig/selinux |grep "SELINUX=disabled"
SELINUX=disabled數據庫
[root@Nginx-node ~]# systemctl stop firewalldapache
2:安裝Nginx
(在192.168.10.200機器上操做)
(1)安裝依賴包
[root@Nginx-node ~]# yum -y install gcc*
(2)安裝pcre庫
[root@Nginx-node ~]# yum -y install pcre-devel
(3)安裝zlib庫
[root@Nginx-node ~]# yum -y install zlib-devel
(4)安裝openssl
[root@Nginx-node ~]# yum -y install openssl
(5)安裝nginx,特別注意要指定prce zlib openssl原碼包位置
[root@Nginx-node ~]# tar zxvf nginx-1.12.2.tar.gz
[root@Nginx-node ~]# cd nginx-1.12.2
[root@Nginx-node nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@Nginx-node nginx-1.12.2]# make && make install
(6)安裝成功後配置nginx
[root@Nginx-node nginx-1.12.2]# ln -s /usr/local/nginx/sbin/ /usr/local/sbin/
[root@Nginx-node nginx-1.12.2]# ln -s /usr/local/nginx/bin/ /usr/local/bin/
[root@Nginx-node nginx-1.12.2]# cd /usr/local/nginx/conf/
[root@Nginx-node conf]# cp nginx.conf nginx.conf.bak
[root@Nginx-node conf]# vim nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; include vhosts/*.conf;
}
[root@Nginx-node conf]# mkdir vhosts
[root@Nginx-node conf]# cd vhosts/
[root@Nginx-node vhosts]# vim lb_tomcat.conf
upstream tomcat-lb {
server 192.168.10.103:8080;
server 192.168.10.104:8080;
}
server { listen 80; server_name www.benet.com; location / { proxy_pass http://tomcat-lb; } location ~ .*\.(gif|jpg|png|htm|html|css|ico|flv|swf)(.*) { proxy_pass http://tomcat-lb; }
}
[root@Nginx-node vhosts]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Nginx-node conf]# /usr/local/nginx/sbin/nginx
[root@Nginx-node vhosts]# netstat -anpt | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 69640/nginx: master
3:安裝tomcat
(在192.168.10.103和192.168.10.104兩臺機器上操做)
(1)檢查java8環境
[root@localhost ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
(2)安裝配置tomcat7
[root@Tomcat-node1 ~]# tar zxvf apache-tomcat-7.0.90.tar.gz
[root@Tomcat-node1 ~]# mv apache-tomcat-7.0.90 /usr/local/tomcat7
(3)配置tomcat7
[root@Tomcat-node1 ~]# cd /usr/local/tomcat7/conf/
[root@Tomcat-node1 conf]# cp server.xml server.xml.bak
[root@Tomcat-node1 conf]# vim server.xml
<Engine name="Catalina" defaultHost="localhost"> #這一行不須要修改,不必動.......
<Host name="localhost" appBase="/data/webapps/" unpackWARS="true" autoDeploy="true">
<Context path="" docBase="/data/webapps" reloadable="true" />
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs" prefix="web1_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
建立項目目錄
[root@Tomcat-node1 conf]# mkdir -p /data/webapps/{WEB-INF,META-INF,classes,lib}
[root@Tomcat-node1 conf]# mkdir /data/logs
建立測試文件
[root@Tomcat-node1 ~]# touch /data/webapps/index.jsp
[root@Tomcat-node1 ~]# vim /data/webapps/index.jsp
<html>
<body bgcolor="green">
<center>
<%= request.getSession().getId() %>
<h1>192.168.10.103</h1>
<h1>port:8080</h1>
<h1>this is Tomcat-node1! </h1>
</center>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%><%out.println("This is Tomcat server 103 !");%>
另外一個節點的測試文件爲:
[root@Tomcat-node2 ~]# vim /data/webapps/index.jsp
<html>
<body bgcolor="yellow">
<center>
<%= request.getSession().getId() %>
<h1>192.168.10.104</h1>
<h1>port:8080</h1>
<h1>this is Tomcat-node2! </h1>
</center>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false"%>
SessionID:<%=session.getId()%><BR>
SessionIP:<%=request.getServerName()%> <BR>
SessionPort:<%=request.getServerPort()%><%out.println("This is Tomcat server 104!");%>
4:測試
使用客戶端訪問nginx地址http://192.168.10.101
從測試結果來看,網站並無造成session複製
SessionID在兩個網站上是不一樣的
4:配置Redis+Session共享
(1)爲tomcat配置redis會話複製功能(兩個tomcat節點都要設置)
[root@Tomcat-node1 ~]# cd /usr/local/tomcat7/conf/
[root@Tomcat-node1 conf]# cp context.xml context.xml.bak
[root@Tomcat-node1 conf]# cat context.xml
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="192.168.10.102" port="6379" database="0" maxInactiveInterval="60" />
(2)將依賴的三個jar包拷貝到tomcat7的lib目錄下(兩個tomcat節點都要設置)
[root@Tomcat-node1 ~]# cp *.jar /usr/local/tomcat7/lib/
(3)從新啓動tomcat(兩個tomcat節點首要設置)
[root@Tomcat-node1 ~]# /usr/local/tomcat7/bin/shutdown.sh
[root@Tomcat-node1 ~]# /usr/local/tomcat7/bin/startup.sh
[root@Tomcat-node1 ~]# ps -ef | grep tomcat
五: redis安裝
1:安裝redis
(1)修改主機名
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostname redis-node
[root@localhost ~]# bash
(2)安裝
[root@redis-node ~]# yum -y install gcc*
[root@redis-node ~]# tar zxvf redis-3.2.9.tar.gz -C /usr/src
[root@redis-node ~]# cd /usr/src/redis-3.2.9/
[root@redis-node redis-3.2.9]# make
[root@redis-node redis-3.2.9]# make install
注意:默認安裝在當前目錄下,若是要安裝在指定目錄,可使用命令:make PREFIX=路徑 install
[root@redis-node redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@redis-node utils]# ./install_server.sh
安裝嚮導使用默認參數
[root@redis-node utils]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 9660/redis-server 1
(3):配置參數
[root@redis-node ~]# vi /etc/redis/6379.conf
bind 192.168.10.102
(4):重啓redis
[root@redis-node ~]# /etc/init.d/redis_6379 restart
最好在tomcat兩個節點上使用"telnet 192.168.10.203 6379"驗證下redis是否能成功鏈接
(5)測試
tomcat經過redis共享session測試 訪問http://192.168.10.101,不斷刷新頁面,發現頁面的其餘信息改變,可是sessionid保持不變,即說明實現了session共享!
關閉兩個節點中的任意一個tomcat服務,繼續訪問頁面,發現sessionid任然保持不變!而後在redis機器上查看有沒有上面sessionid的key值存在