研究了下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 種:
java serialization
msm-kryo-serializer
msm-javolution-serializer
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教程有興趣的朋友有所協助。