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 種
java serialization
msm-kryo-serializer
msm-javolution-serializer
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基於memcached的session保持
啟動 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 伺服器,可