Apache和Tomcat 配置負載均衡(mod-proxy方式)-無session共享、無粘性session
轉:https://blog.csdn.net/wangjunjun2008/article/details/38268483
mod-proxy方式實現負載均衡是利用了Apache 2.x版本自帶的mod_proxy模組使用代理技術來連線Tomcat;
http_proxy模式基於HTTP協議,要求Tomcat提供HTTP服務,也就是必須啟用Tomcat的HTTP Connector;
ajp_proxy模式基於AJP協議,要求Tomcat提供AJP服務,也就是必須啟用Tomcat的AJP Connector;
Apache2.2版本之後對mod-proxy模組進行了重寫,增強了其功能和穩定性.配置簡單,使用廣泛.
網上也有大量的相關文章.其具體包括http-proxy,ajp-proxy,ftp-proxy等方式.
採用mod-proxy的連線方式,Apache需要載入以下模組:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule manager_module modules/mod_manager.so
下面介紹http-proxy,ajp-proxy兩種最常用的方式.
一、準備工作
1) 軟體準備
Apache 2.2.25: http://httpd.apache.org/download.cgi
Tomcat 6.0.39: http://tomcat.apache.org/download-60.cgi
2) 軟體安裝
Windows下安裝Apache,並測試伺服器正常工作;
Linux下安裝 Apache 可參考: http://blog.csdn.net/wangjunjun2008/article/details/38314387;
Tomcat解壓縮,分別命名為tomcat1和tomcat2;並啟動tomcat測試其正常工作。
二、全域性配置
1) 編輯${HTTPD_HOME}/conf/httpd.conf檔案,開啟以下模組,以便讓Apache啟動時自動載入:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule manager_module modules/mod_manager.so
2) 編輯${HTTPD_HOME}/conf/httpd.conf檔案,找到<IfModule dir_module>,在DirectoryIndex index.html 後加上 index.jsp;
這一步只是為了配置完tomcat後能看到小貓首頁,可以不做。
3) 分別修改tomcat1和tomcat2的server.xml檔案,修改如下標籤的埠及,並新增jvmRoute屬性:
tomcat1修改後的內容:
<Server port="8010" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" ... redirectPort="8443" />
<Connector port="8090" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
tomcat2修改後的內容:
<Server port="8011" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1" ... redirectPort="8443" />
<Connector port="8091" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
三、負載均衡配置
對於http_proxy方式,配置如下:
ProxyPass / balancer://httpproxy/
<Proxy balancer://httpproxy/>
BalancerMember http://127.0.0.1:8080/
BalancerMember http://127.0.0.1:8081/
</Proxy>
#配置負載均衡管理介面;訪問地址為 http://localhost/balancer-manager/
<Location /balancer-manager>
SetHandler balancer-manager
order Allow,Deny
#Deny from All
Allow from 127.0.0.1
</Location>
【說明】
"httpproxy"是叢集名稱(可為任意名稱)
8080,8081分別對應tomcat的http協議埠;
如此,即可實現apache和tomcat基於http_proxy方式的負載均衡.
訪問 http://localhost/balancer-manager 開啟如下頁面,
對於ajp_proxy方式,配置如下:
ProxyPass / balancer://ajpproxy/
<Proxy balancer://ajpproxy/>
BalancerMember ajp://127.0.0.1:8090/
BalancerMember ajp://127.0.0.1:8091/
</Proxy>
【說明】 8090,8091分別對應tomcat的ajp協議埠;
如此,即可實現apache和tomcat基於ajp_proxy方式的負載均衡.
訪問 http://localhost/balancer-manager 開啟如下頁面,
如需具體控制負載均衡中各個節點的負載比例,則將以上配置作如下修改:
ProxyPass / balancer://ajpproxy/
<Proxy balancer://ajpproxy/>
BalancerMember ajp://127.0.0.1:8090/ loadfactor=1 route=tomcat1
BalancerMember ajp://127.0.0.1:8091/ loadfactor=2 route=tomcat2
</Proxy>
[說明]
loadfactor 是負載因子(取值範圍是1~100),Apache會按照指定數字的比例分發請求(數值越大,處理的請求越多);
比如,兩個tomcat的數字都是1,則按1:1的比例分發請求;若是2和1,則按2:1的比例分發請求;
"route=tomcat1" 是負載均衡的節點名稱(可為任意名稱,但不可重複);
四、新增測試程式碼
分別在tomcat1和tomcat2新增如下程式碼:
在${Tomcat_Home}/webapps/下新建test目錄,在test目錄下新建test.jsp檔案,檔案內容為:
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %> <html> <head> </head> <body> <% out.println("Server IP = " + request.getLocalAddr() + "<br>"); out.println("Server Port = " + request.getLocalPort() + "<br>"); out.println("<br>"); out.println("SessionId = " + session.getId() + "<br>"); out.println("<br>"); String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<b>Session 列表</b>"); 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="test.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>
五、進行負載均衡測試
啟動Apache和tomcat1,tomcat2,訪問http://localhost/test/test.jsp,
可以看到包括伺服器地址、埠、SessionId等資訊在內的頁面,如下圖:
[說明]
此處的SessionId多了”.tomcat0”,說明處理當前請求的伺服器是節點為tomcat0的Tomcat;
如果需要向叢集中增加節點,首先需要對新增的Tomcat作類似配置,然後修改${Apache_Home}/conf/httpd.conf 檔案,增加BalancerMember,指向新增的tomcat即可。