首页 > 代码库 > nginx+tomcat+memcache

nginx+tomcat+memcache

nginx+tomcat+memcache

nginx支持静态页面tomcat支持动态页面如果所在的nginx服务器想要进行动态页面则需与tomcat结合此时nginx只是起到转发的作用对jsp的处理是由tomcat来处理的。

一 搭建jdk

先搭建java环境

1  tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/    ###解压到/usr/local下###

2 ln -s jdk1.7.0_79/ java            ###软链接方便版本升级后的使用###

3 vim /etc/profile            ###/etc/profile是全局定义所有用户可以用/.bash_profile是局部定义只有某个用户启动时才能加载###

内容

export JAVA_HOME=/usr/local/java        ###使用变量$JAVA_HOME如果路径改变了修改会比较方便###

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib    ###该环境变量是当我们再写java程序时要应用别人写好的类时要让java解释器知道到哪里去找这个类##        

export PATH=$PATH:$JAVA_HOME/bin            ###系统路径一定要先写不然系统的一些命令可能会找不到不过可以用绝对路径去执行系统和命令,设置好path对java应用程序鄂运行会比较方便比如javacjavajavah等等###

4 source /etc/profile            ###使文件生效###




测试是否搭建好

[root@server2 ~]#vim test.java

内容

public class test {
    public static void main(String[] arge){
        System.out.println("Hello World!");    


}
    }

[root@server3 ~]# javac test.java
[root@server3 ~]# java test
Hello World!

具体过程如下
[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server2 ~]# cd /usr/local/
[root@server2 local]# ls
bin  etc  games  include  jdk1.7.0_79  lib  lib64  libexec  sbin  share  src
[root@server2 local]# ln -s jdk1.7.0_79/ java
[root@server2 local]# ll
total 44
drwxr-xr-x. 2 root root 4096 Jun 28  2011 bin
drwxr-xr-x. 2 root root 4096 Jun 28  2011 etc
drwxr-xr-x. 2 root root 4096 Jun 28  2011 games
drwxr-xr-x. 2 root root 4096 Jun 28  2011 include
lrwxrwxrwx  1 root root   12 Jul 22 10:00 java -> jdk1.7.0_79/
drwxr-xr-x  8 uucp  143 4096 Apr 11  2015 jdk1.7.0_79
drwxr-xr-x. 2 root root 4096 Jun 28  2011 lib
drwxr-xr-x. 2 root root 4096 Jun 28  2011 lib64
drwxr-xr-x. 2 root root 4096 Jun 28  2011 libexec
drwxr-xr-x. 2 root root 4096 Jun 28  2011 sbin
drwxr-xr-x. 5 root root 4096 Jul 18 11:24 share
drwxr-xr-x. 2 root root 4096 Jun 28  2011 src
[root@server2 local]# vim /etc/profile
[root@server2 local]# source /etc/profile
[root@server2 local]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/java/bin
[root@server2 local]# cd
[root@server2 ~]# vim test.java
[root@server2 ~]# javac test.java
[root@server2 ~]# java test
Hello World!




二 搭建tomcat

安装包下载可以去http//tomcat.apache.org/下载
主要是进行动态页面的处理jsp
默认发布目录/usr/local/tomcat/webapps/ROOT
默认发布网页index.jsp

1 tar  zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/    ###解压到/usr/local/###

2 ln -s apache-tomcat-7.0.37/ tomcat             ###软链接方便版本升级###

3 /usr/local/tomcat/bin/startup.sh/            ###开启服务###

4 netstat -antlp            ###查看端口为8080


测试

[root@server1 ROOT]# pwd
/usr/local/tomcat/webapps/ROOT
[root@server1 ROOT]# vim test.jsp

内容

the time is:<%=new java.util.Date() %>

172.25.78.1:8080/test.jsp





三 将nginx和tomcat整合再一起


1 vim /usr/local/lnmp/nginx/conf/nginx.conf

内容

location  ~ \.jsp$ {
                proxy_pass http://172.25.38.2:8080;
        }


2 nginx -s reload

测试
访问172.25.38.1/test.jsp



####作负载均衡###

jsp的页面很消耗资源要做一个负载均衡

1 vim /usr/local/lnmp/nginx/conf/nginx.conf

内容
upstream  westos{
        server 172.25.38.2:8080;
        server 172.25.38.3:8080;
        server 127.0.0.1:8000 backup;
        }

location  ~ \.jsp$ {
                proxy_pass http://westos;
        }

2 nginx -s reload


####ip_hash###

再作负载均衡时不指定算法则默认是轮询会导致用户在提交请求时就会到另一个tomcat则就要再次提交请求原有的session就会丢失假如是一个购物车则用户加一个东西就会不见因此是不合理的就要用到ip_hash则只要是同一个ip发出的请求就不会跳到别的tomcat上

1 vim /usr/local/lnmp/nginx/conf/nginx.conf

内容:
upstream  westos{
        ip_hash;
        server 172.25.38.2:8080;
        server 172.25.38.3:8080;
        }

location  ~ \.jsp$ {
                proxy_pass http://westos;
        }


2 nginx -s reload

tomcat的发布页面

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 = http://www.mamicode.com/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 = http://www.mamicode.com/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>







####tomcat+memcache###

采用session对象存储特定用户会话所需的信息这样当用户在应用程序的web页之间跳转时存储在session对象中的变量将不会丢失而是在整个用户会话中一直存在下去
采用ip_hash虽然解决了用户请求可以保存再一个tomcat上但是如果该tomcat出现故障了就会导致session的丢失因此要再加一个额外的备份存储memcache使得tomcat故障了还能够去memcache拿到信息

Tomcat-1 (T1) 将 session 存储在 memcached-2 (T2)上。只有当 M2 不可用时,T1 才将session 存储在 memcached-1 上(M1 是 T1 failoverNode)。使用这种配置的好处是,当 T1 和 M1 同时崩溃时也不会丢失 session 会话,避免单点故障。
server2

1 yum  install  -y   memcached

2 将memcached-session-manager-tc7-1.6.3.jar等放在/usr/local/tomcat/lib

3 vim  /usr/local/tomcat/conf/context.xml

 <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.78.2:11211,n2:172.25.78.3:11211"
failoverNodes="n1"        ###当n2出现故障时找n1节点###
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

4 /usr/local/tomcat/bin/shutdown.sh    ###关闭tomcat如果没有开启tomcat则忽略这步###

5 /usr/local/tomcat/bin/startup.sh    ###开启tomcat###

6 tail -f /usr/local/tomcat/logs/catalina.out    ###监控日志信息查看是否出错###  





server3

1 yum  install  -y   memcached


2 将memcached-session-manager-tc7-1.6.3.jar等放在/usr/local/tomcat/lib

3 vim  /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.78.2:11211,n2:172.25.78.3:11211"
failoverNodes="n2"    ###当n1出现故障时找n2节点###
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

4 /usr/local/tomcat/bin/shutdown.sh    ###关闭tomcat如果没有开启tomcat则忽略这步###

5 /usr/local/tomcat/bin/startup.sh    ###开启tomcat###

6 tail -f /usr/local/tomcat/logs/catalina.out    ###监控日志信息查看是否出错###  



测试
访问172.25.78.1/test.jsp

tge contentType="text/html; charset=GBK" %> Server Info: 172.25.78.2 : 8080

ID 3281D8620D9C032D509F68999319E338-n2
Session listuser2 = 123
user1 = 123
user5 = 789
name:
key:
he time is:Mon Jul 24 03:46:41 CST 2017


[root@server3 tomcat]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is ‘^]‘.
 get 3281D8620D9C032D509F68999319E338-n2
VALUE 3281D8620D9C032D509F68999319E338-n2 2048 125
W]p~j]p01]p]p#3281D8620D9C032D509F68999319E338-n2user2123user1123user5789
END

###如果将server2的tomcat关闭####

仍然访问172.25.78.1/test.jsp会发现原有的session并没有丢失这是因为保存在了缓存里
tge contentType="text/html; charset=GBK" %> Server Info: 172.25.78.3 : 8080

ID 3281D8620D9C032D509F68999319E338-n2
Session listuser2 = 123
user1 = 123
user4 = 345
user5 = 789
name:
key:
he time is:Mon Jul 24 03:52:52 CST 2017

get  3281D8620D9C032D509F68999319E338-n2
VALUE 3281D8620D9C032D509F68999319E338-n2 2048 137
W]p~j]qt01]qt]qt#3281D8620D9C032D509F68999319E338-n2user2123user1123user4345user5789
END





####nginx算法sticky####

客户端的请求---> cdn ----> nginx ---> server 时如果nginx负载均衡的算法使用ip_hash那么经过cdn后nginx得到的ip均变成了cdn的ip那么所有经过cdn的客户请求均会到同一个后端服务器这样就导致只有一个后端服务器相应请求是不合理的但使用stick算法那么是根据cookie来进行负载均衡cookie是服务器分给浏览器的因此浏览器的cookie是不同的服务器就可以根据cookie来进行处理

原来编译的nginx1.12没有sticky模块而现有的模块nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz与1.12版本不匹配所以重新编译1.10版本的nginx

1 tar  zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz

2 ./configure --prefix=/opt/nginx/  --user=nginx --group=nginx  --with-http_stub_status_module --with-http_ssl_module --with-threads --with-file-aio --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d

3 make  &&  make    install

4 vim   /opt/nginx/cong/ngin.conf


 upstream westos  {
                sticky;
                server 172.25.38.2:8080;
                server 172.25.38.3:8080;

        }


location ~ \.jsp$ {
                proxy_pass http://westos;
        }


5 /opt/nginx/sbin/nginx  -s  reload

nginx+tomcat+memcache