寫在前面
apache配置多個tomcat,實現請求分流,多個tomcat服務均衡負載,增加服務的可靠性。最近研究了一下,遇到許多問題,記錄一下,方便以后查閱,不喜歡apache,nginx也是可以做到的。
准備
版本很重要,我就是由於版本原因,一直報錯
linux
使用 #
lsb_release -a
查看當前linux系統版本。
本例:CentOS Linux release 7.0.1406 (Core)
jdk
使用 #
java -version
查看當前版本,如果沒有,先裝好。download link
本例:java version “1.7.0_80”
tomcat
查看解壓安裝位置。download link
本例:apache-tomcat-7.0.69.tar.gz
apache
在linux系統中,apache服務主程序就是httpd,所以名稱也是httpd。使用 #
httpd -version
查看當前版本。這里是使用yum安裝download link
本例:Apache/2.4.6 (CentOS)
tomcat-connectors
tomcat-connectors是用來連接apache和tomcat的插件包,這個版本很重要,就是在找這個上面花了很長時間,主要是為了使用其編譯好的mod_jk.so 文件。在Apache 2.2.x 時可以直接下載 mod_jk-1.2.31-httpd-2.2.x.so
官方:mod_jk-1.2.31-httpd-2.2.x.so is for Apache 2.2.x. It has been build against version 2.2.3, but should work with Apache 2.2.0 and later. Rename to mod_jk.so before putting it in your modules directory or adjust your LoadModule statement.,
但是我使用的是Apache 2.4.6,使用yum安裝時,會默認安裝最新版本,#
yum list httpd
查詢時只有這一個。
所以這里要去下載新的中間包,並且需要編譯。download link
本例:tomcat-connectors-1.2.42-src.tar.gz
安裝
將這些軟件包,放置在一個文件夾下,我是放在 /home
下。這里主要的安裝是Apache安裝,我這里使用yum安裝:
- #
yum list httpd
#查看可安裝版本列表 - #
yum install httpd
#默認安裝 -
httpd -v
#安裝結束,查看安裝版本
如果出現安裝錯誤,可以查看apache包,例如httpd.x86_64 -
yum list|grep httpd
然后刪除相關依賴包。注意:刪除后你的一些配置還會保留起來。 -
yum erase httpd.x86_64
使用service httpd start
啟動Apache 服務,默認端口為80,直接訪問IP或域名看到頁面,說明啟動成功,失敗查看service httpd status
中的異常信息。
apache-tomcat-7.0.69.tar.gz,解壓即可
- #
tar zxvf /home/apache-tomcat-7.0.69.tar.gz
#解壓至當前文件夾 - #
cp /home/apache-tomcat-7.0.69 /usr/local/
#拷貝到/usr/local/文件夾下 - #
mv /usr/local/apache-tomcat-7.0.69 tomcat1
#修改文件夾名稱為tomcat1
本例是多個tomcat配置一個Apache所以上述操作還要做一遍,創建第二個tomcat,命名為tomcat2.
tomcat-connectors編譯並獲取mod_jk.so文件,
- #
tar zxvf /home/tomcat-connectors-1.2.42-src.tar.gz
- #
cd /home/tomcat-connectors-1.2.40-src/native
這里要注意一下,因為編譯時需要Apache bin包下的apxs工具,由於是yum按照,所以不會有bin包,這時就需要下載httpd-devel開發包,
- #
rpm -qa|grep httpd
#查看httpd安裝包列表 - #
yum -y install httpd-devel
#如果不存在就直接安裝 - #
which apxs
#查詢該工具位置,我這里是 /usr/sbin/apxs
接tomcat-connectors編譯…
-
[native]# ./configure --with-apxs=/usr/sbin/apxs
#=后面的位置就是上面安裝apxs位置,注意需要在/home/tomcat-connectors-1.2.40-src/native
目錄下操作。 -
[native]# make
#執行編譯
編譯成功后,在 /home/tomcat-connectors-1.2.40-src/native/apache-2.0/mod_jk.so 找到 mod_jk.so文件,將其復制到Apache module包下
- #
cp /home/tomcat-connectors-1.2.40-src/native/apache-2.0/mod_jk.so /etc/httpd/modules/
使用了全路徑,自己可以簡寫.
配置
創建兩個文件,利用 mod_jk.so插件包將Apache與tomcatx做關聯。
進入Apache配置文件
- #
cd /etc/httpd/conf
#進入配置文件夾 - #
vi mod_jk.conf
#創建文件,shift+: => q => Enter
關閉 - #
vi workers.properties
#創建文件,shift+: => q => Enter
關閉
打開mod_jk.conf文件,並寫入
#加載 mod_jk.so 文件,放置在最上 LoadModule jk_module /etc/httpd/modules/mod_jk.so #加載 tomcat 參數配置文件 JkWorkersFile conf/workers.properties #日志保存文件 JkLogFile /etc/httpd/logs/mod_jk2.log #日志等級 JkLogLevel info JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkRequestLogFormat "%w %V %T" #######請求攔截, controller負載均衡控制器名稱 JkMount /servlet/* controller JkMount /*.jsp controller JkMount /*.do controller ############## end #######################
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
打開workers.properties文件,並寫入
#server worker.list = controller #========tomcat1======== worker.tomcat1.port=11009 #端口號與tomcat一致 worker.tomcat1.host=localhost worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #========tomcat2======== worker.tomcat2.port=12009 #端口號與tomcat一致 worker.tomcat2.host=localhost worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========controller=負載均衡控制器名稱======= worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 #多個tomcat以","隔開 worker.controller.sticky_session=false worker.controller.sticky_session_force=1 #worker.controller.sticky_session=1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
將文件關聯創建好后,就需要加入Apache配置文件中,打開httpd.conf,增加包含mod_jk.conf文件。
- #
vi /etc/httpd/conf/httpd.conf
#打開文件 。 - #
Include /etc/httpd/conf/mod_jk.conf
#添加該行,建立關聯。 Listen 80
同時可以修改它的訪問接口,默認80。
做好關聯后現在,要修改tomcatx的server.xml 配置文件。部分修改為:
...
<!-- <Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" maxThreads="768" minSpareThreads="64" enableLookups="false" redirectPort="8443" /> --> <!-- 將該請求端口號該為 上面workers.properties文件中的一致,包括兩台--> <Connector port="11009" protocol="AJP/1.3" redirectPort="8443" /> ... <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1"> ... <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
測試
為了看一下這個集群配置是否配置成功,需要創建測試的簡單頁面,將其放在tomcat能夠訪問了ROOT中。命名為test.jsp
測試頁面內容為:
<%@ page contentType="text/html; charset=utf-8" %> <%@ 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=r equest.getParameter( "dataName"); if (dataName !=n ull && 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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
啟動Apache
- #
service httpd start
- #
service httpd status
#查看是否運行正常
啟動tomcatx
- #
cd /usr/local/tomcat{x}/bin
#打開bin目錄 - #
./startup.sh
#啟動 - #
tail -f ../logs/catalina.out
#查看打印console,ctrl + z
關閉退出
瀏覽器訪問:http://123.xx.xxx.xx/test.jsp
頁面顯示:ID 7B8C934D14F3EF669C437E5B1B8123DB.tomcat1
刷新:ID BBED560EC85BF46ABB639883B9DAF754.tomcat2
…
至此就完成了Apache+tomcat負載均衡配置了,還可以通過Apache 的 ApacheBench來簡單測試一下並發。
- #
ab -n 4000 -c 1000 http://123.xx.xxx.xx/
#4000請求 + 1000並發數 + 請求的地址,自己的服務器。
相關的一些數據就可以體現出來了,也可以先開一個tomcat試一下,在配置多個tomcat,進行對比測試。
總結
其實並不難,只是不夠細心,所有軟件都是需要配置並作關聯,抓住這一點,理清思路,問題解決的方法就很多。
網上資料被翻了個遍,自己以后也要記錄一些作為回饋。
相關參考:
- http://www.iteye.com/topic/1017961
- http://www.centoscn.com/CentosServer/www/2015/0417/5204.html
- http://www.ha97.com/4617.html
個人博客: http://www.abina.me/articles/2017/01/19/1484820029888.html