nginx+tomcat+memcached

######### nginx+tomcat+memcache ############

實驗環境
rhel6.5
3臺主機iptables防火牆關閉

實驗主機
172.25.8.2    nginx
172.25.8.3    tomcat memcached
172.25.8.4    tomcat memcached

實驗原理
nginx在前端接受客戶端請求進行負載均衡
Tomcat-1(T1)將session存儲在memcached-2(T2)上。只有當M2不可用時,T1纔將session存儲在memcached-1上(M1是T1的failoverNode故障轉移點)。使用這種配置的好處是,當T1 和M1同時崩潰時也不會丟失 session 會話,避免單點故障。

###########安裝tomcat###########
在172.25.8.3和172.25.8.4主機上進行安裝

1.安裝包
apache-tomcat-7.0.37.tar.gz    ##tomcat安裝包
jdk-7u79-linux-x64.tar.gz    ##jdk是java語言的軟件開發工具包

2.安裝過程
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
mv /usr/local/apache-tomcat-7.0.8 /usr/local/tomcat
tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
mv /usr/local/jdk1.7.0_79 /usr/local/jdk

3.配置環境變量
vim /etc/profile  ##在文件末尾添加下列參數。用於設置環境變量必須指定否則tomcat無法啓動
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin

source /etc/profile    ##刷新

echo $JAVA_HOME ;echo $PATH  ##查看環境變量是否生效
java -version    ##命令檢查java版本

4.測試
 /usr/local/tomcat/bin/startup.sh     ##啓動腳本。關閉的腳本是此目錄下shutdown.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

5.瀏覽器訪問http://172.25.8.3:8080可以看到貓網頁

6.直接同步到172.25.8.4主機,完成tomcat的安裝
1)scp -r /usr/local/jdk /usr/local/tomcat/  [email protected]:/usr/local
##將172.25.8.3的jdk和tomcat目錄直接發送到172.25.8.4主機
2)scp /etc/profile [email protected]:/etc/profile    ##同步環境變量
  souce /etc/profile
3)/usr/local/tomcat/bin/startup.sh    ##啓動腳本


######## memcached ###########
在172.25.8.3和172.25.8.4主機上進行安裝

1.安裝並開啓
yum install memcached -y
/etc/init.d/memcached star    ##開啓memcached


######### session的序列化方案設置############
在172.25.8.3和172.25.8.4主機

1.關閉tomcat
/usr/local/tomcat/bin/shundown.sh

2.把如下軟件包放置到/usr/local/tomcat/lib 目錄中
kryo-1.04.jar                                  
kryo-serializers-0.10.jar                         
memcached-session-manager-1.6.3.jar             
memcached-session-manager-tc7-1.6.3.jar   
msm-kryo-serializer-1.6.3.jar             
reflectasm-1.01.jar                       
minlog-1.2.jar
spymemcached-2.7.3.jar

2.編輯context.xml    ##用於T1-m2,T2-m1之間可以緩存
vim /usr/local/tomcat/conf/context.xml
<Context>
......
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:172.25.8.3:11211,m2:172.25.8.4:11211"
failoverNodes="m1"    #在 node2 上此項設置爲“m2”
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>

3.session的序列化方案介紹官方推薦的有4種
1). java serialization
2). msm-kryo-serializer
3). msm-javolution-serializer
4). msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,這次實驗採用 kryo 方式。


############# nginx安裝 ######################
在172.25.8.2主機上安裝nginx

1.安裝包
nginx-1.10.1.tar.gz
nginx-sticky-module-1.0.tar.gz

2.安裝過程
1)yum install -y pcre-devel openssl-devel gcc

tar zxf nginx-1.10.1.tar.gz
tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz -C nginx-1.10.1    
##nginx-sticky-module爲nginx的第三方模塊,使 nginx 支持sticky模式,所謂sticky模式就是指同一個用戶的訪問請求都被髮送到同一個tomcat實例上處理。

useradd -s /sbin/nologin nginx

cd nginx-1.10.1
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d/  ##./configure過程缺什麼補什麼

make;make install

/usr/local/nginx/sbin/nginx    ##開啓ngixn
瀏覽器訪問http//172.25.8.2    ##測試nginx安裝是否成功
/usr/local/nginx/sbin/nginx -s stop  ##關閉nginx

vim  /usr/local/nginx/conf/nginx.conf    ##編輯nginx配置文件
http {
        upstream www.example.com {    ##設置負載均衡模塊
         sticky;            ##sticky模式
         server 172.25.8.3:8080;    
         server 172.25.8.4:8080;
        }
      server {                ##在server段添加location段    
    location ~ \.jsp$ {        ##所有jsp頁面交給 tomcat 處理,動靜分離
          proxy_pass http://www.example.com;
        }


######測試 tomacat+memcache 效果######
在172.25.8.3和172.25.8.4主機上

1.##編輯測試網頁
vim /usr/local/tomcat/webapps/ROOT/test.jsp    
測試網頁代碼
<%@ 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>

2.瀏覽器訪問172.25.8.3:8080/test.jsp和172.25.8.38080/test.jsp可以看到
Server Info: 172.25.8.3 : 8080        ##對應主機
ID BEF1A4C679665595EA5180210933026F-m2    ##memcached的存儲位置,T1緩存到m2
Session list 123 = 321        ##已經傳的內容
name                ##要上傳的name
key                ##要上傳的keynamekey隨意編輯
Submit Query            ##上傳按鍵        

3.效果查看
1)在172.25.8.3主機上查看Tomcat默認生成的日誌文件catalina.out
tail -n5 /usr/local/tomcat/logs/catalina.out
返回內容123 = 321    ##172.25.8.3本地儲存上傳過的123=321記錄

2)在172.25.8.4主機上查看由T1-m2的緩存記錄
telnet localhost 11211    ##11211是memcached默認端口連接查看本地的緩存記錄
get BEF1A4C679665595EA5180210933026F-m2    ##get命令在telnet進入之後使用B..F-m1是剛瀏覽器中顯示的ID
返回內容..省略..123321    ##m2中有緩存記錄
quit    ##quit命令退出

telnet 172.25.8.4 11211    ##telnet IP 11211也可以進行查看

3)正常模式下T1緩存到m2T2緩存到m1

當m2被關閉之後在瀏覽器訪問會看到已經切換到m1

##########測試nginx負載均衡的效果############
vim /etc.hosts    ##在哪個機子測試就編輯/etc.hosts
 172.25.8.2 www.example.com
【注意關閉防火強】


小結訪問 http://www.example.com/test.jsp
1)不同的主機訪問時會調度到不同的tomcat實例上處理
2)來自同一主機的請求會交給同一個tomcat實例處理
3)若down掉當前正在響應的tomcat實例,nginx會自動把用戶的請求調度到另一個tomcat 實例上,同時session也沒有丟掉。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章