天天看點

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

二 搭建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的頁面很消耗資源要做一個負載均衡

upstream  westos{

        server 172.25.38.2:8080;

        server 172.25.38.3:8080;

        server 127.0.0.1:8000 backup;

                proxy_pass http://westos;

####ip_hash###

再作負載均衡時不指定算法則預設是輪詢會導緻使用者在送出請求時就會到另一個tomcat則就要再次送出請求原有的session就會丢失假如是一個購物車則使用者加一個東西就會不見是以是不合理的就要用到ip_hash則隻要是同一個ip發出的請求就不會跳到别的tomcat上

内容:

        ip_hash;

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 = 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">

<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

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

failoverNodes="n2"    ###當n1出現故障時找n2節點###

通路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

user4 = 345

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

####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$ {

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

本文轉自blueclo51CTO部落格,原文連結:http://blog.51cto.com/12774272/1950249 ,如需轉載請自行聯系原作者