如何設定在 Apache 和 Tomcat 中使用 mod_proxy_ajp?

如何設定在 Apache 和 Tomcat 中使用 mod_proxy_ajp?

我想在 RHEL 5 伺服器上運行 Apache 和 Tomcat,其中 Apache 處理 Ruby on Rails 應用程式(透過 mod_rails/Passenger),Tomcat 處理 Java 應用程式。

在 Apache 下,每個 Rails 應用程式都會有一個 URL 和虛擬主機。 URL 已在我們的 DNS 伺服器中設定為指向該電腦。

在 Tomcat 下,每個 Java 應用程式都有一個如下所示的 URL:ourserver.ourcompany.com/app1ourserver.ourcompany.com/app2等。

伺服器已經啟動並運行,Tomcat 6 在連接埠 80 上運行,並為多個 Java 應用程式提供服務。我想新增 Apache 並重新配置。我熟悉如何設定單一 Apache 伺服器來使用 Passenger 託管 RoR 應用程式。我只是不知道如何讓 Apache 和 Tomcat 像這樣一起工作。

我透過谷歌搜尋找到了各種資源和討論(例如,這個)但它們往往有點粗略和不完整,或者它們似乎並不真正符合我想要做的事情。我連結的那個似乎適用於如果您想將所有請求發送到 Tomcat,而不僅僅是某些請求,並讓 Apache 處理其他請求。

server.xml有人可以建議和 的範例配置httpd.conf,或者也許向我指出一些更詳細的資源嗎?

答案1

server.xml除了將 Tomcat 放回預設連接埠以便 Apache 可以處理連接埠 80 之外,您不需要進行任何變更。我通常將它們留在外部,httpd.conf而是將它們貼到<ServerRoot>/conf.d/子目錄下的較小配置片段中。

鑑於您的範例ourserver.ourcompany.com/app1&ourserver.ourcompany.com/app2我會假設配置如下:

<VirtualHost *:80>
    ServerName ourserver.ourcompany.com
    ErrorLog ...
    CustomLog ...

    [other VHost configurations]

    ProxyPass /app1 ajp://tomcat_hostname:8009/app1
    ProxyPassReverse /app1 ajp://tomcat_hostname:8009/app1

    ProxyPass /app2 ajp://tomcat_hostname:8009/app2
    ProxyPassReverse /app2 ajp://tomcat_hostname:8009/app2
</VirtualHost>

如果您有多個 Tomcat 伺服器叢集在後面,那麼您可能需要考慮設定 mod_balancer 並將其ajp://移至模組平衡器 BalancerMember並替換為balancer://引用平衡器配置的 URL。

答案2

我個人不喜歡mod_proxy_ajp;當在 Apache 下運行 Tomcat 時,我直接安裝 mod_jk(Tomcat 編碼器的模組)以提供 AJP 連接。您可以透過 5 種方式將 mod_jk 調整到週日,以提高應用程式的效能(線程、超時、敲擊等)。

  1. 確保 httpd-devel 已安裝
  2. 將真正的 JDK 解壓縮到某個路徑,例如 /usr/local/jdk1.6.0_18/
  3. 從 tomcat.apache.org 取得“tomcat-connectors”原始程式碼並編譯它

    cd tomcat-connectors-1.2.28-src/native

    ./configure --with-apxs=/usr/sbin/apxs --with-java=/usr/local/jdk1.6.0_18 --enable-prefork

    製作

    cp apache-2.0/mod_jk.so /usr/local/lib/

現在,您必須將其插入到一般意義上的 Apache 配置中,然後根據需要插入到每個虛擬主機中。在整體配置中加入以下內容:

LoadModule jk_module /usr/local/lib/mod_jk.so
JkWorkersFile  /usr/local/tomcat/conf/workers.properties
JkShmFile      /var/log/httpd/mod_jk.shm
JkLogFile      /var/log/httpd/mod_jk.log
JkLogLevel     error

您需要建立基本的worker.properties文件,這裡是文檔:http://tomcat.apache.org/connectors-doc/reference/workers.html一個非常基本的可能看起來像這樣:

workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/jdk1.6.0_18
ps=/
worker.list=ajp13
worker.maintain=60
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13

這將使用 server.xml 中的預設連接埠 8009 配置 - 您可以在此處旋轉一百萬個旋鈕來無休止地調整效能。然後,在每個虛擬主機中「安裝」所需的應用程式:

<VirtualHost *:80>
 ServerName foo.bar.com
 ...other options ...

 JkMount /app1/* ajp13
 <Location "/app1/WEB-INF/">
    deny from all
 </Location>

 JkMount /app2/* ajp13
 <Location "/app2/WEB-INF/">
    deny from all
 </Location>

</VirtualHost>

正如您在底部看到的那樣,不要忘記一點安全性並拒絕對 WEB-INF 資料夾的所有存取 - 大多數 Web 應用程式在部署為 warball 時都有其資料庫 DSN 和密碼 web.xml。

相關內容