windows環境下使用JK1.2整合apache2.2和tomcat7

來源:互聯網
上載者:User

身邊有位同學這學期用PHP幫學校開發了好幾個網站,昨天去伺服器上部署時發現那台伺服器上既要跑IIS上的ASP網站,又要跑tomcat下的JSP網站,這回他又得去給裝個跑PHP的apache httpd,一下次不知道該怎麼辦了。我聽了也是一陣狂汗,這種案例大概也只有學校才會發生了。不過汗歸汗,問題還是要解決的,這種情況下主要有三種部署策略。

1、IIS、apache httpd、tomcat各自作為web server跑不同的網站,使用不同的連接埠,比如:IIS(80),apache httpd(8080),tomcat(9090)。這種方式最明顯的好處是直接,配置簡單,三個server各跑個的網站,互不影響。缺點是伺服器要額外開放8080和9090兩個連接埠,而且相應的PHP網站和JSP網站都要加上8080,9090的連接埠號碼,地址非常不容易記憶。

2、使用IIS和apache httpd做web server,tomcat作為Servlet容器與IIS整合。這樣IIS同時支援ASP與JSP網站,因此可以選擇預設連接埠號碼80,而apache httpd使用8080單獨跑PHP網站。這種方式的優點是只需要單獨開放8080連接埠即可,ASP與JSP的網站都可以使用預設連接埠,對使用者更加友好。而且如果JSP網站的訪問量比較大的話,可以用IIS來處理靜態資源(html,image,js,css等),效率比tomcat內建的web server要高的多。缺點是需要額外的配置來整合IIS與tomcat,操作比較麻煩。

3、與策略二類似,但是將tomcat與apache httpd進行整合,相應的apache httpd使用80連接埠跑PHP和JSP網站,IIS用8080連接埠跑ASP網站。

對於學校的網站部署,以上三種策略都沒什麼問題。要是偷懶的話首選策略一,但是考慮到生產環境下,人們更多地用apache與tomcat整合,我們也選擇了第三種策略。畢竟學生嘛,能學點東西最好啦:)

下面就介紹如何使用tomcat連接器JK,在windows環境下整合apache2.2與tomcat7

1.下載JK

首先,去tomcat的官網下載JK,目前的最新版本是1.2.32,選擇Binary Releases即可。

在Index中進入windows目錄,因為我們使用的apache版本為2.2,因此選擇下載tomcat-connectors-1.2.32-windows-i386-httpd-2.2.x.zip

解壓zip包,將其中的mod_jk.so動態連結程式庫檔案放到apache安裝目錄(下文用%APACHE_HOME%代替)的modules目錄下。

2.定義tomcat workers

什麼是tomcat worker?根據JK官方文檔的解釋,tomcat worker就是一個tomcat的執行個體,或者說,一個tomcat進程。它代表web server來處理對servlet的請求或者其他內容的請求。我們知道,apache httpd伺服器本身只可以處理靜態web資源,如果遇到了servlet請求,就需要交給我們定義的這個tomcat worker來處理了。那麼怎麼定義tomcat worker呢?

在JK中,使用屬性檔案workers.properties來定義一個或多個tomcat的執行個體。進入%APACHE_HOME%conf目錄,建立一個workers.properties檔案,鍵入一下內容:

# woker.list中可以定義多個worker,用空格分開,此處我們只需要一個worker即可
worker.list=localworker1
# 指定localworker1的屬性
worker.localworker1.type=ajp13 # 使用AJP/1.3協議串連
worker.localworker1.host=localhost # tomcat在本機上
worker.localworker1.port=8009 # AJP/1.3的預設連接埠號碼

我們在該檔案中定義了一個叫localworker1的tomcat執行個體,並指定其使用ajpv13協議與tomcat溝通。這是什麼意思呢?進入tomcat安裝目錄(下文用%TOMCAT_HOME%代替)下的conf目錄,查看server.xml中有關於ajpv13連接器的預設配置:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

以上表明,原生tomcat執行個體在8009連接埠啟動了AJP/1.3的連接器,apache httpd伺服器將通過AJP/1.3協議與該tomcat執行個體進行通訊!因此,上面worker的配置和tomcat的AJP13連接器的配置需要一致。

關於workers.properties的更多說明見http://tomcat.apache.org/connectors-doc/reference/workers.html

3.定義路由規則

有了tomcat woker,我們還需要指定什麼樣的請求由httpd伺服器處理,什麼樣的請求交給tomcat,即路由規則。通常,我們會把對web靜態資源(如html,image,css,js檔案)的請求交給web伺服器處理,將對servlet,jsp的請求交給tomcat處理。路由規則通常在一個叫做uriworkermap.properties的屬性檔案中定義。下面在%APACHE_HOME%conf目錄下建立uriworkermap.properties檔案,鍵入一下內容:

/*=localworker1
# 靜態檔案不由任何worker處理,交給apache httpd
!/*.gif=*
!/*.jpg=*
!/*.png=*
!/*.css=*
!/*.js=*
!/*.htm=*
!/*.html=*

這裡我們先將所有請求交給先前定義的tomcat worker處理,在用!文法指明某些靜態資源由apache httpd處理。這是JK官方推薦的寫法!我在其他網站的教程中發現很流行這樣的寫法:

/*.jsp=localworker1
/*.do=localworker1
/servlet/*=localworker1

這種寫法指定所有的jsp請求,action請求(使用struts架構的action請求通常以.do作為尾碼),和servlet請求交給tomcat處理,剩餘的請求交給apache httpd處理。強烈不建議,我認為這種寫法至少有以下兩點不足:

1. 限定了JSP網站的URL寫法。比如,JSP網站所有servlet的urlpattern必須為/servlet/*的形式,否則請求不會到達tomcat。

2. 重大安全隱患!如果不做其他配置,使用者將能夠訪問網站WEB-INF目錄下的web.xml和class目錄下的class檔案。這是因為tomcat本身是能禁止使用者訪問WEB-INF目錄的,而apache並不會。這種路由寫法只將jsp和servlet的請求交給tomcat處理,使用者請求/WEB-INF/web.xml時,apache httpd預設情況下自然會將檔案返回給使用者。第一種寫法就沒有這個問題,因為/WEB-INF/還是由tomcat處理的。

關於uriworkermap.properties的更多說明見http://tomcat.apache.org/connectors-doc/reference/uriworkermap.html

4. 定義VirtualHost

有人可能要問,如果像上面那樣配置,對PHP檔案的請求豈不是也交給tomcat處理了。嘿嘿,不會的,因為PHP網站和JSP網站會使用不同的網域名稱啊,apache httpd支援配置虛擬機器主機,即一個IP地址多個網域名稱,這樣的話,我們只需要正對JSP網站啟動JK即可。

虛擬機器主機的配置可以寫在%APACHE_HOME%conf/httpd.conf中,但是更推薦的寫法是修改%APACHE_HOME%conf/extra/httpd-vhosts.conf檔案。假設我們的PHP網站網域名稱為www.phpsite.com,JSP網站的網域名稱為www.jspsite.com,配置如下:

NameVirtualHost *:80

# php website host
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
ServerName www.phpsite.com
ErrorLog "logs/www.phpsite.com-error.log"
CustomLog "logs/www.phpsite.com-access.log" common
DocumentRoot "E:/PHP_WWW"
DirectoryIndex index.html index.php
</VirtualHost>

# java website host
<VirtualHost *:80>
ServerAdmin xxx@xxx.com
ServerName www.jspsite.com
ErrorLog "logs/www.jspsite.com-error.log"
CustomLog "logs/www.jspsite.com-access.log" common
DirectoryIndex index.html index.jsp

JkAutoAlias "E:/JSP_WWW"
JkMountFile "conf/uriworkermap.properties"
</VirtualHost>

其中E:/PHP_WWW和E:/JSP_WWW分別php網站和jsp網站的根目錄。

JkAutoAlias會將JSP網站的上下文映射到apache的目錄空間下。因此使用者訪問www.jspsite.com/hello/a.jpg時,apache就會去E:/JSP_WWW/hello/a.jpg目錄下找相應的靜態資源。

JkMountFile即指明剛才我們定義的路由規則屬性檔案的路徑。

5.修改tomcat的server.xml

下面開啟%TOMCAT_HOME%conf/server.xml,做如下修改:

1) 因為我們的server上還有IIS需要佔用8080連接埠,因此我們需要將tomcat預設的http server服務關閉,或更改連接埠。找到如下配置,將其注釋。

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

2)上面指定了jsp網站的目錄為E:/JSP_WWW,因此需要修改預設的appBase。

<Host name="localhost"  appBase="E:/JSP_WWW"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

3)為了測試,將%TOMCAT_HOME%webapps/目錄下的examples目錄拷貝到E:/JSP_WWW。

4)運行%TOMCAT_HOME%bin/startup.bat啟動tomcat,看到如下日誌表明啟動成功。

6.修改apache的httpd.conf檔案

下面我們來修改apache的主設定檔httpd.conf,開啟%APACHE_HOME%conf/httpd.conf

1)首先確認apache httpd的啟動連接埠為80:

Listen 80

2)然後找到載入模組的地區(一大串LoadModule開始的部分),在下面添加以下三行,載入jk_module:

LoadModule jk_module modules/mod_jk.so
JkWorkersFile "conf/workers.properties" #指定先前配置的worker檔案
JkLogFile "logs/mod_jk.log"

3)指定PHP網站的DocumentRoot,如果之前配過PHP的話,應該能找到如下配置(為了大家看起來方便,我去掉了所有注釋):

DocumentRoot "E:/PHP_WWW"
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
<Directory "E:/PHP_WWW">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

4)繼續往下找到Include檔案部分,去掉"#Include conf/extra/httpd-vhosts.conf"前的"#"號,包含我們剛才修改的虛擬機器主機設定檔。

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

5)儲存退出,啟動apache httpd。

7.測試組態是否成功

註:如果想在自己電腦上整合apache與tomcat,又沒有網域名稱的話,可以修改hosts檔案,在檔案最下面添加:

127.0.0.1 www.phpsite.com
127.0.0.1 www.jspsite.com

1)測試php網站。在E:/PHP_WWW目錄建立index.php,輸入:

<?
phpinfo();
?>

開啟瀏覽器,訪問"www.phpsite.com",見到如下頁面說明PHP網站能正常運行。

2)測試JSP網站。訪問"www.jspsite.com/examples"和"www.jspsite.com/examples/servlets/servlet/HelloWorldExample",前者測試能否訪問靜態資源index.html,後者測試能否訪問servlet。

我們還可以測試能否訪問到WEB-INF目錄,"www.jspsite.com/examples/WEB-INF/web.xml",按照上文第一種uriworkermap.properties寫法的話是訪問不到的:)

其他整合方式

apache2.2以後,除了使用JK來整合apache httpd與tomcat,還有一種更方便的方式,就是使用新增加的mod_proxy_ajp模組,我還沒試過,有興趣的朋友可以嘗試一下。不過JK總體來說還是會更強大一些,因為它還支援tomcat叢集,負載平衡相關的配置。

 


歡迎轉載,但是轉載請註明出處http://www.cnblogs.com/codingmyworld/archive/2011/12/08/2281057.html  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.