nginx+tomcat+memcached配置+指令碼

來源:互聯網
上載者:User
研究了下nginx+tomcat+memcached 的配置,練習了下指令碼的書寫,參考了好幾篇文章,在此記錄一下,有不對的地方敬請指正。

系統內容:
RHEL6.5 x64
iptables -F & selinux is disabled

主機角色:
node1 :192.168.122.101 :nginx tomcat memcached
node2 :192.168.122.102 :tomcat memcached

https://code.google.com/memcached-session-manager
memcached的session管理

nginx做反向 Proxy兩台tomcat,用memcached同步session,防止資料丟失

Tomcat1將session儲存在memcacted2上.tomcat和Memcached使用交叉儲存,只有當M2不可用時T1才將資料存放區在M1上(M1是T1的failoverNode),使用這種方式可以避免單點故障.從而實現應用的高可用性.

注意:兩台node上的tomcat應完全一致

1.在兩台node主機上配置tomcat環境

#./jdk-6u32-linux-x64.bin# mv jdk1.6.0_32/ /usr/local/lnmp/jdk#vim /etc/profile              編寫環境變數export JAVA_HOME=/usr/local/lnmp/jdkexport CLASSPATH=:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$PATH:$JAVA_HOME/bin#source /etc/profile測試java能否正常工作#vim test.javapublicclasstest{publicstaticvoid main(String[] args){System.out.println("Hello!");  }}#javac test.java          編譯#java test               執行後出現Hello!說明java環境配置好

安裝tomcat伺服器

#tar zxf apache-tomcat-7.0.37.tar.gz      解壓就能用,不需要編譯#mv apache-tomcat-7.0.37 tomcat#/TOMCAT_ROOT_DIR/tomcat/webapps/ROOT                tomcat的預設發布目錄#/TOMCAT_ROOT_DIR/tomcat/bin/startup.sh(shutdown.sh)    tomcat預設的啟動和關閉指令碼

tomcat預設開啟8080連接埠,

測試http://192.168.122.101:8080 訪問到tomcat預設的測試頁

#cd tomcat/webapps/ROOT#cat test.jsp           #測試頁this time is: <%=new java.util.Date()%>

測試訪問;http://192.168.122.101:8080 顯示目前時間

tomcat訪問8080連接埠,使用nginx反向 Proxy。

使用nginx發布jsp動態網頁:

nginx設定檔:

cat /usr/local/nginx/conf/nginx.conf

#user  nginx nginx;worker_processes  4;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {    use epoll;    worker_connections  1024;}http {    upstream tomcat {  #兩台tomcat負載平衡    sticky;               #session同步,為nginx的模組server192.168.0.1:8080;        server192.168.0.2:8080;    }    include       mime.types;    default_type  application/octet-stream;    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#access_log  logs/access.log  main;    sendfile        on;    #tcp_nopush     on;#keepalive_timeout  0;    keepalive_timeout  65;    #gzip  on;server {        listen       80;        server_name  localhost;        #charset koi8-r;#access_log  logs/host.access.log  main;        location / {            root   html;            proxy_pass   http://tomcat;indexindex.html index.htm;        }        #error_page  404              /404.html;# redirect server error pages to the static page /50x.html        error_page   500502503504  /50x.html;        location = /50x.html {            root   html;        }        location ~ \.jsp$ {            proxy_pass   http://tomcat;        }}nginx -t && nginx -s reload

訪問:http://192.168.122.101/test.jsp 測試

同步兩台tomcat的內容,並且修改java環境變數/etc/profile

測試:http://192.168.122.102:8080/test.jsp

兩台node(tomcat)準備好了

2、在node1上的nginx環境中發布網頁

使用nginx的負載平衡功能,

體現在nginx.conf中:

upstream tomcat-lb {  server192.168.122.101:8080;  server192.168.122.102:8080;}location~ \.jsp$ {  proxy_passhttp://tomcat-lb;}nginx -t && nginx -s reload

測試:http://192.168.122.101/test.jsp
實現兩台主機的負載平衡(訪問nginx所在的node)

問題:在後台實現了nginx的負載平衡,但是當一個使用者重新整理資料時,資料總是變化的,試想,在動態網頁面,如果使用者提交資料重新整理後並沒有提交到伺服器上,並且必須要重新填寫表格,這樣會造成糟糕的使用者體驗。

解決:給nginx增加一個sticky模組.(需要重新編譯nginx)

重新在nginx在進行模組化編譯:

nginx-sticky-modules.tar.gz(解壓就行)

#tar zxf nginx-sticky-modules.tar.gz -C /root/nginx-1.4.2#cd nginx-1.4.2/#make clean#./configure --prefix=/usr/local/nginx --add-module=$NGINX_PKG_DIR/$DIR/nginx-sticky-module-1.0 --with-http_ssl_module --with-http_stub_status_module#make && make install#vim nginx.confupstream linux {  sticky;   #裝了nginx-sticky後的功能  server 192.168.122.101:8080 ;  server 192.168.122.102:8080 ;}

測試:http://192.168.122.101/test.jsp 後發現重新整理不會來回負載(每個使用者看到的其實不是一個tomcat上的資料,但是對使用者是透明的)

3.nginx負載tomcat的jsp時,需要解決session共用:

使用memcache進行緩衝(使用者)後端資料,但是又要想到解決單點故障問題,因而可以採用兩台memcache作為後端負載.

memcached預設連接埠11211,後端使用交叉儲存(tomcat會將session同步,session自動尋找儲存的memcached,但是預設是交叉儲存,當一個memcached伺服器壞掉,tomcat都會存到存活的memcached伺服器上)

只要tomcat不宕掉,一切資料都還存在

但是當memcached宕掉,tomcat會向存活的memcached上存取

session 的序列化方案官方推薦的有 4 種:

  1. java serialization

  2. msm-kryo-serializer

  3. msm-javolution-serializer

  4. msm-xstream-serializer

其中效能最好的是Kryo,我們使用kryo來做

mecached伺服器node1 and node2

#yum install memcached -y#/etc/init.d/memcached start

memcached預設開啟11211連接埠

測試訪問:telnet localhost 11211

stats 查看狀態
set user 0 0 3 儲存新值(add replace)
get user 擷取值

配置兩台memcached伺服器(tomcat),下載jar包(必須支援相關的java程式)
提供測試環境的包,解壓即可用:
連結: http://pan.baidu.com/s/1mgIF9NU 密碼: n5wu

asm-3.2.jar
couchbase-client-1.2.2.jar
kryo-1.03.jar
kryo-serializers-0.11.jar
memcached-session-manager-1.6.5.jar
memcached-session-manager-tc7-1.6.5.jar
minlog-1.2.jar
msm-kryo-serializer-1.6.5.jar
reflectasm-0.9.jar
spymemcached-2.10.3.jar

node1 and node2 同步內容

#cd tomcat/lib/#mget jar/*    下載tomcat的session共用管理組件#cd tomcat/conf/# vim context.xml"de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:192.168.122.101:11211,n2:192.168.122.102:11211"failoverNodes="n1"    #tomcat2需要寫成n2requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>#tomcat/bin/shutdown.sh #重啟tomcat,以識別memcached-session-manager# tail -f logs/catalina.out    #預設日誌INFO: MemcachedSessionService finished initialization, sticky true, operation timeout 1000, with node ids [n2] and failover node ids [n1]

正常啟動

編輯測試檔案:(提交使用者資訊的jsp測試頁)

# vim tomcat/webapps/ROOT/test.jsp             <%@ page contentType="text/html; charset=GBK" %><%@ page import="java.util.*" %><html><head><title>Cluster App Testtitle>head><body>Server Info:<%out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"
");%><%out.println("
ID " + session.getId()+"
");String dataName = request.getParameter("dataName");if (dataName != null && dataName.length() > 0) {String dataValue = request.getParameter("dataValue");session.setAttribute(dataName, dataValue);}out.print("Session list");Enumeration e = session.getAttributeNames();while (e.hasMoreElements()) {String name = (String)e.nextElement();String value = session.getAttribute(name).toString();out.println( name + " = " + value+"
");System.out.println( name + " = " + value);}%><formaction="test.jsp"method="POST">name:<inputtype=textsize=20name="dataName"><br>key:<inputtype=textsize=20name="dataValue"><br><inputtype=submit>form>body>html>

session共用完成:兩台tomcat和memcached做相同的配置(jdk,memcache,tomcat)

測試:

http://192.168.122.101/test.jsp
使用一台tomcat和另外一台的memcached進行session共用

任何一台tomcat或者memcached掛了都無所謂

session會記錄並且保持使用者的資料資訊

我同時寫了一鍵安裝的指令碼,還有一些問題,也分享出來,希望有大神能指點~~

第一個,在有nginx的機器上運行:

#!/bin/bashsetenforce 0 > /dev/nulliptables -F > /dev/nullsed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config###############  nginx + tomcat + memcachedDIR_NOW=`pwd`IPADDR_NTM='192.168.122.101'IPADDR_TM='192.168.122.102'NGINX_PKG_DIR='/root/one_key_install'NGINX_PKG_NAME='nginx-1.6.1.tar.gz'NGINX_DIR='/usr/local/nginx'TOMCAT_PKG_DIR='/root/one_key_install'TOMCAT_PKG_NAME='apache-tomcat-7.0.37.tar.gz'TOMCAT_DIR='/usr/local/tomcat'STICKY_PKG_DIR='/root/one_key_install'STICKY_PKG_NAME='nginx-sticky-module-1.0.tar.gz'JDK_BIN_DIR='/root/one_key_install'JDK_BIN_NAME='jdk-6u32-linux-x64.bin'###################  nginx + sticky installcd$NGINX_PKG_DIRtar zxf $NGINX_PKG_NAMEDIR=`ls -F | grep /$ | grep nginx | awk -F '/''{print $1}'`tar zxf $STICKY_PKG_DIR/$STICKY_PKG_NAME -C $NGINX_PKG_DIR/$DIRsed -i 's/^CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' /$NGINX_PKG_DIR/$DIR/auto/cc/gccsed -i 's/^#define NGINX_VER          \"nginx\/\" NGINX_VERSION/#define NGINX_VER          \"nginx\/\"/g' /$NGINX_PKG_DIR/$DIR/src/core/nginx.hyum install gcc pcre-devel openssl-devel -ycd$NGINX_PKG_DIR/$DIR./configure --prefix=/usr/local/nginx --add-module=$NGINX_PKG_DIR/$DIR/nginx-sticky-module-1.0 --with-http_ssl_module --with-http_stub_status_modulemake && make installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginxcd$DIR_NOWrm -f /usr/local/nginx/conf/nginx.confcp nginx.conf.exp /usr/local/nginx/conf/nginx.confsed -i "s/server 192.168.0.1:8080;/server ${IPADDR_NTM}:8080;/g" /usr/local/nginx/conf/nginx.confsed -i "s/server 192.168.0.2:8080;/server ${IPADDR_TM}:8080;/g" /usr/local/nginx/conf/nginx.conf#####################  tomcat installcd$JDK_BIN_DIRsh $JDK_BIN_NAMEDIR=`ls -F | grep /$ | grep jdk | awk -F '/''{print $1}'`mv $DIR /usr/local/mv /usr/local/$DIR /usr/local/jdkecho"export JAVA_HOME=/usr/local/jdkexport CLASSPATH=:\$JAVA_HOME/libexport PATH=\$PATH:\$JAVA_HOME/bin">>/etc/profilecd$TOMCAT_PKG_DIRtar zxf $TOMCAT_PKG_NAME -C /usr/localcd /usr/localmv /usr/local/`ls | grep tomcat` /usr/local/tomcatln -s /usr/local/tomcat/bin/startup.sh /usr/local/sbin/tomcat-startln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/sbin/tomcat-stopcd$DIR_NOWtar zxf kryo_pkgs.tar.gzcd kryo_pkgscp * /usr/local/tomcat/libcd$DIR_NOWrm -f /usr/local/tomcat/conf/context.xmlcp context.xml.exp /usr/local/tomcat/conf/context.xml cd$DIR_NOWrm -f /usr/local/tomcat/conf/context.xmlcp context.xml.exp /usr/local/tomcat/conf/context.xmlsed -i "s#memcachedNodes=\"n1:192.168.0.1:11211,n2:192.168.0.2:11211\"#memcachedNodes=\"n1:${IPADDR_NTM}:11211,n2:${IPADDR_TM}:11211\"#" /usr/local/tomcat/conf/context.xml####################  memcached installyum install memcached -y####################  start services/etc/init.d/memcached startsource /etc/profiletomcat-startnginx

第二個,在只有tomcat和memcached的機器上運行

#!/bin/bashsetenforce 0 > /dev/nulliptables -F > /dev/nullsed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/configDIR_NOW=`pwd`IPADDR_NTM='192.168.122.101'IPADDR_TM='192.168.122.102'TOMCAT_PKG_DIR='/root/no_ngx'TOMCAT_PKG_NAME='apache-tomcat-7.0.37.tar.gz'TOMCAT_DIR='/usr/local/tomcat'STICKY_PKG_DIR='/root/no_ngx'STICKY_PKG_NAME='nginx-sticky-module-1.0.tar.gz'JDK_BIN_DIR='/root/no_ngx'JDK_BIN_NAME='jdk-6u32-linux-x64.bin'cd$JDK_BIN_DIRsh $JDK_BIN_NAMEDIR=`ls -F | grep /$ | grep jdk | awk -F '/''{print $1}'`mv $DIR /usr/local/mv /usr/local/$DIR /usr/local/jdkecho"export JAVA_HOME=/usr/local/jdkexport CLASSPATH=:\$JAVA_HOME/libexport PATH=\$PATH:\$JAVA_HOME/bin">>/etc/profilecd$TOMCAT_PKG_DIRtar zxf $TOMCAT_PKG_NAME -C /usr/local/cd /usr/localmv /usr/local/`ls | grep tomcat` /usr/local/tomcatcd$DIR_NOWtar zxf kryo_pkgs.tar.gzcd kryo_pkgscp * /usr/local/tomcat/libcd$DIR_NOWrm -f /usr/local/tomcat/conf/context.xmlcp context.xml.exp /usr/local/tomcat/conf/mv /usr/local/tomcat/conf/context.xml.exp /usr/local/tomcat/conf/context.xmlsed -i "s#memcachedNodes=\"n1:192.168.0.1:11211,n2:192.168.0.2:11211\"#memcachedNodes=\"n1:${IPADDR_NTM}:11211,n2:${IPADDR_TM}:11211\"#" /usr/local/tomcat/conf/context.xmlsed -i 's/failoverNodes="n1"/failoverNodes="n2"/' /usr/local/tomcat/conf/context.xmlyum install memcached -y/etc/init.d/memcached startsource /etc/profileln -s /usr/local/tomcat/bin/startup.sh /usr/local/sbin/tomcat-startln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/sbin/tomcat-stoptomcat-start

這兩個指令碼存在同樣的問題,執行完畢之後發現

source /etc/profile

這一句沒有執行,必須手動執行,一直百思不得其解,希望有誰能解答,多謝啦~~

以上就介紹了nginx+tomcat+memcached配置+指令碼,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.