ubuntu下apache+tomcat+jk配置負載均衡
環境:
Ubuntu10.04
apache 2.2.24
tomcat 6.0.260
mod_jk mod_jk/1.2.26
負載均衡(Load Balance):
由於目前現有網絡的各個核心部分隨着業務量的提高,訪問量和數據流量的快速增長,其處理能力和計算強度也相應地增大,使得單一的服務器設備根本無法承擔。在 此情況下,如果扔掉現有設備去做大量的硬件升級,這樣將造成現有資源的浪費,而且如果再面臨下一次業務量的提升時,這又將導致再一次硬件升級的高額成本投 入,甚至性能再卓越的設備也不能滿足當前業務量增長的需求。
負載平衡:即把負載壓力根據某種算法合理分配到集羣中的每一臺計算機上,以減輕主服務器的壓力,降低對主服務器的硬件和軟件要求。
目前比較常用的負載均衡技術主要有
- 基於DNS的負載均衡
通過DNS服務中的隨機名字解析來實現負載均衡,在DNS服務器中,可以爲多個不同的地址配置同一個名字,而最終查詢這個名字的客戶機將在解析這個名字 時得到其中一個地址。因此,對於同一個名字,不同的客戶機會得到不同的地址,他們也就訪問不同地址上的Web服務器,從而達到負載均衡的目的
- 反向代理負載均衡 (如apache+JK2+Tomcat、apache+proxy http或 apache+proxy+ajp)
使用代理服務器可以將請求轉發給內部的Web服務器,讓代理服務器將請求均勻地轉發給多臺內部Web服務器之一上,從而達到負載均衡的目的。這種代理方 式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web服務器,而這種代理方式是多個客戶使用它訪問內部Web服務器,因此也被稱爲 反向代理模式。
3.基於NAT(Network AddressTranslation)的負載均衡技術 (如Linux Virtual Server,簡稱LVS)
網絡地址轉換爲在內部地址和外部地址之間進行轉換,以便具備內部地址的計算機能訪問外部網絡,而當外部網絡中的計算機訪問地址轉換網關擁有的某一外部地址 時,地址轉換網關能將其轉發到一個映射的內部地址上。因此如果地址轉換網關能將每個連接均勻轉換爲不同的內部服務器地址,此後外部網絡中的計算機就各自與 自己轉換得到的地址上服務器進行通信,從而達到負載分擔的目的。
***************************************************************************************************************************************************************************************
下文主要描述apache+JK2+Tomcat
相比之下 jk2 比http_proxy 和ajp_proxy 更穩定些,配置也更復雜一些
****************************************************************************************************************************************************************************************1 安裝 apache 和 2個tomcat
2 安裝mod_jk
sudo apt-get install libapache2-mod-jk
查看一下在apache2的啓動模塊中是否有jk.load
$sudo ls /etc/apache2/mods-enabled/
3 配置
/etc/libapache2-mod-jk/workers.properties
worker.list =controller,tomcat1,tomcat2 #server 列表
#========tomcat1========
worker.tomcat1.port=8009 #ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat1.host=localhost #tomcat的主機地址,如不爲本機,請填寫ip地址
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor = 1 #server的加權比重,值越高,分得的請求越多
#========tomcat2========
worker.tomcat2.port=8109 #ajp13 端口號,在tomcat下server.xml配置,默認8009
worker.tomcat2.host=localhost #tomcat的主機地址,如不爲本機,請填寫ip地址
worker.tomcat2.type=ajp13
worker.tomcat2.lbfactor = 1 #server的加權比重,值越高,分得的請求越多
#========controller,負載均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=tomcat1,tomcat2 #指定分擔請求的tomcat
worker.controller.sticky_session=1
對於業務系統
worker.controller.sticky_session_force=true 很必要
如果tomcat配置不對jvmRoute
worker.controller.sticky_session_force=true
會出現訪問不了系統
4 配置apache2.conf:
/usr/share/doc/libapache2-mod-jk/httpd_example_apache2.conf
裏的內容複製到 apache2.conf 的最後
# Sample mod_jk configuration
# for Apache 2
#
# for all commands/options available seethe manual
# provided in libapache-mod-jk-docpackage.
# The location where mod_jk will find theworkers definitions
JkWorkersFile/etc/libapache2-mod-jk/workers.properties
# The location where mod_jk is going toplace its log file
JkLogFile /var/log/apache2/mod_jk.log
# The log level:
# - info log will contain standard mod_jkactivity (default).
# - warn log will contain non fatal errorreports.
# - error log will contain also error reports.
# - debug log will contain all informationon mod_jk activity
# - trace log will contain all tracinginformation on mod_jk activity
JkLogLevel info
# Assign specific URLs to Tomcat. Ingeneral the structure of a
# JkMount directive is: JkMount [URLprefix] [Worker name]
# send all requests ending in .jsp toajp13_worker
JkMount /*.jsp controller
# send all requests ending /servlet toajp13_worker
JkMount /*/servlet/ controller
# JkUnmount directive acts as an oppositeto JkMount and blocks access
# to a particular URL. The purpose is tobe able to filter out the
# particular content types from mountedcontext.
# do not send requests ending with .gif toajp13_worker
#JkUnMount /servlet/*.gif controller
# JkMount / JkUnMount directives can alsobe used inside <VirtualHost>
# sections of your httpd.conf file.
5 修改tomcat配置文件server.xml
如果你在不同電腦上安裝tomcat,tomcat的安裝數量爲一個,可以不必修改tomcat配置文件
我這裏是在同一臺電腦上安裝兩個tomcat,所以需要更改其中一個的設置
打開tomcat2/conf/server.xml文件
tomcat1
<Engine name="Catalina"defaultHost="localhost"> 修改爲
<Engine name="Catalina"defaultHost="localhost" debug="0"jvmRoute="tomcat1">
tomcat2
<Engine name="Catalina"defaultHost="localhost"> 修改爲
<Engine name="Catalina"defaultHost="localhost" debug="0"jvmRoute="tomcat2">
端口修改
<Server port="8005"shutdown="SHUTDOWN">修改爲
<Server port="8105"shutdown="SHUTDOWN">
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"URIEncoding="UTF-8" />修改爲
<Connector port="8180"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"URIEncoding="UTF-8" />
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />修改爲
<Connector port="8109"protocol="AJP/1.3" redirectPort="8443" />
採用proxy_http的配置
#httpd.conf(Apache的配置文檔,如果想了解Apache相關配置參數,請看參考文獻)
#載入重要的模塊
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_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#設置負載均衡分配用的服務器
<Proxy balancer://apusicBalance>
BalancerMember http://1.2.3.4:6888/ route=tomcat1loadfactor=50
BalancerMember http://1.2.3.5:6888/ route=tomcat2 loadfactor=50
</Proxy>
#設置代理服務器轉發方式,stickysession就是會話保持,JSESSIONID就是Apusic的會話ID,nofailover就是說服務器沒有做集羣
ProxyPass / balancer://apusicBalance stickysession=JSESSIONID nofailover=On
ProxyPassReverse / balancer://apusicBalance
*****************************************************************************************************************************************************************************************
採用的是ajp_proxy的配置。
其中apache的配置如下:
#引入ajp模塊
LoadModule proxy_modulemodules/mod_proxy.so
LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so
#用於監控界面
LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so
ProxyPass/test balancer://mycluster stickysession=JSESSIONID
BalancerMember ajp://localhost:8009/testroute=tomcat1 loadfactor=50
BalancerMember ajp://localhost:9009/testroute=tomcat2 loadfactor=50
***************************************************************************************************************************************************************************************
需要注意的幾個地方
文章整理自網絡,因只用到jk,故proxy和ajp未作進步測試,僅供需要人士參考1 .Session 黏性 需要tomcat中server.xml配置
<Engine name="Catalina"defaultHost="localhost"> 修改爲
<Engine name="Catalina"defaultHost="localhost" debug="0"jvmRoute="tomcat1">
這樣在用戶請求中 的sessionId 會是 uuid.tomcat1 如70C011A23F79A154D8002FBFBABD4A82.tomcat1 這樣就知道你請求上次請求到那個服務器。
2. 測試JSP
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.*"%>
<html><head><title>ClusterApp Test</title></head>
<body>
<%
System.out.println("SessionID:"+ session.getId());
%>
Server Info:
<%
out.println(request.getServerName() +" : " + request.getServerPort()+"<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.print("<b>Session 列表</b><br>");
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="index2.jsp"method="POST">
名稱:<inputtype=text size=20 name="dataName">
<br>
數值:<inputtype=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>