現今,互聯網上,好多的公司爲了網站的健壯性,都用了java做了框架,網頁也都是JSP的,他們的服務器都採用了tomcat的架構,爲了瞭解這種架構,下面我做了一個實驗。
利用httpd在前端做代理,後端兩個tomcat提供服務,我們還採用了NFS網絡共享存儲,MySQL服務器,爲網站的數據一致性提供保障。
系統:CentOS 6.5
地址說明:172.16.30.1是我們的惟一公網地址,192.168.160.0網段爲內網地址
搭建我們的tomcat服務器
當我們的tomcat運行在Linux平臺上時,它需要java的虛擬機JVM,這裏,jdk就提供了java虛擬機
在我們的前面兩個節點上都安裝JVM環境
[root@node1 ~]# rpm -ivh jdk-7u9-linux-x64.rpm [root@node1 ~]# vim /etc/profile.d/jdk.sh #將java程序加入到環境變量中 JAVA_HOME=/usr/java/latest PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH [root@node1 ~]# source /etc/profile.d/jdk.sh
在兩個節點上安裝tomcat服務
[root@node1 ~]# tar -zxf apache-tomcat-7.0.55.tar.gz -C /usr/local/ [root@node1 local]# ln -sv apache-tomcat-7.0.55 tomcat [root@node2 local]# vim /etc/profile.d/tomcat.sh #將tomcat的腳本文件加入到環境變量中去 export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH [root@node2 local]# source /etc/profile.d/tomcat.sh
爲tomcat提供啓動腳本
[root@node1 local]# vim /etc/rc.d/init.d/tomcat #!/bin/sh # Tomcat init script for Linux. # # chkconfig: 2345 96 14 # description: The Apache Tomcat servlet/JSP container. # JAVA_OPTS='-Xms64m -Xmx128m' JAVA_HOME=/usr/java/latest CATALINA_HOME=/usr/local/tomcat export JAVA_HOME CATALINA_HOME case $1 in start) exec $CATALINA_HOME/bin/catalina.sh start ;; stop) exec $CATALINA_HOME/bin/catalina.sh stop;; restart) $CATALINA_HOME/bin/catalina.sh stop sleep 2 exec $CATALINA_HOME/bin/catalina.sh start ;; *) echo "Usage: `basename $0` {start|stop|restart}" exit 1 ;; esac [root@node1 local]# chmod +x /etc/rc.d/init.d/tomcat #添加執行權限 [root@node1 local]# chkconfig –add tomcat
在tomcat的工作目錄下創建test目錄,並且提供主頁和相關目錄
創建目錄(兩個節點都創建)
[root@node1 ~]# mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
分別爲兩個節點提供主頁
node1:
[root@node1 ~]# vim /usr/local/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>node1</title></head> <body> <h1><font color="red">node1.365lsy.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("365lsy.com","365lsy.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
node2:
[root@node2 ~]# vim /usr/local/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>node2</title></head> <body> <h1><font color="blue">node2.365lsy.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("365lsy.com","365lsy.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
此時,啓動tomcat服務,分別在瀏覽器中訪問這兩臺主機
[root@node1 ~]# service tomcat start
此時,我們在前端使用httpd服務器分別調度到這兩臺tomcat服務器
確保我們的httpd已經有proxy這個模塊了
[root@localhost ~]# httpd -t -M | grep proxy #確保有以下幾個模塊 proxy_module (shared) proxy_balancer_module (shared) proxy_http_module (shared) proxy_ajp_module (shared)
添加配置文件,內容如下
[root@localhost ~]# vim /etc/httpd/conf.d/mod_proxy.conf <Proxy balancer://lb1> BalancerMember ajp://192.168.160.129:8009 route=node1 #這裏的route指定的名稱在tomcat中指定 BalancerMember ajp://192.168.160.130:8009 route=node2 #這裏使用ajp的協議 ProxySet lbmethod=byrequests </Proxy> ProxyPass / balancer://lb1/ ProxyPa***everse / balancer://lb1/
重啓我們的httpd服務,在瀏覽器中訪問
[root@localhost ~]# service httpd restart
爲了使我們的後端tomcat服務器,不能被用戶直接訪問,我們應該將8080端口關閉,在兩個tomcat節點上進行
[root@node1 ~]# vim /usr/local/tomcat/conf/server.xml <!– Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /–> #將此段註釋掉,調試時,可以打開
並且添加此選項:
httpd會將請求調度到後端的不同的tomcat服務器上,但是,如果,我們的是購物網站,如何實現session綁定呢?
最好的方法就是session的服務器,我們在我們的兩個tomcat服務器上安裝memcached服務
[root@node2 ~]# yum install -y memcached
並將memcached啓動
[root@node1 ~]# service memcached start
爲tomcat提供下列的類文件(下列操作在兩個tomcat節點上進行)
javolution-5.5.1.jar
memcached-session-manager-1.8.2.jar
memcached-session-manager-tc7-1.8.2.jar
msm-javolution-serializer-1.8.2.jar
spymemcached-2.10.2.jar
將上面的這些文件拷貝到tomcat的lib目錄中
[root@node1 msm]# cp *.jar /usr/local/tomcat/lib/
然後,分別更改兩個節點的配置文件
添加如下選項:
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.160.129:11211,n2:192.168.160.130:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context>
重啓我們的tomcat服務,然後,再次訪問查看session信息
[root@node1 ~]# service tomcat restart
此時,session信息是完全一致的
搭建NFS服務器,並啓動服務
[root@node4 ~]# mkdir -pv /web/jcenter [root@node4 ~]# vim /etc/exports /web/jcenter 192.168.160.0/16(rw,no_root_squash) [root@node4 ~]# service nfs start
提供jcenter程序包
[root@node4 ~]# tar xf JavaCenter_Home_2.0_GBK.tar.bz2 -C /web/jcenter/ [root@node4 jcenter]# cd JavaCenter_Home_2.0_GBK/ [root@node4 JavaCenter_Home_2.0_GBK]# mv * ./.. [root@node4 JavaCenter_Home_2.0_GBK]# cd .. [root@node4 jcenter]# rm -rf JavaCenter_Home_2.0_GBK/ [root@node4 jcenter]# chmod -R 755 attachment/
然後,指定數據庫的用戶名和密碼等信息
[root@node4 jcenter]# vim config.properties dbHost = 192.168.160.131 dbPort = 3306 dbUser = jcenter dbPw = jcenter dbName = jcenter
搭建MySQL數據庫,新建用戶,並賦予權限
[root@node3 ~]# yum install -y mysql-server [root@node3 ~]# service mysqld start
創建jcenter數據庫
mysql> create database jcenter; mysql> grant all on jcenter.* to jcenter@'192.168.160.%' identified by 'jcenter'; mysql>flush privileges;
回到我們的tomcat服務器,新建實例jcenter,在兩個節點上都操作
[root@node1 ~]# mkdir -pv /usr/local/tomcat/webapps/jcenter [root@node1 ~]# mount -t nfs 192.168.160.132:/web/jcenter /usr/local/tomcat/webapps/jcenter/
然後,再次更改tomcat的配置文件,兩個節點都做修改
<Context path="/jcenter" docBase="/usr/local/tomcat/webapps/jcenter" reloadable="true">
#可以將原來的test改爲jcenter
重啓tomcat服務
[root@node2 tomcat]# service tomcat restart
到瀏覽器中訪問jcenter/install
此時,我們的tomcat上的jcenter是能夠正常工作的,無論怎麼刷新,session信息都被綁定了,訪問都不會被重新定向的,搭建session服務器,是保持用戶session信息的一種非常好的方式