Nginx+Memcached+Tomcat session會話共享實戰


服務器說明:

192.168.1.8 tomcat1 memcached(虛擬機1)

192.168.1.9 tomcat2(虛擬機2)

192.168.1.200 nginx (本機)


對於tomcat+nginx的配置請參考博客:【Nginx-反向代理服務器】實踐篇(三)之Tomcat+Nginx搭建集群


接下來我們來安裝memcached,注意linux系統的用戶權限問題


1.分別把memcached和libevent下載回來,放到/usr/src目錄下:

         # cd /usr/src
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz




2.先安裝libevent:

         # tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install


3.測試libevent是否安裝成功:

          # ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3

4.安裝memcached,同時需要安裝中指定libevent的安裝位置:

         # cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中間出現報錯,請仔細檢查錯誤信息,按照錯誤信息來配置或者增加相應的庫或者路徑。
安裝完成后會把memcached放到 /usr/local/bin/memcached 


5.測試是否成功安裝memcached:

        # ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug




6.啟動memcache


       useradd   memcache   #添加memcache用戶

        memcached -m 64 -d -u memcache -p 11211 -l 192.168.1.8 -c 5000 -P /tmp/memcached.pid

  或者 memcached -m 64 -d -u root -p 11211 -l 192.168.1.8 -c 5000 -P /tmp/memcached.pid




注:再次啟動時報了一個端口已占用,則kill掉memcache進程,然后二次啟動時才成功。





tomcat還需要額外配置如下:


tomcat 連接memcache session會話共享配置:session存儲到192.168.1.8:11211 memcache里面。


vi  /usr/local/tomcat/conf/context.xml #將下面配置復制到<Context> 和 </Context>之間

兩台主機做同樣的配置

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"        memcachedNodes="node1:192.168.1.8:11211"
requestUriIgnorePattern=".*/.(png|gif|jpg|css|js)$"
sticky="false"
storageKeyPrefix="context"
lockingMode="uriPattern:/path1|/path2"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>



說明:


這里的memcachedNodes是填寫memcached節點,多個節點時可以以空隔分開,如: 
 n1:localhost:11211 n2:localhost:11212     /localhost改為安裝memcached的服務器的IP
sessionBackupTimeout的單位為分鍾


當然配置完成后需要添加相應的jar包,將如下jar包分別放在兩台tomcat的lib目錄下即可。




修改后重啟兩個TOMCAT和nginx即可,這個時候已經解決SESSION的共享問題

啟動tomcat,並打印log,及時查看問題






測試Nginx和Tomcat


  測試Nginx是否實現負載均衡已經Tomcat能否共享session信息,分別在兩個Tomcat服務器的\webapps\ROOT目錄下新建兩個test.jsp頁面,內容如下:


Tomcat1

<%@ 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 1111111"); %> 

Tomcat2

<%@ 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 2222222"); %>


通過瀏覽器訪問Nginx服務器,如下圖將訪問地址改成Nginx所在服務器。

反復刷新瀏覽器,如果SessionID一直不變,下面的SessionPort的內容在不斷變化則說明配置成功。


測試結果如下:



刷新瀏覽器



再打開火狐瀏覽器看結果




刷新火狐瀏覽器