1. 程式人生 > >Nginx+Tomcat+Memcached實現Session保持

Nginx+Tomcat+Memcached實現Session保持

一、Tomcat介紹

1、Tomcat歷史

Tomcat是Apache 軟體基金會(Apache Software Foundation)的Jakarta 專案中的一個核心專案,由Apache、Sun 和其他一些公司及個人共同開發而成。由於有了Sun 的參與和支援,最新的Servlet 和JSP 規範總是能在Tomcat 中得到體現,Tomcat 5支援最新的Servlet 2.4 和JSP 2.0 規範。因為Tomcat 技術先進、效能穩定,而且免費,因而深受Java 愛好者的喜愛並得到了部分軟體開發商的認可,成為目前比較流行的Web 應用伺服器。

2、Tomcat簡介

  • Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP 程式的首選。實際上Tomcat是Apache 伺服器的擴充套件,但執行時它是獨立執行的,所以當你執行tomcat 時,它實際上作為一個與Apache 獨立的程序單獨執行的。

  • 當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上執行JSP 頁面和Servlet。另外,Tomcat和IIS等Web伺服器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的預設模式。不過,Tomcat處理靜態HTML的能力不如Apache伺服器。

  • 我們可以通過官網檢視其資訊。

二、實驗環境

1、架構圖

這裡寫圖片描述

原理:Nginx實現對Tomcat的排程,通過sticky保持訪問同一臺Tomcat伺服器,通過配置Tomcat實現相互使用Memcahed,並且當Memcached掛掉後,能夠使用自己的Memcached,達到session保持的效果。

2、session官方推薦的有 4 種

  1. java serialization

  2. msm-kryo-serializer

  3. msm-javolution-serializer

  4. msm-xstream-serializer

其中效能最好的序列化方案是 Kryo,此實驗我們採用 kryo 方式。

3、安裝說明

主機名 IP 安裝服務 功能說明
server1 10.10.10.1 Nginx、Tomcat、Memcached 實現排程以及session保持
server2 10.10.10.2 Tomcat、Memcached 實現session保持

三、java安裝(server1、2)

1、解壓

[root@server1 ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u171-linux-x64.tar.gz
[root@server1 ~]# tar xf jdk-8u171-linux-x64.tar.gz
[root@server1 ~]# mv jdk1.8.0_171/ /usr/local/java

2、宣告變數

[[email protected] ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin

[[email protected] ~]# . /etc/profile

3、檢視版本

[root@server1 ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

4、傳送到server2

[root@server1 ~]# scp -r /usr/local/java/ [email protected]:/usr/local/
[root@server1 ~]# scp /etc/profile [email protected]:/etc/
[root@server2 ~]# source /etc/profile

四、安裝Tomcat(server1、2)

1、下載Tomcat

[root@server1 ~]# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.90/bin/apache-tomcat-7.0.90.tar.gz

2、解壓tar包

[root@server1 ~]# tar xf apache-tomcat-7.0.90.tar.gz 
[root@server1 ~]# mv apache-tomcat-7.0.90 /usr/local/tomcat

3、啟動Tomcat

[root@server1 ~]# /usr/local/tomcat/bin/startup.sh 
[root@server1 tomcat]# /usr/local/tomcat/bin/shutdown.sh       ###關閉

4、檢視結果

(1)檢視埠
[root@server1 ~]# netstat -lntup|grep 8080              ###預設開啟埠8080
tcp        0      0 :::8080                     :::*                        LISTEN      1185/java           
(2)瀏覽器中檢視測試頁面
http://10.10.10.1:8080

這裡寫圖片描述

5、檢視java環境能否使用

(1)時間頁面
[[email protected] ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
Time: <%=new java.util.Date() %>
(2)瀏覽器中檢視測試頁面
http://10.10.10.1:8080/test.jsp

這裡寫圖片描述

6、採用 kryo 方式

把如下軟體包放置到/usr/local/tomcat/lib目錄中:

asm-3.2.jar
kryo-1.04.jar
kryo-serializers-0.10.jar
memcached-session-manager-1.6.3.jar
memcached-session-manager-tc7-1.6.3.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.3.jar
reflectasm-1.01.jar
spymemcached-2.7.3.jar

7、安裝Tomcat到server2

[root@server1 ~]# scp -r /usr/local/tomcat/ [email protected]:/usr/local/
[root@server2 ~]# /usr/local/tomcat/bin/startup.sh

這裡寫圖片描述

五、編譯安裝Nginx

1、解壓tar包

[root@server1 ~]# wget http://nginx.org/download/nginx-1.14.0.tar.gz
[root@server1 ~]# wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
[root@server1 ~]# tar xf nginx-1.14.0.tar.gz 
[root@server1 ~]# tar xf master.tar.gz
[root@server1 ~]# mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module-ng 

2、編譯安裝

[root@server1 ~]# yum install -y pcre-devel gcc openssl-devel 
[root@server1 ~]# useradd -s /sbin/nologin nginx
[root@server1 ~]# cd nginx-1.14.0
[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-sticky-module-ng
[root@server1 nginx-1.14.0]# make && make install
[root@server1 nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ 

3、配置nginx.conf

[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf

這裡寫圖片描述
這裡寫圖片描述

4、檢視是否啟動成功

[[email protected] ~]# nginx

http://10.10.10.1

這裡寫圖片描述

5、配置Tomcat釋出頁面

[[email protected] ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
server1 Time: <%=new java.util.Date() %>
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
[[email protected] ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
server2 Time: <%=new java.util.Date() %>
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>

6、檢視釋出頁面

如果刪除sticky,會訪問不同的伺服器,加入後會話保持成功!!!

這裡寫圖片描述

六、安裝Memcached(2臺)

1、安裝

[root@server1 ~]# yum install -y memcached
[root@server1 ~]# /etc/init.d/memcached restart

2、檢視埠

[root@server1 ~]# netstat -lntup|grep 11211
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN      7063/memcached      
tcp        0      0 :::11211                    :::*                        LISTEN      7063/memcached      
udp        0      0 0.0.0.0:11211               0.0.0.0:*                               7063/memcached      
udp        0      0 :::11211                    :::*                                    7063/memcached  

3、配置context.xml

實現功能:把Tomcat和Memcached聯絡起來!!!

[[email protected] ~]# vim /usr/local/tomcat/conf/context.xml            ###寫在context中
<Context>
...
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="server1:10.10.10.1:11211,server2:10.10.10.2:11211"
        failoverNodes="server1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[[email protected] ~]# vim /usr/local/tomcat/conf/context.xml  
<Context>
...         
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="server1:10.10.10.1:11211,server2:10.10.10.2:11211"
        failoverNodes="server2"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

4、重啟Tomcat(2臺)

[root@server1 ~]# /usr/local/tomcat/bin/shutdown.sh 
[root@server1 ~]# /usr/local/tomcat/bin/startup.sh

5、檢視日誌

可以發現Tomcat和Memcached已經連線起來!!!

[root@server2 ~]# cat /usr/local/tomcat/logs/catalina.out      

這裡寫圖片描述

6、測試

我們可以發現server1可以使用server2和Memcached,當停止server2的Memcahed時,session不會中斷,server1會自動連線到自己的Memcached!!!

這裡寫圖片描述

[root@server2 ~]# /etc/init.d/memcached stop

這裡寫圖片描述

七、安裝報錯

1、報錯:

[[email protected] ~]# cat /usr/local/tomcat/logs/catalina.out
14-Aug-2018 23:46:36.723 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal The session manager failed to start
 org.apache.catalina.LifecycleException: Failed to start component [de.javakaffee.web.msm.MemcachedBackupSessionManager[/docs]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1140)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1875)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.AbstractMethodError: de.javakaffee.web.msm.MemcachedBackupSessionManager.getContainer()Lorg/apache/catalina/Container;

2、解決方案:

使用tomcat8、9上出現的,一直無法解決,後來用tomcat7可以工作!!!

相關推薦

Nginx+Tomcat+Memcached實現Session保持

一、Tomcat介紹 1、Tomcat歷史 Tomcat是Apache 軟體基金會(Apache Software Foundation)的Jakarta 專案中的一個核心專案,由Apache、Sun 和其他一些公司及個人共同開發而成。由於有了Sun

Nginx+Tomcat+Memcached實現會話保持

svn load ant lan () 架構 啟動 使用 attribute 會話保持的三種方式 Session sticky會話綁定:通過在前端調度器的配置中實現統一session發送至同一後發端服務器 Session cluster會話集群:通過配置Tomcat保

Nginx+tomcat+memcached實現負載均衡及session共享

Nginx+tomcat+memcached 使用nginx作為前端伺服器來實現tomcat負載均衡及高可用,同時基於jsp的動態特徵,我們將引入memcache來保持網頁在連線過程中的session保持,利用memcached把多個tomcat的session集中管理 圖解: 說明:

NGINX如何反向代理Tomcat並且實現Session保持

簡介 LNMT=Linux+Nginx+MySQL+Tomcat; Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器; 在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP 程式的首選;   架構需求 Tom

Httpd+Tomcat+memcached實現session server

httpd+tomcat、memcached、session server何為會話保持會話保持是負載均衡最常見的問題之一,也是一個相對比較復雜的問題。會話保持有時候又叫做粘滯會話(Sticky Sessions)。會話保持是指在負載均衡器上的一種機制,可以識別客戶端與服務器之間交互過程的關連性,在作負載均衡的

Apache+Tomcat+Memcached實現會話保持

命令 cookie des 技術 說明 -s out 綁定 vol 會話保持的三種方式 Session sticky會話綁定:通過在前端調度器的配置中實現統一session發送至同一後發端服務器 Session cluster會話集群:通過配置Tomcat保持所有

Nginx+Tomcat+Redis實現session共享

linux nginx tomcat redis session 通過Nginx作為前端的負載,把請求分發到後端的Tomcat服務器上,提高並發數;但是單純的通過Nginx的ip_hash負載是很多問題的。只要用戶一切換網絡或者後端Tomcat主機宕機session就失效;架構圖:基本環境

nginx+tomcat8+memcached實現session共享

and /var/ port opp def location apps rate 自己 安裝nginx-1.13.8安裝jdk1.8.0_144安裝tomcat-8.5.24安裝memcached-1.4.15下載tomcat8連接memcached所需jar包官方參考資

nginx+tomcat+memcached構建session共享叢集

一、安裝配置tomcat 配置前說明: 系統為centos7 m1.xsllqs.com地址為192.168.1.107 c1.xsllqs.com地址為192.168.1.114 c2.xsllqs.com地址為192.168.1.113 安裝tomc

Nginx+Tomcat+Memcached叢集Session共享

cookie是怎樣工作的?  例如,我們建立了一個名字為login的Cookie來包含訪問者的資訊,建立Cookie時,伺服器端的Header如下面所示,這裡假設訪問者的註冊名是“Michael Jordan”,同時還對所建立的Cookie的屬性如path、domain、expires等進行了指定。  S

【整理】Nginx+Tomcat+Memcached實現伺服器叢集負載均衡

一. 準備工作1.1 建立使用者及工作目root使用者登入後執行 useradd csdn    -------建立使用者csdnpasswd  csdn    -------給已建立的使用者csdn設定密碼說明:新建立的使用者會在/home下建立一個使用者目錄csdn

Nginx反代至Tomcat基於memcachedsession保持

啟動 ase .cn time share 匹配 des bsp 目錄 實現功能:基於前面tomcat基礎簡介與示例文章 (1) tomcat cluster將會話保存至memcached中;實現模型: 這裏寫圖片描述 配置B,C主機安裝openjdk與tomcat[本次均

tomcat+nginx+memcached實現session共享

1.配置負載均衡可以參照“負載均衡+session共享\nginx-1.8.1\conf\nginx.conf”檔案,其中: upstream backend{  server 10.10.1.133:8080 ; server 10.10.123.228:8080 ;

nginx+tomcat+memcached方式實現session共享

參考資料:https://www.cnblogs.com/kevingrace/p/6398672.html 架構完成步驟 1.搭建基礎開發環境 2.安裝tomcat 3.安裝nginx 4.啟動tomcat,配置nginx輪詢,實現nginx反向代理的效果 5

Nginx+Tomcat+memcached負載均衡實現session共享

http://blog.csdn.net/bluejoe2000/article/details/24883967/ http://www.cnblogs.com/mouseIT/p/4176238.html

session共享機制(nginx+tomcat+memcached

jdk環境的配置、tomcat、session共享機制一、配置jdk環境java的編譯環境------server2和server3同時配置 jdk是JAVA的開發編譯環境是java語言的軟件開發工具包主要用於移動設備的嵌入式設備上的java應用程序 jdk的安裝基礎過程1將jdk的包解壓在指定路徑 使用-C

Nginx + Memcached 實現Session共享的負載均衡

new 解決 class read 庫存 sta 簡單 登錄 dma session共享   我們在做站點的試試,通常需要保存用戶的一些基本信息,比如登錄就會用到Session;當使用Nginx做負載均衡的時候,用戶瀏覽站點的時候會被分配到不同的服務器上,此時如果登錄後S

Tomcat集群使用Memcached實現Session共享

tomcatSession是什麽?用戶訪問服務器資源主要分成兩類,一類是無狀態訪問,例如請求一張圖片。另一類是有狀態訪問,這種情況下,服務器需要記錄追蹤用戶狀態,並根據用戶所處狀態做出不同響應,典型的例子是購物車。Session的作用就是在Web服務器上保持用戶的狀態信息。Tomcat集群為什麽需要Sessi

Nginx+Tomcat+memcached高可用會話保持

tomcat tomcat session保持 tomcat memcached高可用 一、概述 之前文章已經描述了企業高可用負載相關的架構及實現,其中常用的nginx或haproxy,LVS結合keepalived做前端高可用調度器;但之前沒有提到會話高可用保持;本文通過 Tomcat Sess

nginx+tomcat+memcached搭建負載均衡叢集實現交叉快取

tomcat tomcat簡介 Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP 程式的首選。對於一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 伺服器,可