使用Apache做集群及負載均衡的方式一般有兩種:mod_jk和mod_proxy兩種。
本人嘗試過用mod_jk的方式配置過,但都不是很成功,apache2.2.x后已經將mod_proxy集成進來,無需使用其他軟件、插件,通過配置就可以完成與tomcat的集成。下面講述以mod_proxy方式配置情況:
環境:windowsxp,apache2.2.x,tomcat5.5,jdk1.5.0,tomcat放在同一臺機器上,3份。
安裝過程略。。。,以下講述配置過程
1、Apache配置
1.1 httpd.conf配置
修改APACHE的配置文件D:\Apache \conf\httpd.conf
將以下Module的注釋去掉,這里并沒有使用mod_jk.so進行apache和tomcat的鏈接,從2.X以后apache自身已集成了mod_jk.so的功能。只需簡單的把下面幾行去掉注釋,就相當于以前用mod_jk.so比較繁瑣的配置了。這里主要采用了代理的方法,就這么簡單。
- LoadModule proxy_module modules/mod_proxy.so
- LoadModule proxy_connect_module modules/mod_proxy_connect.so
- LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
- LoadModule proxy_http_module modules/mod_proxy_http.so
- LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
- LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
再找到加上index.jsp修改成,我項目的默認歡迎頁面是index.jsp,記得與前一個之前用空隔分隔。
- <IfModule dir_module>
- DirectoryIndex index.html index.jsp main.html
- </IfModule>
<IfModule dir_module>
DirectoryIndex index.html index.jsp main.html
</IfModule>
接著找到以下這兩行,把下面一行的#號去掉,表示將 conf/extra/httpd-vhosts.conf配置文件加進來
- # Virtual hosts
- Include conf/extra/httpd-vhosts.conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
最后,在文件最后加上以下內容,表示打開反向代理。 這個很重要,我的項目之前就是沒有加上這幾行,只能顯示index.jsp頁面的內容,登錄成功后去不能正確跳轉到相關頁面,還是返回到index.jsp頁面。反向代理可以基于一整個站點,也可以基于一個目錄。
- ProxyRequests Off
- <Proxy *:80>
- Order deny,allow
- Allow from all
- </Proxy>
ProxyRequests Off
<Proxy *:80>
Order deny,allow
Allow from all
</Proxy>
2.2 http-vhost.conf配置
修改conf/extra/httpd-vhosts.conf
在文件最后加上以下代碼
- <VirtualHost *:80>
- ServerAdmin habibliu@gmail.com
- ServerName localhost
- ServerAlias localhost
- ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
- ProxyPassReverse / balancer://cluster/
- <proxy balancer://cluster>
- BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=s1
- BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=s2
- BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=s3
- </proxy>
- </VirtualHost>
<VirtualHost *:80>
ServerAdmin habibliu@gmail.com
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
<proxy balancer://cluster>
BalancerMember ajp://127.0.0.1:8009 loadfactor=1 route=s1
BalancerMember ajp://127.0.0.1:8109 loadfactor=1 route=s2
BalancerMember ajp://127.0.0.1:8209 loadfactor=1 route=s3
</proxy>
</VirtualHost>
說明:
均衡器粘連會話名稱。該值常常會被設置為類似JSESSIONID或者PHPSESSIONID之類的值,他依賴于支持會話的后端應用服務器。如果后端服務器使用不同的cookie名稱或者URL編碼的ID(像servlet容器),使用|來分開他們。第一個部分針對cookie,第二個針對路徑。
每次請求都按照負載均衡配置的節點次序依次請求到不同的Tomcat上。尤其是當我們通過jvmRoute 和route 做了綁定之后,信息更加準確。但是,仔細觀察,每次請求的SessionID都是不一樣! 對于純Web應用,尤其是依靠SessionID區分唯一用戶的應用,這將是一場噩夢——解決了服務器壓力均衡問題,卻帶來了SessionID不唯一問題!這就需要SessionID綁定,或者說叫做“會話復制”。 stickySession 粘性會話,根據這一屬性,瀏覽器將通過cookie綁定SeesionID。如果這個時候再次訪問http://localhost/zlex ,你會發現,頁面不會來回跳轉了!
引用:
sticky模式
利用負載均衡器的sticky模式的方式把所有同一session的請求都發送到相同的Tomcat節點。這樣不同用戶的請求就被平均分配到集群 中各個tomcat節點上,實現負載均衡的能力。這樣做的缺點是沒有災難恢復的能力。一旦一個節點發生故障,這個節點上所有的session信息全部丟 失;
同一用戶同一session只和一個webServer交互,一旦這個webserver發生故障,本次session將丟失,用戶不能繼續使用 !
BalancerMember 是負載均衡參與的成員定義,與tomcat的ajp協議通訊。上面紅色的端口號分別是三個tomcat的conf/server.xml中的配置的AJP/1.3協議連接器,由于在同一臺機器上部署,所以三個tomcat中的這個端口都要改成不一樣的,我這里分別改成8009,8109,8209。緊接著是route設置,值與每個tomcat的配置對應上,下面會說明。
2、Tomcat的配置說明
1、server.xml配置
修改%TOMCAT_HOME%\conf\server.xml
由于三個tomcat都部署在一臺機器上,所以相關會引起沖突的端口都要改,分別是:
shutdow,http connector,ajp connector,以下是三個tomcat server.xml文件中三個端口的配置清單:
tomcat s1:
- <Server port="8905" shutdown="SHUTDOWN" debug="0">
- ....
- <Connector port="9000"
- maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- enableLookups="false" redirectPort="8443" acceptCount="100"
- debug="0" connectionTimeout="20000"
- disableUploadTimeout="true" />
- ....
- <Connector port="8009"
- enableLookups="false" redirectPort="8443" debug="0"
- protocol="AJP/1.3" />
<Server port="8905" shutdown="SHUTDOWN" debug="0">
....
<Connector port="9000"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
....
<Connector port="8009"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />
Tomcat s2
- <Server port="8915" shutdown="SHUTDOWN" debug="0">
- ....
- <Connector port="9100"
- maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- enableLookups="false" redirectPort="8443" acceptCount="100"
- debug="0" connectionTimeout="20000"
- disableUploadTimeout="true" />
- ....
- <Connector port="8109"
- enableLookups="false" redirectPort="8443" debug="0"
- protocol="AJP/1.3" />
<Server port="8915" shutdown="SHUTDOWN" debug="0">
....
<Connector port="9100"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
....
<Connector port="8109"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />
Tomcat s3
- <Server port="8925" shutdown="SHUTDOWN" debug="0">
- ....
- <Connector port="9200"
- maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- enableLookups="false" redirectPort="8443" acceptCount="100"
- debug="0" connectionTimeout="20000"
- disableUploadTimeout="true" />
- ....
- <Connector port="8209"
- enableLookups="false" redirectPort="8443" debug="0"
- protocol="AJP/1.3" />
<Server port="8925" shutdown="SHUTDOWN" debug="0">
....
<Connector port="9200"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
....
<Connector port="8209"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />
以上的AJP端口與apache http-vhost.conf中的BalancerMember 的ajp端口對應。
接著找到的,加上jvmRoute="xx"屬性,xx要與apache http-vhost.conf中的BalancerMember 的ajp route定義一致。以下是三個tomcat的engine設置
Tomcat s1
- <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s1">
<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s1">
Tomcat s2
- <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s2">
<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s2">
Tomcat s3
- <Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s3">
<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="s3">
接著到到Cluster配置段,將這一段的注釋符號去掉,如下:
- <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
- managerClassName="org.apache.catalina.cluster.session.DeltaManager"
- expireSessionsOnShutdown="false"
- useDirtyFlag="true">
-
- <Membership
- className="org.apache.catalina.cluster.mcast.McastService"
- mcastAddr="228.0.0.4"
- mcastPort="45564"
- mcastFrequency="500"
- mcastDropTime="3000"/>
-
- <Receiver
- className="org.apache.catalina.cluster.tcp.ReplicationListener"
- tcpListenAddress="auto"
- tcpListenPort="4001"
- tcpSelectorTimeout="100"
- tcpThreadCount="6"/>
-
- <Sender
- className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
- replicationMode="pooled"/>
-
- <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
- filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
-
- <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
- tempDir="/tmp/war-temp/"
- deployDir="/tmp/war-deploy/"
- watchDir="/tmp/war-listen/"
- watchEnabled="false"/>
- </Cluster>
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
<Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
</Cluster>
注意:如果同一臺設備上有多個tomcat,這個tcpListenPort就中設置不同的端口號,以免沖突。
所以三個tomcat的這個端口分別是4001、4002、4003。
3、其它配置
執行以上步驟基本已經可以成功了,當然還要設置你的webapp,這個不在此累贅了。當然最好還要設置JAVA_HOME,PATH,CLASSPATH這些環境變量,比如將%JAVA_HOME%\lib\tools.jar和%JAVA_HOME%\lib\rt.jar兩個包加到類路徑內。
還有<distributable/>元素,有些文章說還要將元素加到項目的web.xml文件中,我也加了,但沒有驗證它的存在對運行有沒有影響,大家如果碰到問題,也不防加上。
</script>