Apache httpd + tomcat 簡單集群


集群其實很簡單,我們就來說一下httpd+tomcat集群都要注意哪些部分:

首先使用的東西有

apache-tomcat-8.0.32      下載地址: http://tomcat.apache.org/download-80.cgi

httpd-2.4.18-x86-vc11-r3/Apache24     下載地址:http://httpd.apache.org/download.cgi        http://apache.opencas.org//httpd/binaries/win32/        http://www.apachehaus.com/cgi-bin/download.plx    

tomcat-connectors-1.2.40-windows-i386-httpd-2.4.x/mod_jk.so   下載地址:  http://tomcat.apache.org/download-connectors.cgi       http://archive.apache.org/dist/tomcat/tomcat-connectors/jk/  

(tomcat-connectors-1.2.40-windows-x86_64-httpd-2.4.x/mod_jk.so)看你是64位系統還是32位系統,當然也要看是windows平台還是linux平台

1,首先如果你決定使用用集群了, 那么你的web.xml中一定要有<distributable/>

下邊是一個最簡單的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<distributable />

<display-name>Archetype Created Web Application</display-name>

<welcome-file-list>
  <welcome-file>index.html</welcome-file>
</welcome-file-list>

</web-app>

2,對tomcat進行配置

如果你是單機啟動多個tomcat的話一定要多注意幾個點:

1)

<Server port="8006" shutdown="SHUTDOWN"> shutdwon server port,如果你是單機啟動多個tomcat的話,這個端口盡量要每個都不一樣。

<Listener className="org.apache.catalina.startup.VersionLoggerListener" />

2)

<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

 注意一下這個協議下和這個端口, 這就是你單機、單個tomcat啟動后,訪問tomcat的端口。也就是:http://localhost:8081/webapplication/index.jsp.

redirectPort="8443" 這個可以暫時不用管,tomcat默認不用啟動 ssProtocol 協議,如果你啟動了話,詳細可以找找tomcat配置https ssl tls相關的內容,這個端口也要每個tomcat都各不一樣。

<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->

 3)

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

這個地方是一定要注意的,因為 apache Httpd 和tomcat通信鏈接就是用這個端口,如果你是單機啟動多個tomcat,這個端口也要每個都不一樣。

關於ajp/1.3這個可以自己去查一下,記住ajp13。因為后邊 apachehttpd 會用到這個,而且mod_jk的配置有個ajp13

4)

<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">

這個要看一下每個tomcat都要不一樣,無論單機啟動多個,還是多機啟動多個。這個名字要記住,這個會和apache httpd mod_jk 中的worker名字對應,必須樣一樣!

5)

<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

這個地方注釋放開,這個使用的tomcat提供的默認的simpleTcpCluster即可,更多詳細配置參見:

http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html

http://tomcat.apache.org/tomcat-8.5-doc/index.html

到此 tomcat server.xml配置完畢,可以先啟多個tomcat試試了tomcat了。

3,配置apache httpd

關於httpd的安裝不多說了,找到\Apache24 目錄,

把開始准備好的mod_jk.so放進Apache24\modules目錄中,在這個目錄中你會看有很多*.so文件,對這些都是鏈接庫文件,就是這個目錄,放進去。

注意的是和版本號,和系統,和多少位的系統,還有和(httpd是x64還是x86)都是緊密相關的,不要選錯了mod_jk.so。

1)配置,首先要修改httpd.conf, 在Apache24\conf 目錄先回找這個文件(關於Apachehttp的目錄結構,可以自己下去多了解)

在httpd.conf的最后添加一行:

# Add mod_jk for tomcat load blance
Include conf/extra/mod_jk.conf   #這個文件現在當然不存在了, 需要你創建的。

文件部分截圖如下: 
# Secure (SSL/TLS) connections
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
#Include conf/extra/httpd-ssl.conf
Include conf/extra/httpd-ahssl.conf
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>

# Add mod_jk for tomcat load blance
Include conf/extra/mod_jk.conf

2)按照目錄創建文件: conf/extra/mod_jk.conf

 完整目錄: Apache24\conf\extra\mod_jk.conf

mod_jk.conf文件里的內容要寫些什么呢,下邊是最簡單的配置可以直接copy使用:

更多詳細配置參考網站: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

#
# Load mod_jk for tomcat load blance
#

#Load mod_jk module(加載mod_jk.so庫)
LoadModule jk_module modules/mod_jk.so
#Where to find workers.properties(workers配置文件,這里邊就配置了tomcat的集群信息,這個文件現在也不存在,需要自己創建)
JkWorkersFile conf/workers.properties
#Where to put jk shared memory(配置內存共享文件)
JkShmFile logs/httpd/mod_jk.shm
#Where to put jk logs(配置log文件)
JkLogFile logs/httpd/mod_jk.log
#Set the jk log level [debug/error/info](配置log級別,這里log級別開成info即可,有時在window下運行,會有莫名奇妙的問題,比如說權限,不報任何錯誤,但是運行不成功,所以開一打開debug看看。Windows先一定是run as Adminstator!,要不然你會看到log中有什么...創建shared memory之類的錯誤)
JkLogLevel debug
#Send servlet for context /examples to worker named worker1

#(配置一些過濾器,類似web中的過濾器,哪些路徑文件走哪個worker, 特比要注意 controller,這個名字可以隨便起,但是受限制於將要創建的workers.properties文件,要記住這個名字必須和worker.properties中的worker名字一致)
#JkMount /servlet/* controller
#JkMount /servlets/* controller
#Send JSPs for context /examples to worker named worker1
#JkMount /*.jsp controller
#JkMount /*.html controller
#JkMount /*.htm controller
JkMount /* controller
#monitor the cluster status(監控集群狀態的配置,status同上,可以使用http://localhost/jkstatus監控集群狀態)
JkMount /jkstatus status

3)創建 conf/workers.properties

全路徑:Apache24\conf\workers.properties

workers.properties要寫什么呢?tomcat集群的信息:

詳細的配置和說明參考: http://tomcat.apache.org/connectors-doc/reference/workers.html

示例代碼,可以直接copy 使用

worker.list=controller,status      ####看到沒,這個就是那個controller

worker.maintain=60

#========tomcat1========
worker.tomcat1.type=ajp13      ####還記得開始要注意的jvmRoute嗎?還記得讓記住的ajp13嗎?
worker.tomcat1.host=localhost  ####這個是一個ip地址,如果不是本機的直接給遠程機器的IP
worker.tomcat1.port=8010       ####還記得開始讓注意的 protocol="AJP/1.3" 的端口嗎,就是它。
worker.tomcat1.lbfactor=1        ####負載均衡的一個因數,類似權重之類的,做集群負載均衡使用

#========tomcat2========
worker.tomcat2.type=ajp13
worker.tomcat2.host=localhost
worker.tomcat2.port=8011
worker.tomcat2.lbfactor=1

#========tomcat3========
worker.tomcat3.type=ajp13
worker.tomcat3.host=localhost
worker.tomcat3.port=8012
worker.tomcat3.lbfactor=1

#========controller,負載均衡控制器========
worker.controller.type=lb          ####負載均衡控制器,類似一個虛擬的worker,type必須是lb
worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3      ####負載均衡集群中所有的tomcat都在這里了
worker.controller.sticky_session=true     #### 多個tomcat之間session的處理,使用不使用sticky的方式
worker.controller.sticky_session_force=1

worker.status.type=status        #### 整個配置,包括集群中的tomcat的狀態的查看。

到此所有的配置全部完畢。

現在可以重啟tomcat和apache httpd了,如果你的配置沒有問題的話,現在你就可以訪問你的單個的tomcat,同時也可以訪問你的apache httpd的集群入口。

下邊給出一個session測試的頁面,來測試session的情況。當然你必須要做成webapplication,因為需要web.xml 中的 <distributable /> 還記得不?

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<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="test.jsp" method="POST">
名稱:<input type=text size=20 name="dataName"> <br/>
值:<input
type=text size=20 name="dataValue"> <br/>
<input type="submit" value="submit">
</form>
</body>
</html>

好了,文章到此應該技術了,關於集群 session 復制,初告一段落。

其實還有很多要思考的,再想一些websocket的應用,怎么弄, 比如使用websocket+html5在頁面上畫圖,這個集群怎么弄呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM