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

原文:http://blog.csdn.net/zht666/article/details/38515147css

如下內容是參考原文修改後的html

測試環境linux  centOS 6java

在一臺真實windows機上裝了兩臺虛擬機node

192.168.1.249  linux

192.468.1.248nginx

每臺虛擬機都裝了2個tomcatc++

由於nginx已是安裝好的了,因此沒有按照原博客安裝,沒有驗證是否正確。web

 tomcat也是安裝好的,我在每一臺服務器上都安裝了2個tomcat,第二個tomcat是複製的第一個tomcat,windows

編輯環境變量:vi /etc/profile瀏覽器

加入如下代碼
##########first tomcat###########
CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
TOMCAT_HOME=/usr/local/tomcat
export CATALINA_BASE CATALINA_HOME TOMCAT_HOME
##########first tomcat############
##########second tomcat##########
CATALINA_2_BASE=/usr/local/tomcat_2
CATALINA_2_HOME=/usr/local/tomcat_2
TOMCAT_2_HOME=/usr/local/tomcat_2
export CATALINA_2_BASE CATALINA_2_HOME TOMCAT_2_HOME
##########second tomcat##########
保存退出。
再輸入:source /etc/profile
才能生效。

而後再修改第二個tomcat的server.xml中的端口號,要與第一個tomcat的端口號不能同樣,否則端口衝突起不來服務。

最後再修改tomcat/bin/catalina.sh找到下面粉紅字,

 # OS specific support.  $var _must_ be set to either true or false.

在下面增長以下代碼

export CATALINA_BASE=$CATALINA_2_BASE
export CATALINA_HOME=$CATALINA_2_HOME

能夠參考http://www.cnblogs.com/shihaiming/p/5896283.html

 

1.安裝Nginx

Nginx官網:http://nginx.org/

下載最新穩定版本。在安裝Nginx以前,須要先安裝gcc、 openssl、 pcre和zlib軟件庫。

 

1.1安裝gcc、gcc-c++

安裝命令:

#sudo yum install gcc

# sudo yum install gcc-c++

 

1.2安裝openssl

openssl官網:http://www.openssl.org/

安裝版本:openssl-1.0.1i.tar.gz

安裝命令:

#tar -zxvf openssl-1.0.1i.tar.gz

#cd openssl-1.0.1i

#sudo ./config --prefix=/usr/local/openssl-1.0.1i    #prefix指定安裝目錄

#sudo make

#sudo make install

【注意】:此處使用的是config命令,而不是日常的configure命令

安裝完成後,到/usr/local/下查看是否安裝成功。若是安裝出錯,須要從新加壓縮,從新安裝。

 

1.3安裝pcre

pcre官網:http://www.pcre.org/

安裝版本:pcre-8.35.tar.gz

安裝命令:

#tar -zxvf pcre-8.35.tar.gz

#cd pcre-8.35

#sudo ./configure --prefix=/usr/local/pcre-8.35    #prefix指定安裝目錄

#sudo make

#sudo make install

安裝完成後,到/usr/local/下查看是否安裝成功。若是安裝出錯,須要從新加壓縮,從新安裝。

【注意】:若是沒有安裝c++編譯器,這個軟件的安裝會報錯!

 

1.4安裝zlib

zlib官網:http://www.zlib.net/

安裝版本:zlib-1.2.8.tar.gz

安裝命令:

#tar -zxvf zlib-1.2.8.tar.gz

#cd zlib-1.2.8

#sudo ./configure --prefix=/usr/local/zlib-1.2.8    #prefix指定安裝目錄

#sudo make

#sudo make install

安裝完成後,到/usr/local/下查看是否安裝成功。若是安裝出錯,須要從新加壓縮,從新安裝。

 

1.5安裝Nginx

安裝版本:nginx-1.6.1.tar.gz

安裝命令:

#tar -zxvf nginx-1.6.1.tar.gz

#cd nginx-1.6.1

#sudo ./configure

--prefix=/usr/local/nginx-1.6.1                #prefix指定安裝目錄

--with-openssl=/home/zht/src/openssl-1.0.1i    #指的是openssl源碼路徑

--with-pcre=/home/zht/src/pcre-8.3.5          #指的是pcre的源碼路徑

--with-zlib=/home/zht/src/zlib-1.2.8           #指的是zlib 的源碼路徑

--with-http_ssl_module

#sudo make

#make install

安裝完成後,到/usr/local/下查看是否安裝成功。若是安裝出錯,須要從新加壓縮,從新安裝。

 

1.5.1 配置Nginx

配置文件目錄:/usr/local/nginx-1.6.1/conf/nginx.conf

 cd /usr/local/nginx-1.6.1/conf

 vi nginx.conf

修改後的配置文件以下:

在#gzip on;後面加入upstream

 

 

#gzip on;

upstream tomcat {
# ip_hash;
server 192.168.1.249:8080 weight=1;
server 127.0.0.1:8082 weight=1;
server 192.168.1.248:8081 weight=1;
server 192.168.1.248:8083 weight=1;
}

 

server {
listen 8088;
server_name localhost;

location / {

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
root /usr/share/nginx/html;
index index.html index.htm ;
proxy_pass http://tomcat;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_send_timeout 10;
}

}

 

此處nginx配置的listen堅挺端口是8088,那麼等配置好後訪問nginx就是192.168.1.249:8088,這樣就會顯示nginx歡迎頁

在與tomcat集羣配好後在訪問192.168.1.249:8088,會顯示tomcat的首頁,

要是測試集羣是否正常,在每一個tomcat的webapps目錄下建個test目錄,將測試用的index.jsp放在此目錄下便可,此時訪問http://192.168.1.249:8088/test/

就會顯示index.jsp內容。以上說的192.167.1.249是我nginx安裝目錄所在,本身測試時要根據本身實際的nginx所在服務器的ip來訪問。

效果以下圖:

 

 

 

訪問測試用tomcat的webapps目錄下的test/index.jsp的頁面

 

upstream tomcat{ # 負載均衡站點的名稱爲tomcat,能夠本身取
# ip_hash; # 可選,根據來源IP方式選擇web服務器,省略的話按默認的輪循方式選擇web服務器
server 127.0.0.1:8080 weight=1; # web服務器的IP地址及tomcat發佈端口,  #weigth參數表示權值,權值越高被分配到的概率越大
server 127.0.0.1:8082 weight=1;

server 192.168.1.248:8081 weight=1;

server 192.168.1.248:8083 weight=1;

}

 說明:紅色字體的tomcat這個名稱隨便命名,但在location中proxy_pass ,http://後面的名稱要一致

  weigth參數表示權值,權值越高被分配到的概率越大

 

location 中加入有下劃線的代碼

location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://tomcat; # 負載均衡指向的發佈服務tomcat
proxy_redirect default;
proxy_connect_timeout 10; #跟代理服務器鏈接的超時時間,必須留意這個time out時間不能超過75秒,當一臺服務器當掉時,過10秒轉發到另一臺服務器。
}

 

proxy_pass http://tomcat;  #是必需要加的

proxy_connect_timeout  10;   #這個參數是鏈接的超時時間。 我設置成10,表示是10秒後超時會鏈接到另一臺服務器

#其餘參數本身選吧。

 

 

 

2. Memcache安裝

Memcached官網:http://memcached.org/

安裝memcached須要先安裝libevent,libevent官網:http://libevent.org/

本次安裝版本:

memcached-1.4.31.tar.gz

libevent-2.0.22-stable.tar.gz

2.1安裝livevent

查看是否已安裝:# rpm qa | grep libevent

若是已安裝且版本低於1.3,則先經過:

# rpm -e libevent --nodeps 進行卸載。

 

# tar zxvf libevent-2.0.22-stable.tar.gz

# cd libevent-2.0.22-stable

# sudo ./configure --prefix=/usr/local/libevent-2.0.22-stable      #prefix指定安裝路徑

# sudo make

# sudo make install

 

安裝完成後,到prefix指定的目錄下,看看是否存在libevent-2.0.22-stable目錄,以下圖所示。

圖片中版本是2.0.21,由於重命名弄錯了,實際版本仍是2.0.22

 

 

 

2.2安裝Memcached

# tar zxvf memcached-1.4.31.tar.gz

# cd memcached-1.4.31

sudo ./configure --prefix=/usr/local/memcached-1.4.31 --with-libevent=/usr/local/libevent-2.0.22-stable

# sudo make

# sudo make install

 

2.2.1檢查看裝狀況

安裝完成後,到prefix指定的目錄下查看是否有memcached-1.4.31目錄,以下圖所示。

 

 

2.2.2查看memcached和libevent版本信息

首先定位到Memcached的bin目錄下:

# cd /usr/local/memcached-1.4.31/bin

執行命令:

# sudo ./memcached -i

 

2.2.3啓動memcached

# sudo ./memcached -d -v -p 12000 -m 512 -u root

解釋:-d表示以守護進程方式運行memcached;-v表示輸出浸膏和錯誤信息;-p指定監聽的端口號;-m指定能使用的最大內存,單位MB;-u指定運行memcached的帳戶。

紅色的12000這個參數很是重要,在tomcat的context.xml中配置memcache時memcachedNodes必需要與其一致,否則啓動tomcat時報錯,拒絕連接

若是在同一臺服務器上安裝多個memcached時,此數字不能同樣,這個數字自有定義,只要沒被佔用。

Memcache

使用# ps -ef | grep memcached查看進程。

 

 

3. tomcat配置Memcache

到tomcat的安裝目錄lib中,加入:須要的jar包

 

每一個tomcat的lib下都要加入這些jar

Tomcat六、Tomcat七、Tomcat8使用不一樣msm支持包:memcached-session-manager-tc6-1.6.5.jar、memcached-session-manager-tc7-1.6.5.jar、memcached-session-manager-tc8-2.0.0.jar,

只可選一,安裝tomcat的版本下載該jar,不然啓動報錯。

 

配置tomcat. 在tomcat安裝目錄下的context.xml文件中加入:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:12000"
sticky="false"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

說明:紅色字體n1表示memcached服務器節點的名稱,12000表示該節點的端口號,此端口號與啓動memcached時的端口號要一致

 

有人說:也可在server.xml配置文件的<Host>...<Host>中添加配置

<Context docBase="webapps" path="" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:12000"
sticky="false"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
</Context>

這個我沒試

 

【參數說明】:

docBase:與<Host>中的appBase一致,網站部署目錄。

memcachedNodes:memcached服務器信息,此屬性是必須的。這個屬性必須包含你全部運行的memcached節點。每一個節點的定義格式爲<id>:<host>:<port>,多個服務器之間用空格或半角逗號隔開,如:

n1:127.0.0.1:12001 n2:127.0.0.1:12002  n3:127.0.0.1:12003

若是你設置單個memcache節點<id>是可選的,因此它容許設置爲<host>:<port>,如:memcachedNodes="localhost:11211"

 

打開server.xml文件,在<Engine>節點的中添加jvmRoute="jvm1",這個是用於指定Tomcat集羣的路由。Tomcat2設置成jvmRoute="jvm2",Tomcat3設置成jvmRoute="jvm3",依次類推。

注意: sticky模式時,要配置jvmroute參數,每臺tomcat的jvmroute參數都不能同樣

在tomcat目錄的/conf/server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">

4. 測試Session共享

測試JSP代碼以下:index.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Tomcat+memcached共享session測試</title>
</head>
<body>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>

這裏是服務器192.168.1.249  

<BR>

 tomcat端口是8080

</body>
</html>

上面的紅色字體根據實際的tomcat服務配置來寫,方便看是否集羣且session共享成功。

下面是我測試的效果:

千萬要記住:瀏覽器輸的地址是nginx服務的地址,不是某一個tomcat的地址,由於是nginx來作的負載均衡,由nginx來分配具體訪問哪一個服務。

要在每個tomcat中webapps下新建一個test目錄,把index.jsp放進去。

 

 

由圖能夠看到,三個Tomcat的SessionID都是同樣的:BBE70447F8121E0A011CB3879FBF17A7-n1.jvm1 ,

-n1是memcached服務器的節點名稱,jvm1 是我在其中一個tomcat的server.xml中<Engine>節點的中添加jvmRoute="jvm1 ",這個是用於指定Tomcat集羣的路由,能夠不寫,寫的話就會在sessionid裏顯示。

只要不關閉瀏覽器,無論怎麼刷新,SessionID都是不變了。由此能夠,三個Tomcat經過memcached實現了Session信息共享。

相關文章
相關標籤/搜索