隨着IT行業的發展,linux服務器在企業中應用普遍,人們對linux上的應用服務要求也愈來愈高,早先的apache服務器、apache有優勢也 有不足,apache漸漸不能知足人們的要求,目前nginx被大量採用作高性能web服務器,不管是我的網站仍是大型門戶網站都在使用nginx做爲 web搭建web服務器的首選。
接下來咱們親自來搭建一個屬於本身的高性能web服務器,而且帶故障自動轉移的羣集、和負載均衡服務器。
1、Nginx+Tomcat+Session 高性能羣集服務搭建,本文采用目前主流版本搭建,搭建環境及版本以下列表:
系統版本:Centos 5.3 64位系統
Nginx版本爲:nginx-0.8.54.tar.gz
Jdk版本爲:1.6.0_18_64
Tomcat版本爲:Apache Tomcat/6.0.30
其餘類似版本也能夠!安裝服務所需的包以下下載路徑:本網站集成部分下載:
jdk請到如下網站下載:請選擇本身系統版本的jdk。
https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter
【Tomcat下載地址】
http://blog.mgcrazy.com/download/apache-tomcat-6.0.30.tar.gz
【Nginx-0.8.54 下載】
http://blog.mgcrazy.com/download/nginx-0.8.54.tar.gz
http://blog.mgcrazy.com/download/pcre-8.01.tar.gz
2、首先安裝Nginx:安裝nginx以前須要安裝pcre包和zlib以支持重寫,正則以及網頁壓縮等等】
把所需的包下載到/usr/src下【根據本身的習慣,路徑能夠改變】
(1)首先安裝pcre:java
cd /usr/src &&tar xzf pcre-8.01.tar.gz &&cd pcre-8.01 && ./configure --prefix=/usr/local/pcre &&make &&make install
(2)、而後再安裝nginx :【給nginx安裝jvmroute模塊】linux
cd /usr/src svn checkout http://nginx-upstream-jvm-route.googlecode.com/svn/trunk/nginx-upstream-jvm-route-read-only useradd www tar xzf nginx-0.8.54.tar.gz cd nginx-0.8.54 patch -p0 < ../nginx-upstream-jvm-route-read-only/jvm_route.patch ./configure --prefix=/usr/local/nginx-0.8 --with-http_stub_status_module --with-openssl=/usr/ --with-pcre=/usr/src/pcre-8.01 --add-module=../nginx-upstream-jvm-route-read-only --user=www --group=www make make install
【nginx注意* –with-pcre=/usr/src/pcre-8.01指向的是源碼包解壓的路徑,而不是安裝的路徑,不然會報
make[1]: *** [/usr/local/pcre/Makefile] Error 127 錯誤】
Nginx 安裝完畢!咱們先不着急nginx配置文件的配置,先來修改tomcat配置文件:
3、Tomcat安裝配置:
(1)、將所需的包下載至/usr/src 目錄;首先安裝jdk:
chmod o+x jdk* && ./jdk* ;程序包會提示按回車鍵,咱們根據提示安裝便可,解壓完畢,會在當前目錄生成 jdk1.6.0_18 這個文件夾,
mkdir -p /usr/java && mv jdk1.6.0_18 /usr/java/下
vi /etc/profile 最後面加入如下語句:nginx
export JAVA_HOME=/usr/java/jdk1.6.0_18 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin
source /etc/profile //使環境變量立刻生效
java –version //查看java版本,顯示版本是1.6.0_18,而且是64位的證實安裝成功!
【 Java HotSpot(TM) 64-Bit Server VM (build 16.0-b10, mixed mode) 】
cd /usr/src && tar xzf apache-tomcat-6.0.30.tar.gz
解壓完成執行:
mv apache-tomcat-6.0.30 /usr/local/tomcat_1 && cp /usr/local/tomcat_1 /usr/local/tomcat_2 -r
【移動到/usr/local下並重命名爲tomcat_1文件夾,並cp一個tomcat_2】
部署兩個Tomcat羣集作負載均衡用!
(2)、設置tomcat的java變量
cd /usr/local/tomcat_1/bin/ && vi setenv.sh 建立一個setenv.sh腳本文件,添加以下語句便可web
JAVA_HOME=/usr/java/jdk1.6.0_18 JAVA_JRE=/usr/java/jdk1.6.0_18/jre
而且拷貝setenv.sh文件到tomcat_2/bin/下 :
cp -p /usr/local/tomcat_1/bin/setenv.sh /usr/local/tomcat_2/bin 下便可!
保存退出
檢查兩個tomcat下bin目錄的*.sh 文件是否有可執行權限,若是沒有則進入到相應的目錄執行 chmod o+x *.sh 便可!
給兩個tomcat分別建立不一樣的目錄以下:mkdir -p /usr/webapps/{www_1,www_2}
(3)、設置Tomcat的 server.xml文件:
【如下是個人tomcat配置文件具體內容,本想已附件的形式發的,本博客目前還不支持附件功能,重要修改的地方供你們參考,若是把全部配置都粘貼在這裏,顯示有問題,全部用了兩個web連接!這樣一來部分解釋就產生了影響。不明白的歡迎留言】
這個是完整的server.xml文件下載地址:
http://blog.mgcrazy.com/download/server.xml.tgz
tomcat_2的配置文件下載地址:
http://blog.mgcrazy.com/download/server2.xml.tgz
兩個Tomcat配置的cluster裏面的端口分別爲4000、4001 ,必須設置成不一樣的端口;並且得分別設置兩個jvmroute名稱,一會在nginx中會用到!
配置Tomcat session會話複製:
分別在兩個tomcat的conf下web.xml文件裏面加入以下一行便可:
配置完畢後,咱們測試一下廣播shell
java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal1 java -cp tomcat-replication.jar MCaster 224.0.0.1 45564 Terminal2
若是不報錯則能正常廣播
tomcat-replication.jar 下載:http://cvs.apache.org/~fhanik/tomcat-replication.jar
若是是兩臺機器的話,能夠用tcpdump 抓包看看!
apache
Tomcat配置完畢,啓動兩個tomcat,先啓動tomcat1,tomcat_1啓動日誌以下: 信息: Initializing Coyote HTTP/1.1 on http-8080 2011-3-18 19:56:21 org.apache.catalina.startup.Catalina load 信息: Initialization processed in 1088 ms 2011-3-18 19:56:21 org.apache.catalina.core.StandardService start 信息: Starting service Catalina 2011-3-18 19:56:21 org.apache.catalina.core.StandardEngine start 信息: Starting Servlet Engine: Apache Tomcat/6.0.18 2011-3-18 19:56:21 org.apache.catalina.ha.tcp.SimpleTcpCluster start 信息: Cluster is about to start 2011-3-18 19:56:21 org.apache.catalina.tribes.transport.ReceiverBase bind 信息: Receiver Server Socket bound to:/192.168.2.79:4000 2011-3-18 19:56:21 org.apache.catalina.tribes.membership.McastServiceImpl setupSocket 信息: Setting cluster mcast soTimeout to 500 2011-3-18 19:56:21 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers 信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:4 2011-3-18 19:56:22 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers 信息: Done sleeping, membership established, start level:4 2011-3-18 19:56:22 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers 信息: Sleeping for 1000 milliseconds to establish cluster membership, start level:8 2011-3-18 19:56:23 org.apache.catalina.tribes.membership.McastServiceImpl waitForMembers 信息: Done sleeping, membership established, start level:8 2011-3-18 19:56:23 org.apache.catalina.ha.deploy.FarmWarDeployer start 嚴重: FarmWarDeployer can only work as host cluster subelement! 2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager start 信息: Register manager to cluster element Engine with name Catalina 2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager start 信息: Starting clustering manager at 2011-3-18 19:56:23 org.apache.catalina.ha.session.DeltaManager getAllClusterSessions 信息: Manager [localhost#]: skipping state transfer. No members active in cluster group. 2011-3-18 19:56:23 org.apache.catalina.ha.session.JvmRouteBinderValve start 信息: JvmRouteBinderValve started 2011-3-18 19:56:23 org.apache.coyote.http11.Http11Protocol start 信息: Starting Coyote HTTP/1.1 on http-8080 2011-3-18 19:56:24 org.apache.jk.common.ChannelSocket init 信息: JK: ajp13 listening on /0.0.0.0:8411 2011-3-18 19:56:24 org.apache.jk.server.JkMain start 信息: Jk running ID=0 time=0/42 config=null 2011-3-18 19:56:24 org.apache.catalina.startup.Catalina start 信息: Server startup in 2676 ms
Tomcat_2的日誌以下:
000,{-64, -88, 2, 79},4000, alive=86901,id={78 42 25 -19 -102 3 64 10 -76 93 69 -43 45 76 95 -112 }, payload={}, command={}, domain={}, ]. This operation will timeout if no session state has been received within 60 seconds.
2011-3-18 19:57:48 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report
信息: ThroughputInterceptor Report[
Tx Msg:1 messages
Sent:0.00 MB (total)
Sent:0.00 MB (application)
Time:0.01 seconds
Tx Speed:0.04 MB/sec (total)
TxSpeed:0.04 MB/sec (application)
Error Msg:0
Rx Msg:1 messages
Rx Speed:0.00 MB/sec (since 1st msg)
Received:0.00 MB]
2011-3-18 19:57:48 org.apache.catalina.ha.session.DeltaManager waitForSendAllSessions
信息: Manager [localhost#]; session state send at 11-3-18 下午7:57 received in 125 ms.
2011-3-18 19:57:48 org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor report
信息: ThroughputInterceptor Report[
Tx Msg:2 messages
Sent:0.00 MB (total)
Sent:0.00 MB (application)
Time:0.05 seconds
Tx Speed:0.02 MB/sec (total)
TxSpeed:0.02 MB/sec (application)
Error Msg:0
Rx Msg:2 messages
Rx Speed:0.00 MB/sec (since 1st msg)
Received:0.00 MB]
2011-3-18 19:57:49 org.apache.catalina.ha.session.JvmRouteBinderValve start
信息: JvmRouteBinderValve started
2011-3-18 19:57:49 org.apache.coyote.http11.Http11Protocol start
信息: Starting Coyote HTTP/1.1 on http-8081
2011-3-18 19:57:49 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8412
2011-3-18 19:57:49 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/34 config=null
2011-3-18 19:57:49 org.apache.catalina.startup.Catalina start
信息: Server startup in 2962 ms
若是有報錯或者請查看緣由!
skipping state transfer. No members active in cluster group.」
mcastBindAddress 沒有添加或添加得不對
【如上報錯,若是啓動其中一個報的錯,並且已經修改了mcastBindAddress,此時仍是有報錯,咱們能夠不用管,在啓動另外一個 tomcat看看,第二個tomcat沒有No members active in cluster group,則表示兩個tomcat通訊正常。】
4、最後配置Nginx:【貼出nginx.conf配置文件的內容,下載地址以下:】
http://blog.mgcrazy.com/download/nginx.conf.tgz
配置文件須要注意的地方:
http
{
upstream backend {
server 192.168.2.79:8080 srun_id=tomcat1;
#【tomcat1是我tomcat_1 server.xml裏面配置的jvmroute=tomcat1】
server 192.168.2.79:8081 srun_id=tomcat2;
#【tomcat2是我tomcat_2 server.xml裏面配置的jvmroute=tomcat2】
jvm_route $cookie_JSESSIONID|sessionid reverse;
#【配置jvmroute 、session會話】
}
配置完畢後,新建/usr/webapps/www_1/index.jsp測試頁面
瀏覽器
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% %> http://blog.mgcrazy.com <%out.print(request.getSession()) ;%> <%out.println(request.getHeader("Cookie")); %> tomcat_2的發佈目錄index.jsp內容爲: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% %> http://wgkgood.gicp.net <%out.print(request.getSession()) ;%> <%out.println(request.getHeader("Cookie")); %>
啓動nginx便可!
最後測試!在同一個瀏覽器窗口下 ctrl+f5刷新,都是同一個tomcat內容,它不會跳轉到另外一tomcat
http://192.168.2.79:81 結果以下:
http://wgkgood.gicp.net
org.apache.catalina.session.StandardSessionFacade@2d7aece8
JSESSIONID=FEB19E24719ED666D1C9C50A7A09A2BA.tomcat2
另外一個瀏覽器窗口爲:
http://blog.mgcrazy.com
org.apache.catalina.session.StandardSessionFacade@259e215b
rtime=0; ltime=1298014951125; cnzz_eid=85744900-1298010049-; Hm_lvt_0e74098a87be059a433e5a74f1b5fecf=1298014951312; Hm_lvt_b7c035fd79b2c378053e06c86493de76=1300439158373; JSESSIONID=B2574ABB491F50F37162479BD3FE761C.tomcat1
不管你怎麼刷新同一個窗口下都不會變!並且當你down掉一個tomcat後,會自動轉移會話到另外一個tomcat上!用戶是感受不到服務掛掉的!當兩個服務正常的時候,能夠負載均衡、當一個服務down掉時,能夠自動剔除它,並複製它的會話!tomcat