今天整了一下apache整合Tomcat 集羣負載均衡配置,在網上看了好多篇文章,正確的太水,在這裏我貼出我結合看了多遍文章的結果
1:Apache的安裝:這是下載地址:http://download.csdn.net/download/wangbo54979/9560498 你們也可以去Apache的官網自行下載
2:Tomcat 這是下載地址: http://download.csdn.net/download/wangbo54979/9979752 我這是免安裝版 解壓直接用的
3:JK組件 這是下載地址: http://download.csdn.net/download/wangbo54979/9979757 這裏是我已經改過名的mod_jk.so
你們也可以去官網下載,mod_jk-1.2.31-httpd-2.2.3.so,請下載合適的mod_jk版本,改名爲mod_jk.so
4:JDK 安裝環境變量配置就不說了
我本次測試的是2個Tomcat,分別是Tomcat1和Tomcat2
這裏面 貼出 官網的下載地址 他這版本可能和我的有點出入:
1. Apache: apache 2.0.55 (由http://httpd.apache.org/進入下載)(點擊下載apache
2.0.55)
2. Tomcat: Tomcat 5.5.25 (由http://tomcat.apache.org/進入下載)(點擊下載Tomcat
5.5.25 zip版)
3. mod_jk: 在頁面 http://tomcat.apache.org/
Download 標題下找到 Tomcat Connectors 鏈接進入( 點擊下載mod_jk-apache-2.0.55.so)
Apache安裝最好不要放在C盤: 這是我隨意建的一個目錄 D:\jqtest\apatch\Apache2.2\conf
把上面下載好的mod_jk.so 放入到D:\jqtest\apatch\Apache2.2\modules 目錄下 注意找到Apache的modules 目錄 把jk丟進去就不管了 .
然後打開conf下的 httpd.conf文件 :
需要注意的是:Listen 80 他有個這個監聽端口,就是你的服務器支持哪個寫哪個,但一般服務器都支持80端口所以就不用管,除非個別網絡服務商把,你當前所在的區域80端口給屏蔽了,那你就得調換端口了
一直 拖拖到httpd.conf文件的最下面加入 :Include C:\java\work\mod_jk.conf 我這裏就隨便找了個位置 存放了 這個文件裏面配置一些信息 如下:
LoadModule jk_module modules/mod_jk.so 剛剛說丟到Apache下面modules目錄的JK組件
LoadModule rewrite_module modules/mod_rewrite.so 這個Apache modeles裏面自帶有
JkWorkersFile conf/workers.properties 這個文件需要自己 新建 放到Apache conf目錄下的
JkLogLevel info
workers.properties文件:
#server
worker.list = controller
#========tomcat1========
worker.tomcat1.port=9030
worker.tomcat1.host=127.0.0.1
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1
#========tomcat2========
worker.tomcat2.port=9031
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1
#========controller,負載均衡控制器========
####負載均衡控制器,類似一個虛擬的worker,type必須是lb
worker.controller.type=lb
####負載均衡集羣中所有的tomcat都在這裏了
worker.controller.balance_workers=tomcat1,tomcat2
#### 多個tomcat之間session的處理,使用不使用sticky的方式
worker.controller.sticky_session=false
#第二個參數是如果掉線了則把當前SESSION複製到別的TOMCAT
worker.controller.sticky_session_force=false
worker.controller.sticky_session=1
好了work文件就這些配置 然後在回到 mod_jk.conf 開始配置 JK訪問方式:
在文件原有的基礎上,拖到最後面 添加代碼如下:
<VirtualHost *:80> ServerAdmin [email protected] ServerName localhost ServerAlias localhost DocumentRoot /opt/apache2.4/htdocs/test JkMount /*.do controller JkMount /*.jsp controller ErrorLog "logs/loadbalancer-error.log" CustomLog "logs/loadbalancer-access.log" common </VirtualHost>
tomcat1 的配置: 爲了方便能看懂我就全部 貼出來 下面是server.xml文件
<?xml version='1.0' encoding='utf-8'?>
<Server port="9010" shutdown="SHUTDOWN"> <!--2個Tomcat的這個端口不要一樣-->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="9020" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/> <!--這裏面的9020就不說了 就跟8080一個意思 8433不能動-->
<Connector port="9030" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
<!-- 上面的9030 注意2個Tomcat不要一樣-->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> <!--在正常的Tomcat裏面你會發現其實這行是註釋的-->
<!--還是上面這行的解釋,你會發現有一個跟他一樣的代碼 只是沒有 jvmRoute 這裏配置的要跟work文件裏面對上 註釋沒有jvmRoute的開啓有的-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
<!--上面這行 正常情況下是註釋的 在這裏爲了完成Tomcat的複製,把註釋放開-->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
</Server>
還有 爲了能讓session複製 還需要配置一個文件context.xml 裏面把Context 加上dis...ble的 <Context distributable="true">或者你也可以在web項目的web.xml文件裏面加<distributable/>也行
tomcat2:配置跟1是一樣的 只是端口不一樣 ,我還是貼出來吧 但是沒說明因爲和上面一樣
<?xml version='1.0' encoding='utf-8'?>
<Server port="9011" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="9021" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
<Connector port="9031" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
</Service>
</Server>
還有2個文件裏面都有一個 cs.jsp文件:根目錄下
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
// 如果有新的 Session 屬性設置
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.println("<b>Session 列表</b><br>");
System.out.println("============================");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test2.jsp" method="POST">
名稱:<input type=text size=20 name="dataName">
<br>
值:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
上面講的是JK配置方式,如果操作無誤。Apache是可以正常啓動的,並且啓動2個Tomcat是可以自由分配的,因爲下面我還要說明2種方式實現,最終的運行結果圖 最後貼出:
下面說明ajp_proxy 方式配置:
去掉httpd.conf文件中下面內容的註釋(刪掉#號),開啓下邊的配置
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.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
注意:
除了mod_proxy.so,mod_proxy_balancer.so,mod_proxy_connect.so
如果是採用ajp_proxy,需要加載mod_proxy_ajp.so這個模塊;
如果是採用http_proxy,需要加載mod_proxy_http.so這個模塊;
在剛剛配置好的httpd.conf文件最下面加入:
ProxyRequests Off
<proxy balancer://controller> #controller 很明顯是剛剛work文件裏面配置的
BalancerMember ajp://127.0.0.1:9030 loadfactor=1 route=tomcat1 #這個Tomcat1 也是work文件配置的還有9030端口也是
BalancerMember ajp://127.0.0.1:9031 loadfactor=1 route=tomcat2
</proxy>
LoadModule jk_module modules/mod_jk.so
LoadModule rewrite_module modules/mod_rewrite.so
JkWorkersFile conf/workers.properties
JkMount /*.do controller
JkMount /*.jsp controller
JkLogLevel info
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://controller/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://controller/ #controller 是work文件裏面配置的
ErrorLog "logs/loadbalancer-error.log"
CustomLog "logs/loadbalancer-access.log" common
</VirtualHost>
這就配置完了ajp的訪問方式,重啓Apache如果不報錯,說明配置成功,如果有錯請根據Apache目錄logs目錄的日誌文件調錯
下面來講http的方式配置:
爲了節約時間我這裏就簡單粗暴的 處理了。
刪除httpd.conf下面 加的所有 代碼,注意 上面說解開註釋的那6行代碼別刪了
我這裏 就直接不要 mod_jk.conf 文件 直接都寫到 httpd.conf下面了
LoadModule jk_module modules/mod_jk.so
LoadModule rewrite_module modules/mod_rewrite.so
JkWorkersFile conf/workers.properties
JkMount /*.do controller
JkMount /*.jsp controller
JkLogLevel info
ProxyRequests Off
<proxy balancer://controller>
BalancerMember http://127.0.0.1:9020 loadfactor=1 route=tomcat1 #需要注意的是這裏以前是ajp切換成了http
BalancerMember http://127.0.0.1:9021 loadfactor=1 route=tomcat2 #還有這個端口就不是對應的以前那個9030端口了
</proxy>
下面貼出運行結果: 我這裏採用的ajp方式;
上面Tomcat配置中 改一下 :<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">改成下面的
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="6">
<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
最後說一點:找到apatch裏面conf下面的httpd.conf 文件下面的這段代碼
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
改成這樣,不然在配置靜態資源的時候是訪問不到的 提示你沒權限訪問
<Directory />
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
熱情提醒一下: 不要開防火牆啊 .......