寫在前面
我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、阜新ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的阜新網(wǎng)站制作公司
前一篇文章為大家解釋說明了會話的類型,今天這篇文章將帶領(lǐng)大家一步一步實現(xiàn)一個簡單的session server,主要是讓大家理解session server的工作過程,當(dāng)然了對于中小向站點,這個結(jié)構(gòu)也完全夠用了。本節(jié)主體結(jié)構(gòu):
memcached-session-manager介紹
網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
Nginx反向代理配置
Tomcat配置
memcached配置
測試
錯誤分析
memcached-session-manager介紹
memcached-session-manager是一個將會話保存在memcached或redis中的tomcat會話管理器,用于高可用的,可伸縮和容錯的Web服務(wù)場景中。 它支持粘性和非粘性配置,目前正在使用tomcat 6.x,7.x和8.x. 對于粘性會話,支持會話故障轉(zhuǎn)移(tomcat崩潰),對于非粘性會話,這是默認(rèn)的(對于不同的請求,會話由不同的tomcats默認(rèn)提供)。 此外memcached故障轉(zhuǎn)移(memcached崩潰)通過會話遷移來實現(xiàn)。 也不應(yīng)該有單點故障,所以當(dāng)memcached失敗時,會話不會丟失并且可以在tomcat或其他memcached中使用。
在配置上你必須把spymemcached jar和memcached-session-manager jar放到tomcat對應(yīng)的lib目錄下。 如果您想使用Redis而不是memcached,則需要使用Redis客戶端“jedis”對應(yīng)的.jar包, 還需要在Manager類并添加一些配置屬性以便能夠?qū)崿F(xiàn)將會話存儲至memcached中,memcached自身不具有配置功能,必須依賴前端的Tomcat或其他類服務(wù)器。
對于一個簡單的實現(xiàn),您只需要安裝一個tomcat(6,7或8)和一個memcached或Redis(或支持memcached協(xié)議的s.th.)。 在您的生產(chǎn)環(huán)境中,您可能會擁有多個tomcats,并且在不同的硬件上也應(yīng)該有多個memcached節(jié)點可用。 或者,您可以將會話數(shù)據(jù)存儲在Redis中而不是memcached中。 您可以使用粘性會話或非粘性會話,memcached-session-manager(msm)支持兩種操作模式。
memcached-session-manager項目地址,http://code.google.com/p/memcached-session-manager/
網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
這里主要是用于一臺Nginx實現(xiàn)前端調(diào)度,后面連接兩臺Tomcat應(yīng)用程序服務(wù)器,在tomcat的后端添加兩臺memcached存儲,實現(xiàn)一個小型的架構(gòu),當(dāng)然了這里省略了離客戶端最近的DNS服務(wù)器,以及靠近用戶的一個負(fù)載均衡集群,以及負(fù)載均衡之后的緩存服務(wù)器集群。其簡單架構(gòu)與網(wǎng)絡(luò)地址規(guī)劃如下:
本文的所有主機都是centos7.3版本
Nginx反向代理配置
對于nginx來說,這本實驗中只是起了調(diào)度的作用,即反向代理的作用,并沒有實現(xiàn)動靜分離,路徑重寫等操作,這里主要是將客戶端的請求調(diào)度至后端應(yīng)用程序服務(wù)器Tomcat。所以配置起來就顯得容易的多,只需要定義一個upstream組即可。然后按相應(yīng)的算法調(diào)度即可。集體配置如下:
[root@vin ~]# vim /etc/nginx/nginx.conf ... http { upstream vinsent { # 定義服務(wù)器集群 server 192.168.14.66:8080; server 192.168.14.77:8080; } server { listen 80 ; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass # 將請求代理至后端Tomcat服務(wù)器 } ... }
Tomcat配置
Tomcat作為應(yīng)用程序服務(wù)器,主要作用是處理jsp文件,在這里,我們需要提供一個用于測試的文件index.jsp以及對應(yīng)版本的.jar包。主要是memcached-session-manager相關(guān)的jar包,和用于將前端的用戶的cookie信息序列化成”鍵-值”格式的工具,
1)安裝tomcat及相關(guān)的服務(wù)包
[root@vin tools]# cat /etc/redhat-release # 版本檢測 CentOS Linux release 7.3.1611 (Core) [root@vin tools]# iptables -F # 關(guān)閉防火墻與selinux [root@vin tools]# setenforce 0 [root@vin tools]# yum install java-1.7.0-openjdk-devel.x86_64 # 安裝jdk [root@vin tools]# yum installtomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
2)提供context容器
分別在兩個tomcat上的某host上定義一個用于測試的context容器,并在其中創(chuàng)建一個會話管理器。
[root@vin webapps]# vim /etc/tomcat/server.xml ......
3)分別為兩個context提供測試頁面
測試目錄的結(jié)構(gòu)如下
[root@vin webapps]# cat /usr/share/tomcat/webapps/test/index.jsp <%@ page language="java" %>TomcatA TomcatA.vinsent.cn
Session ID | <% session.setAttribute("vinsent.cn","vinsent.cn"); %><%= session.getId() %> |
Created on | <%= session.getCreationTime() %> |
4)下載jar包
這里的jar包主要分為兩類,一種是memcached-session-manager相關(guān)的包,還有一種是與序列化相關(guān)的包:序列化包主要有4大類:
kryo-serializer: msm-kryo-serializer, kryo-serializers-0.34+, kryo-3.x, minlog, reflectasm, asm-5.x, objenesis-2.x
javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1
xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min
flexjson-serializer: msm-flexjson-serializer, flexjson
下載地址:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
在這里我們選擇分開放置,當(dāng)然了你也可以全部放置在lib目錄下:
[root@vin webapps]# tree /usr/share/tomcat/webapps/test/ /usr/share/tomcat/webapps/test/ ├── index.jsp └── WEB-INF └── lib ├── javolution-5.4.3.1.jar └── msm-javolution-serializer-2.1.1.jar 2 directories, 3 files [root@vin webapps]# ls /usr/share/tomcat/lib/ annotations-api.jar extras tomcat7-websocket.jar tomcat-jsp-2.2-api.jar catalina-ant.jar jasper-el.jar tomcat-api.jar tomcat-juli.jar catalina-ha.jar jasper.jar tomcat-coyote.jar tomcat-servlet-3.0-api.jar catalina.jar jasper-jdt.jar tomcat-el-2.2-api.jar tomcat-util.jar catalina-tribes.jar log4j.jar tomcat-i18n-es.jar websocket-api.jar commons-collections.jar memcached-session-manager-2.1.1.jar tomcat-i18n-fr.jar commons-dbcp.jar memcached-session-manager-tc7-2.1.1.jar tomcat-i18n-ja.jar commons-pool.jar spymemcached-2.12.3.jar tomcat-jdbc.jar
Memcached配置
對于memcached服務(wù)器的配置其實很簡單,由于memcached自身不能夠主動存儲cookie信息,只需要在memcached服務(wù)器上安裝memcached服務(wù)就行,至于對數(shù)據(jù)進行序列化則是由前面的服務(wù)器來實現(xiàn)的。
[root@vin ~]# yum install memcached # 安裝memcached,我已安裝 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile Package memcached-1.4.15-10.el7.x86_64 already installed and latest version Nothing to do [root@vin ~]# systemctl start memcached # 啟動服務(wù) [root@vin ~]# ss -tnl | grep 1121 # 檢查服務(wù)是否正常啟動 LISTEN 0 128 *:11211 *:* LISTEN 0 128 :::11211 :::*
測試
我們在客戶端進行測試。在瀏覽器中輸入nginx的地址:刷新你會看到,訪問的內(nèi)容發(fā)生了改變,但是cookie值并沒有發(fā)生改變。
錯誤分析
1 序列化出現(xiàn)故障
常見現(xiàn)象如下,沒次訪問cookie值都會隨著改變,說明為存儲至memcached數(shù)據(jù)庫中。
2 訪問時提示404錯誤頁
這種情況多數(shù)是context為配置正確,或則在提供的index.jsp文件所在的目錄結(jié)構(gòu)錯誤
3 版本不對應(yīng)
如果你能排除以上錯誤,仍然不能訪問的話,說明你提供的jar包版本與你的tomcat版本不一致。