Apache和tomcat服務器使用ajp_proxy模塊


首先我們先介紹一下為什么要讓Apache與Tomcat之間進行連接。事實上Tomcat本身已經提供了HTTP服務,該服務默認的端口是8080,裝好tomcat后通過8080端口可以直接使用Tomcat所運行的應用程序,你也可以將該端口改為80。

既然Tomcat本身已經可以提供這樣的服務,我們為什么還要引入Apache或者其他的一些專門的HTTP服務器呢?原因有下面幾個:

1. 提升對靜態文件的處理性能;

2. 利用Web服務器來做負載均衡以及容錯;

3. 無縫的升級應用程序。

這三點對一個web網站來說是非常之重要的,我們希望我們的網站不僅是速度快,而且要穩定,不能因為某個Tomcat宕機或者是升級程序導致用戶訪問不了,而能完成這幾個功能的比較好的HTTP服務器是 apache 的 http server了,它跟tomcat的結合是最緊密和可靠的。

在Apache2.2之前,一般有兩個組件可選擇。mod_jk和mod_jk2。后來mod_jk2由於沒有開發人員的支持,沒更新了,轉而更新mod_jk,所以現在一般都使用mod_jk做Apache和Tomcat的連接器。要指出的是mod_jk支持 Apache 1.x和2.X系列。

不過,自從Apache2.2出來后,又多了兩種種選擇,那就是 proxy-ajp 和 http-proxy。大家知道Apache里的proxy模塊,可以實現雙向代理功能,功能非常強大。其實從連接器的實現原理上來說,用proxy模塊來實現是非常自然的。proxy模塊的功能無非就是把相關的請求發給特定的主機再返回結果。那連接器的功能需求就是要把所有對Servlet/JSP的請求都轉給后台的Tomcat。而且所FreeBSD郵件列表上說,使用proxy-ajp要比 mod_jk的效率要高。看來,使用Apache自帶模塊,要比另外編譯的來得可靠。

既然有了ajp_proxy 專門的 ajp 協議代理,http-proxy 就沒有必要使用這種方法了。

我主要測試成功了ajp_proxy ,http-proxy沒有測試,jk 配置了一整天,沒有成功,但是把主要過程附在后面,在必須要用 jd 這種方法時,作為參考。

環境: apache 2.2.4,tomcat 5.5,jdk1.5,winxpsp2

apache 2.2 及后續版本,在配置文件上面進行了調整,把一些配置繁瑣的設置獨立出來,在需要的時候再包含進主配置文件,以簡化 httpd.conf 的文件管理。

一. ajp_proxy (重點采取的方法)

1. 開啟代理模塊

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

引入虛擬主機文件

# Virtual hosts

#Include conf/extra/httpd-vhosts.conf

去掉 #

2. 配置 ajp-proxy

為了針對不同的虛擬主機做不同的配置策略,把 ajp-proxy 的配置寫在每個虛擬主機配置文件中,而不要寫在全局配置中。

Apache2.2/conf/extra/httpd-vhosts.conf 文件中

#

# Use name-based virtual hosting.

#

NameVirtualHost *:80

#

# VirtualHost example:

# Almost any Apache directive may go into a VirtualHost container.

# The first VirtualHost section is used for all requests that do not

# match a ServerName or ServerAlias in any <VirtualHost> block.

#

# proxy 實現代理

# 實現 www.code.com 虛擬主機

<VirtualHost *:80>

    ServerAdmin webmaster@code.com

    DocumentRoot E:/program/www/www.code.com

    ServerName www.code.com

    ServerAlias code.com

  

   # 不需要代理的,apache 直接解析目錄,用"!"

   # 順序很重要,您需要把拒絕指令放置在普通ProxyPass指令之前

   ProxyPass /images/ !

   ProxyPass /css/ !

   ProxyPass /js/ !

   ProxyPass /php/ !

   # 轉發所有非禁止的請求

   ProxyPass / ajp://127.0.0.1:8009/

   ProxyPassReverse / ajp://127.0.0.1:8009/

  

   #轉發指定目錄的請求

   #ProxyPass /jsp/ ajp://127.0.0.1:8009/jsp/

   #ProxyPassReverse /jsp/ ajp://127.0.0.1:8009/jsp/

   #ProxyPass /servlet/ ajp://127.0.0.1:8009/servlet/

   #ProxyPassReverse /servlet/ ajp://127.0.0.1:8009/servlet/

   #負載均衡,未測試

   #ProxyPass / balancer://example/

   #<Proxy balancer://example/>

   #BalancerMember ajp://server1:8080/

   #BalancerMember ajp://server2:8080/

   #BalancerMember ajp://server3:8080/

   #</Proxy>

  

    # logs

    # 一定要保證 E:/program/www/www.code.com/logs/httpd/ 目錄存在,否則 apache 不能啟動

    ErrorLog E:/program/www/www.code.com/logs/httpd/www.code.com_log

    CustomLog E:/program/www/www.code.com/logs/httpd/www.code.com_log common

   # 允許apache訪問虛擬主機所在的目錄   

    <Directory "E:/program/www/www.code.com">

        Options Indexes FollowSymlinks MultiViews

        AllowOverride None

        Order allow,deny

        Allow from all

    </Directory>

   # 禁止apache訪問虛擬主機所在的目錄中的WEB-INF目錄

   # 由於上述設定了轉發所有的請求,tomcat 自然不會訪問此目錄,但也加在這里,用以明顯申明。

    <Directory ~ "/WEB-INF/">

     Order deny,allow

     Deny from all

   </Directory>

   # 禁止apache訪問虛擬主機所在的目錄中的META-INF目錄

   # 由於上述設定了轉發所有的請求,tomcat 自然不會訪問此目錄,但也加在這里,用以明顯申明。

   <Directory ~ "/META-INF/">

     Order deny,allow

     Deny from all

   </Directory>

</VirtualHost>

apache-tomcat-5.5.17/conf/server.xml 中

<Host name="www.code.com" debug="0" appBase="E:/program/www/"

   unpackWARs="true" autoDeploy="true"

   xmlValidation="false" xmlNamespaceAware="false">     

<Logger className="org.apache.catalina.logger.FileLogger"

           directory="E:/program/Apache2.2/logs/httpd" prefix="standard_log." suffix=".txt"

      timestamp="true"/>

           

      <Context

      path="" docBase="E:/program/www/code.com" debug="1" privileged="true" reloadable="true">

    </Context>

     

</Host>

說明:

1. 為了針對不同的虛擬主機做不同的配置策略,把 ajp-proxy 的配置寫在每個虛擬主機配置文件中,而不要寫在全局配置文件 httpd.conf 中。當啟用虛擬主機配置文件 httpd-vhosts.conf 之后,主配置文件 httpd.conf 中的主機配置被替代,即只能訪問 httpd-vhosts.conf 中配置的虛擬主機。

2. 虛擬主機的目錄設置結構盡量清晰,如 /www 為所有虛擬主機的根目錄的上級目錄,各個虛擬主機的根目錄都在 www 下面,如 www.code.com 虛擬主機的根目錄為 /www/www.code.com。這樣設置也方便 tomcat 虛擬主機設置(具體見 tomcat 設置文章)。

3. 相應的,tomcat 中也要設置對應的虛擬主機,才可以正確轉發。

(故 http://www.code.com   和 http://www.code.com:8080 會訪問同一個虛擬主機目錄)

(修改 http://localhost:8080 的虛擬主機的內容,設置一個歡迎界面,代替默認的首頁)

4. 為了簡化配置工作,可把轉發設置為全部轉發;

5. 為了充分發揮 apache 的作用,合理規划目錄結構,充分利用禁止轉發功能。


免責聲明!

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



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