最近在服務器上需要配置多個應用,使用apache+tomcat搭配,采用mod_jk進行分配。
剛開始在同一個tomcat中配置了多個應用,后來感覺效果不好,改為每個tomcat對應一個應用。搜索資料如下:
apache2.2與tomcat集成(可以多個tomcat)
1. 安裝
apache2.2 參見:
http://ttitfly.javaeye.com/admin/show/127337
2.需求概況:
有2個服務:www.test.com, bbs.test.com。分別對應2個tomcat下的2個web應用。由
apache httpd作為互聯網接入服務器,在80端口接收對這2個服務的請求。
apache httpd再將這2個請求分別對應到不同的后端web服務器(Tomcat)處理。
3.配置域名映射到本機即127.0.0.1,同時配置service域名
- 127.0.0.1 localhost www.test.com www.service.test.com bbs.test.com bbs.service.test.com
127.0.0.1 localhost www.test.com www.service.test.com bbs.test.com bbs.service.test.com
4. 分別在2個tomcat里分別部署一個非常簡單的應用。
第一個tomcat :端口:8080
編輯$TOMCAT_HOME/conf/server.xml
添加一個Host
<Host name="www.service.test.com" unpackWARs="true" autoDeploy="true"
- xmlValidation="false" xmlNamespaceAware="false"/>
<Host name="www.service.test.com" unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false"/>
再在$TOMCAT_HOME/conf/Catalina下建立一個目錄:www.service.test.com
然后在www.service.test.com目錄下建立一個ROOT.xml,內容為:
- <Context docBase="/home/mahaibo/app/test"
- privileged="true" antiResourceLocking="false" antiJARLocking="false">
- </Context>
<Context docBase="/home/mahaibo/app/test"
privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
docBase指向具體的項目路徑
同理第二個tomcat(端口8088)也是一樣的做法:
編輯$TOMCAT_HOME/conf/server.xml
添加一個Host:
- <Host name="bbs.service.test.com" unpackWARs="true" autoDeploy="true"
- xmlValidation="false" xmlNamespaceAware="false"/>
<Host name="bbs.service.test.com" unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false"/>
然后在$TOMCAT_HOME/conf/Catalina下建立一個目錄:bbs.service.test.com
再在bbs.service.test.com目錄下建立一個ROOT.xml,內容為:
- <Context docBase="/home/mahaibo/app/bbs"
- privileged="true" antiResourceLocking="false" antiJARLocking="false">
- </Context>
<Context docBase="/home/mahaibo/app/bbs"
privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
5. 分別啟動tomcat,可以通過http://www.service.test.com:8080和http://bbs.service.test.com:8088訪問
6. 配置
apache httpd.conf文件。
找到apach/conf/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_http_module modules/mod_proxy_http.so
- LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
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
并增加虛擬主機配置:
- NameVirtualHost *:80
- <VirtualHost *:80>
- ServerName www.test.com
- ProxyIOBufferSize 8192
- ProxyRequests Off
- ProxyVia Full
- ProxyPass / http:
- </VirtualHost>
-
- <VirtualHost *:80>
- ServerName bbs.test.com
- ProxyIOBufferSize 8192
- ProxyRequests Off
- ProxyVia Full
- ProxyPass / http:
- </VirtualHost>
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.test.com
ProxyIOBufferSize 8192
ProxyRequests Off
ProxyVia Full
ProxyPass / http://www.service.test.com:8080/ smax=5 max=20 ttl=120 retry=300
</VirtualHost>
<VirtualHost *:80>
ServerName bbs.test.com
ProxyIOBufferSize 8192
ProxyRequests Off
ProxyVia Full
ProxyPass / http://bbs.service.test.com:8088/ smax=5 max=20 ttl=120 retry=300
</VirtualHost>
7.啟動
apache
- ./<SPAN class=hilite1>apache</SPAN>ctl start
./apachectl start
8 可以通過訪問http://www.test.com和http://bbs.test.com來分別訪問2個不同tomcat下的不同應用了。
apache+tomcat配置負載均衡的網站
1. 目標
使用 apache 和 tomcat 配置一個可以應用的 web 網站,要達到以下要求:
1、 Apache 做為 HttpServer ,后面連接多個 tomcat 應用實例,并進行負載均衡。
2、 為系統設定 Session 超時時間,包括 Apache 和 tomcat
3、 為系統屏蔽文件列表,包括 Apache 和 tomcat
2. 安裝 tomcat
2.1. 下載,解壓 tomcat
不要下載安裝版 , 下載地址
http://tomcat.apache.org
2.2. 配置 tomcat
2.2.1. 配置 server 的關閉口
我們需要在一臺機器上跑 2 個不同的 tomcat ,需要修改不同的 tomcat 的關閉口,避免出現端口被占用的情況。在 server.xml 中找到 server, 將:
<Server port="8005" shutdown="SHUTDOWN">
改為
<Server port="XXXX" shutdown="SHUTDOWN">
XXXX 在這里表示不同的端口:我的兩個 tomcat 分別使用 8035 , 8045
注意:這里之所以要配置不同的 tomcat 關閉口,只是因為我們使用了多個 tomcat ,其實用一個 server 多個實例也可以。
2.2.2. 配置 service
我們需要對不同的 tomcat 的 service 取不同的名字,在 server.xml 中找到:
<Service name="Catalina">
改為:
<Service name="XXXX">
兩個 service 分別為 tomcat6 和 tomcat5
2.2.3. 配置 Connector
這個部分主要是要改兩個 Connector ,當然前提是你的 tomcat 只有兩個 Connector 。
修改 ajp1.3 的端口:
找到: <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
改為: <Connector port="XXXX" protocol="AJP/1.3" redirectPort="8443" />
兩個 Service 的 ajp/1.3 的端口分別為: 8019 , 8029
修改 http 的端口:
找到:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" />
改為:
<Connector port="XXXX" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" />
兩個 Service 的 ajp/1.3 的端口分別為: 8060 , 8070
2.2.4. 配置 Engine
Engine 主要是配置 jvmRoute 屬性,找到:
<Engine name="Catalina" defaultHost="localhost">
改為:
<Engine jvmRoute="XXXX" name="Catalina" defaultHost="localhost">
兩個實例分別為: tomcat6 和 tomcat5.
2.2.5. 配置公用性 Context
如果有 Context 是多個系統公用的,比如圖片等的存放地,可以做個配置:
在 Host 中增加:
<Context path="/image" docBase="D:"webRoot"image" debug="0" reloadable="false" crossContext="true">
</Context>
2.2.6. 屏蔽文件列表
打開 tomcat 目錄下的 conf/web.xml ,
找到:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
將 listings 參數改為 false;
2.3. 配置應用 (web.xml)
對系統應用做些控制。
配置 session 過期時間,大多數網站用戶都只是做些瀏覽性的操作,為了減輕服務器負載壓力,我們將 session 超時時間從默認的 30 分鐘變為 5 分鐘。
在 web 應用程序的 web.xml 中 servlet-mapping 之后增加如下一段:
<session-config>
<session-timeout>5</session-timeout>
</session-config>
3. 安裝 Apache
3.1. 下載、安裝 Apache
下載地址 http://httpd.apache.org/download.cgi
下載后點擊安裝 msi 文件。
安裝的時候沒有什么特別需要注意的地方,按照默認就行了。是否安裝為 service 看具體情況而定。
3.2. 下載、安裝 Apache 、 tomcat 的 Connector
http://tomcat.apache.org/download-connectors.cgi
注意,很多網站上都介紹是 JK2 ,可能是覺得 JK2 比 JK 要新吧,其實 JK2 已經停止研發了,建議使用 jk1.2 。
下載壓縮包,之后將 module 目錄中的 mod_jk-apache****.so 文件放入 /module/ 目錄下。
3.3. 配置 Apache ( httpd.conf )
3.3.1. 配置端口:
找到
Listen 80
改為
Listen **
當然如果不需要改的話,就不用改了。正常情況無須更改。
3.3.2. 配置 DocumentRoot
找到 DocumentRoot 段,將其改為:
DocumentRoot "E:/MyWebsite"
這里的 "E:/MyWebsite" 指的是你的 web 程序的根路徑,視具體應用而定。
3.3.3. 配置 serverName
找到 serverName 這個段,將其配置為你的 ServerName
如果沒有配置為域名,配為 IP 也可以,此處還不是很清楚,多虛擬主機的情況的配置。
3.3.4. 配置虛擬主機
<VirtualHost *:80>
ServerAdmin flyffa@gmail.com
DocumentRoot E:/MyWebsite
ServerName localhost
DirectoryIndex index.html index.htm index.jsp
ErrorLog logs/error_log
CustomLog logs/access_log common
ErrorDocument 404 /sys/logon.jsp
</VirtualHost>
3.4. 配置 JK 方式的負載均衡
3.4.1. 配置 module
我們需要與 tomcat 做連接,所以要把 tomcat 的 connector 的模塊配置進去。
在 LoadModule 部分加入:
LoadModule jk_module modules/mod_jk-apache-2.0.55.so -加載模塊
這個 so 是我下載的版本,個人可以根據自己下載的文件名加以配置
JkWorkersFile conf/workers.properties -指定 connector 的配置文件名稱
JkLogFile logs/mod_jk.log -指定 connector 的日志文件名稱
JkLogLevel info -指定 connector 的日志等級
3.4.2. 配置 worker 列表 (conf/workers.properties)
定義列表
worker.list=tomcat6,tomcat5,loadbalancer
定義一個名為 “loadbalancer” 的 worker
其作為對多個 Tomcat 進程的負載平衡使用:
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat5, tomcat6
( 負載平衡類型的 worker 并不與 Tomcat worker 通訊,它負責管理這些 Tomcat worker 。 )
定義多個 worker 列表
# Set properties for tomcat6 (ajp13)
worker.tomcat6.type=ajp13
worker.tomcat6.host=localhost
worker.tomcat6.port=8019
worker.tomcat6.lbfactor=50
worker.tomcat6.cachesize=10
worker.tomcat6.cache_timeout=600
worker.tomcat6.socket_keepalive=1
worker.tomcat6.reclycle_timeout=300
# Set properties for tomcat5 (ajp13)
worker.tomcat5.type=ajp13
worker.tomcat5.host=localhost
worker.tomcat5.port=8029
worker.tomcat5.lbfactor=50
worker.tomcat5.cachesize=10
worker.tomcat5.cache_timeout=600
worker.tomcat5.socket_keepalive=1
worker.tomcat5.reclycle_timeout=300
注意: lbfactor= 50 ( 當此 Tomcat worker 被用于一個負載平衡 worker 使用時,此屬性將被使用。它定義了此 worker 的負載平衡權值。 )
cachesize= 10 ( 當在多線程的 web server (例如 apache2.0 、 IIS 、 Netscape )中使用 JK 時,此屬性是有效的。如果將 cachesize 的值設置為較高的值,這些支持多線程的 web server 將獲得很好的處理能力。如果此屬性不被設置,則連接 cache 特性將失效。 )
3.4.3. 配置 Apache 到 tomcat 的橋接
在 DocumnetRoot 片段下加入
JkMount /*.jsp tomcat6
JkMount /*.do tomcat6
JkMount /*Servlet tomcat6
這里只是簡單的將 apache 的請求轉到其中的一個 tomcat 中,形成橋接,至于負載均衡的時候,就無須進行這步操作,直接啟動負載均衡。啟動負載均衡見下一節。
3.4.4. 啟動負載均衡
在 DocumnetRoot 片段下加入
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
JkMount /*Servlet loadbalancer
-指定對所有的請求啟動負載均衡,這里的 loadbalancer 是定義的 worker 的名字
這里我在配置的時候犯了兩個錯誤:
第一是沒有配置 JkWorkersFile conf/workers.properties ,以為 Apache 會自動認識(其實 apache 是自動產生了一個叫做 ajp13 的 worker ,指向本機的 8009 端口)。
第二是以為 JkMount 語句中出現 loadbalancer,ajp13 之類的是系統設定的東西,其實都是在 workers.properties 文件中定義的,結果出現名字不匹配的情況。后來配置了 JkLogFile logs/mod_jk.log 之后看到錯誤日志才明白。
3.5. 配置 Proxy 方式的負載均衡
使用 Apache2.1 以上的版本,就可以用 mod_proxy_ajp 來完成負載均衡的配置,不過到目前為止,沒有看到如何讓 Apache 負責靜態部分, tomcat 負責動態部分的配置方式,只能用 path 進行區分分發請求。如:在虛擬主機的配置中增加:
ProxyPass / ajp://localhost:8019/
ProxyPassReverse / ajp://localhost:8019/
而形如:
ProxyPass /*.jsp ajp://localhost:8019/
ProxyPassReverse /*.jsp ajp://localhost:8019/
這樣的配置是不能通過的。