nginx+tomcat+memcached

                                                   nginx+tomcat+memcached

系統環境:rhel6 x64 selinux and iptables disabled

主機角色:

server1: 192.168.122.11 : nginx  

server2: 192.168.122.12 : tomcat   memcached

server3: 192.168.122.13 : tomcat   memcached


Tomcat-1 (T1) 將 session 存儲在 memcached-2 (T2)上。只有當 M2 不可用時,T1 纔將 session 存儲在 memcached-1 上(M1 是 T1 failoverNode)。使用這種配置的好處是,當 T1 和 M1 同時崩潰時也不會丟失 session 會話,避免單點故障。

Screenshot from 2018-07-09 19-24-48.png

一、tomcat 安裝


首先配置java環境

[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/    -C指定解壓路徑

[root@server2 local]# cd /usr/local/
[root@server2 local]# ln -s jdk1.7.0_79/ java     做連接


[root@server2 local]# vim /etc/profile       修改全局變量

export JAVA_HOME=/usr/local/java

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$PATH:$JAVA_HOME/bin


[root@server2 local]# source /etc/profile       使之生效


測試java環境


[root@server2 ~]# vim test.java     寫測試腳本

public class test {

        public static void main(String[] args)

        {

                System.out.println("Hello World");

        }

}


[root@server2 ~]# javac test.java         編譯
[root@server2 ~]# java test      
Hello World
至此,server2java 環境搭建完畢,server3同理


部署tomcat

[root@server2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server2 local]# cd /usr/local/

[root@server2 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server2 tomcat]# cd /usr/local/tomcat
[root@server2 tomcat]# bin/startup.sh       開啓tomcat,端口默認爲8080

[root@server2 tomcat]# netstat -antlp

Screenshot from 2018-07-09 20-05-51.png


Screenshot from 2018-07-09 20-06-40.png



[root@server2 tomcat]# cd webapps/ROOT/
[root@server2 ROOT]# vim test.jsp
[root@server2 ROOT]# cat test.jsp
The time is: <%=new java.util.Date() %>

server3同上


二、安裝nginx

[root@server1 ~]# tar zxf nginx-1.10.1.tar.gz
[root@server1 ~]# tar zxf nginx-sticky-module-ng.tar.gz 

注: nginx-sticky-module 爲 nginx 的第三方模塊,使 nginx 支持 sticky 模式,所謂 sticky 模式就是指同一個用戶的訪問請求都被髮送到同一個 tomcat 實例上處理。

[root@server1 ~]# cd nginx-1.10.1
[root@server1 nginx-1.10.1]# vim auto/cc/gcc

#CFLAGS="$CFLAGS -g"        註釋掉

Screenshot from 2018-07-09 20-22-36.png

[root@server1 nginx-1.10.1]# yum install gcc pcre-devel openssl-devel -y     安裝依賴

[root@server1 nginx-1.10.1]# ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-threads --user=nginx --group=nginx  --add-module=/root/nginx-sticky-module-ng       安裝相關模塊

[root@server1 nginx-1.10.1]# make && make install      編譯安裝

[root@server1 ~]# ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/sbin/
[root@server1 ~]# useradd -s /sbin/nologin nginx     創建nginx用戶

[root@server1 sbin]# cd  /usr/sbin

[root@server1 sbin]# nginx     開啓nginx

Screenshot from 2018-07-09 20-35-55.png


Screenshot from 2018-07-09 20-36-40.png


在nginx上部署tomcat負載均衡

修改位置文件

[root@server1 conf]# pwd
/usr/local/lnmp/nginx/conf

[root@server1 conf]# vim nginx.conf

 17 http {
 18         upstream tomcat {           #負載均衡模塊
 19         sticky;
 20         server 192.168.122.12:8080;     #後端tomcat
 21         server 192.168.122.13:8080;
 22         }
 23
 24     include       mime.types;
 25     default_type  application/octet-stream;

 68         location ~ \.jsp$ {         #所有jsp頁面交給tomcat處理,動靜分離
 69                 proxy_pass   http://tomcat;
 70         }


[root@server1 logs]# nginx -t      可用來檢測語法是否有誤

[root@server1 logs]# nginx -s reload
nginx: [error] invalid PID number "" in "/usr/local/lnmp/nginx/logs/nginx.pid"


出錯,上網查找解決辦法,得如下:
[root@server1 logs]# nginx -c /usr/local/lnmp/nginx/conf/nginx.conf
[root@server1 logs]# nginx -s reload      好了,沒有報錯


把server2,server3上的測試面稍加修改,實驗效果明顯

測試:

Screenshot from 2018-07-09 21-55-49.png


配置session

server2,3上


session 的序列化方案官方推薦的有 4 種:
1. java serialization
2. msm-kryo-serializer
3. msm-javolution-serializer
4. msm-xstream-serializer
其中性能最好的序列化方案是 Kryo,此實驗我們採用 kryo 方式。
把如下軟件包放置到/usr/local/tomcat/lib 目錄中
kryo-1.03.jar
kryo-serializers-0.8.jar
memcached-2.5.jar
memcached-session-manager-1.5.1.jarmemcached-session-manager-tc7-1.5.1.jar
minlog-1.2.jar
msm-kryo-serializer-1.5.1.jar
reflectasm-0.9.jar

Screenshot from 2018-07-09 22-11-00.png

[root@server2 memsoft]# mv * /usr/local/tomcat/lib/

[root@server2 conf]# pwd
/usr/local/tomcat/conf


[root@server2 conf]# vim context.xml

<?xml version='1.0' encoding='utf-8'?>
<Context>

<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.122.12:11211,n2:192.168.122.13:11211"     

failoverNodes="n1"     在 node2(server3) 上此項設置爲“n2   (壞了找自己)

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>


[root@server2 conf]# yum install -y memcached      安裝
[root@server2 conf]# /etc/init.d/memcached start
[root@server2 conf]# 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);
}
%>

server3相同配置


三、測試


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

注意:測試前必須注意啓動順序 tomcat>memcached>nginx


瀏覽器訪問時:

http://192.168.122.11/test.jsp

Screenshot from 2018-07-09 22-45-16.png

此時你 down 掉當前正在響應的 tomcat 實例

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

nginx 會自動把用戶的請求調度到另一個 tomcat 實例上,同時 session 也沒有丟掉。

你也可以在終端通過查看日誌的方式查看到session信息

[root@server2 ~]#tail  -f  /usr/local/tomcat/log/catalina.out

 


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