Apache HTTP Server 操作指南

簡介

本文說明如何將 Tomcat 連接到熱門的開源網路伺服器 Apache HTTP Server。您可以將連線模組 mod_jk 與任何受支援的 Apache 版本和任何受支援的 Tomcat 版本搭配使用。

建議您也閱讀 工作人員操作指南 文件,以瞭解如何在網路伺服器和 Tomcat 引擎之間設定工作實體。如需更詳細的設定資訊,請參閱 workers.propertiesuriworkermapApache 的參考指南。

警告:如果 Apache 和 Tomcat 設定為從相同的檔案系統位置提供內容,則必須小心確保 Apache 無法提供不適當的內容,例如 WEB-INF 目錄或 JSP 原始碼的內容。如果 Apache DocumentRoot 與 Tomcat 主機的 appBase 或任何 Context 的 docBase 重疊,可能會發生這種情況。使用 Apache Alias 指令與 Tomcat 主機的 appBase 或任何 Context 的 docBase 時,也可能會發生這種情況。

本文最初是 Gal Shachor 所撰寫的 Tomcat:極簡主義使用者指南的一部分,但已因組織原因而分開。

文件慣例和假設

${tomcat_home} 是 tomcat 的根目錄。您的 Tomcat 安裝應具有下列子目錄

  • ${tomcat_home}\conf - 您可以在其中放置各種設定檔
  • ${tomcat_home}\webapps - 包含範例應用程式
  • ${tomcat_home}\bin - 您放置網路伺服器外掛程式的目錄

在此文件中的所有範例中,${tomcat_home} 都會是 /var/tomcat3。將 工作人員 定義為接受 Apache 伺服器工作的 tomcat 程序。

受支援的設定

mod_jk 模組受支援於

  • Apache 網路伺服器 (httpd) 目前支援的所有版本
  • Apache 網路伺服器支援的任何作業系統
  • Tomcat 目前支援的所有版本

mod_jk 模組可能與 Apache 網路伺服器和/或 Tomcat 的較舊、不受支援的版本搭配使用,但此類組態不受支援。

AJP 協定?

mod_jk 模組使用 AJP 協定將要求傳送至 Tomcat 容器。所使用的 AJP 版本為ajp13。所有當前版本的 Tomcat 都支援 ajp13 協定。其他 servlet 引擎,例如JettyJBoss,也支援 ajp13 協定。

ajp12 協定已棄用,您不應再使用它。ajp14 協定被視為實驗性質。

它是如何運作的?

簡單來說,網路伺服器正在等待客戶端 HTTP 要求。當這些要求到達時,伺服器會執行提供必要內容以服務要求所需的任何工作。

加入 servlet 容器可能會稍微改變此行為。現在,網路伺服器還需要執行下列工作

  • 載入 servlet 容器適配器程式庫並初始化它(在服務要求之前)。
  • 當要求到達時,它需要檢查並查看某個要求是否屬於 servlet,如果是,則需要讓適配器取得要求並處理它。

另一方面,適配器需要知道它將服務哪些要求(通常根據要求 URL 中的某種模式)以及將這些要求導向何處。

當使用者想要設定使用虛擬主機的組態,或者當他們想要讓多個開發人員在同一台網路伺服器上工作,但使用不同的 servlet 容器 JVM 時,事情會變得更加複雜。我們將在進階部分中介紹這兩種情況。

取得 mod_jk

mod_jk 可以取得兩種格式 - 二進位和原始碼。根據您執行網路伺服器的平台,mod_jk 的二進位版本可能可用。

如果有一個二進位版本,建議使用它。如果二進位版本不可用,請遵循下列「建立 mod_jk」部分中提供的說明,從原始碼建立 mod_jk。mod_jk 原始碼可以從鏡像網站 這裡 下載

mod_jk 的二進位檔案現在可供多個平台使用。二進位檔案位於平台的子目錄中。

對於某些平台,例如 Windows,這是取得 mod_jk 的典型方式,因為大多數 Windows 系統沒有 C 編譯器。

對於其他平台,mod_jk 的二進位發行版提供更簡單的安裝方式。

例如,可以從鏡像網站下載 JK 1.2.x 在此處(尋找 JK 1.2 二進位版本)。「JK 1.2 二進位版本」連結包含適用於 Apache 1.3 和 Apache 2.x 的各種作業系統的二進位版本。

安裝

mod_jk 需要兩個實體

  • mod_jk.xxx - Apache HTTP 伺服器模組,根據您的作業系統,它將是 mod_jk.so、mod_jk.nlm 或 MOD_JK.SRVPGM(請參閱建置部分)。
  • workers.properties - 描述工作人員(Tomcat 程序)使用的主機和埠的檔案。可以在來源下載的 conf 目錄下找到範例 workers.properties。

此外,與其他 Apache 模組一樣,mod_jk 應先安裝在 Apache HTTP 伺服器的模組目錄中,例如:/usr/lib/apache,您應更新您的 httpd.conf 檔案。

停用舊的 mod_jserv

如果您先前已將 Apache 設定為使用 mod_jserv,請從您的 httpd.conf 中移除任何 ApJServMount 指令。

如果您包含 tomcat-apache.conftomcat.conf,您也會想要移除它們 - 它們專屬於 mod_jserv

mod_jserv 設定指令與 mod_jk 不相容!

使用 Tomcat 自動設定

Tomcat 自動設定已不建議使用,並已在 Tomcat 7 及後續版本中移除。

自動設定僅適用於在 Apache HTTP 伺服器執行的同一台機器上執行的單一 Tomcat。設定 Apache HTTP 伺服器使用 mod_jk 的最簡單方法是在 Tomcat 中開啟 Apache HTTP 伺服器自動設定,並在您的 Apache httpd.conf 檔案的結尾放置下列 include 指令(請務必將 $TOMCAT_HOME 替換為您的 Tomcat 安裝的正確路徑

# To be added at the end of your httpd.conf
Include $TOMCAT_HOME/conf/jk/mod_jk.conf-auto

注意:此檔案也可以產生為 $TOMCAT_HOME/conf/auto/mod_jk.conf

這會告訴 Apache HTTP 伺服器使用 Apache 設定中的 mod_jk.conf-auto 檔案中的指令。此檔案是透過在 $TOMCAT_HOME/conf/jk/workers.properties 中建立您的 workers.properties 檔案,並根據以下範例將 listener 加入 server.xml 檔案中的 Engine 元素來建立的。請注意,此範例專屬於 Tomcat 5.x,與本文件中的其他部分不同,這些部分也適用於先前的 Tomcat 分支。

...
<Engine ...>
  ...
    <Listener className="org.apache.jk.config.ApacheConfig" modJk="/path/to/mod_jk.so" />
  ...
</Engine>
...

然後重新啟動 Tomcat,mod_jk.conf 應會產生。有關此主題的更多資訊,請參閱 Tomcat 文件網站 上的 API 文件。

自訂 mod_jk 設定

您應在下列情況下使用自訂設定

  • 您無法使用 mod_jk.conf-auto,因為 Tomcat 引擎不在與 Apache 網路伺服器相同的機器上,例如當您在 Tomcat 農場之前使用 Apache 時。
  • 自訂設定的另一個情況是當您的 Apache 在許多不同的 Tomcat 引擎之前,每個引擎都有自己的設定,這是 ISP 主機中的常見情況
  • 此外,大多數 Apache 網路管理員會保留自訂設定,以便能夠根據實際需求調整設定。

簡單的設定範例

以下是簡單的設定

# Load mod_jk module
LoadModule    jk_module  modules/mod_jk.so
# Add the module (activate this lne for Apache 1.3)
# AddModule     mod_jk.c
# Where to find workers.properties
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk shared memory
JkShmFile     /var/log/httpd/mod_jk.shm
# Where to put jk logs
JkLogFile     /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Send requests for context /examples to worker named worker1
JkMount  /examples/* worker1

mod_jk 指令

我們將在此討論 mod_jk 指令及其背後的詳細資訊

定義工作人員

JkWorkersFile 指定 mod_jk 將找到工作人員定義的位置。

JkWorkersFile     /etc/httpd/conf/workers.properties

記錄

JkLogFile 指定 mod_jk 將放置其記錄檔的位置。

JkLogFile     /var/log/httpd/mod_jk.log

自 Apache 2.x 的 JK 1.2.3 和 Apache 1.3 的 JK 1.2.16 起,這也可以用於管道記錄

JkLogFile     "|/usr/bin/rotatelogs /var/log/httpd/mod_jk.log 86400"

JkLogLevel 設定記錄層級

  • info 記錄將包含標準 mod_jk 活動(預設)。
  • error 記錄也會包含錯誤報告。
  • debug 記錄將包含 mod_jk 活動的所有資訊
JkLogLevel    info

info 應為您在正常作業中的預設選項。

JkLogStampFormat 將設定 mod_jk 記錄檔中找到的日期/時間格式。有關詳細資訊,請參閱 mod_jk Apache HTTP Server 參考

JkLogStampFormat "[%y-%m-%d %H:%M:%S.%Q] "

您可以使用 Apache 標準模組 mod_log_config 記錄 mod_jk 資訊。此模組會在 Apache 備註表中設定數個備註。其中大多數僅與負載平衡器工作人員搭配使用時才有用。有關詳細資訊,請參閱 mod_jk Apache HTTP Server 參考

LogFormat     "%h %l %u %t \"%r\" %>s %b %{JK_WORKER_NAME}n %{JK_LB_FIRST_NAME}n \
              %{JK_LB_FIRST_BUSY}n %{JK_LB_LAST_NAME}n %{JK_LB_LAST_BUSY}n" mod_jk_log
CustomLog     logs/access_log     mod_jk_log

您也可以在 mod_jk 記錄檔中記錄請求協定,而不是在存取記錄中記錄。這不建議使用,而且主要是向後相容性功能。指令 JkRequestLogFormat 將設定此協定的格式。它會針對每個虛擬主機設定和啟用。有關詳細資訊,請參閱 mod_jk Apache HTTP Server 參考

JkRequestLogFormat     "%w %V %T"

轉發

指令 JkOptions 允許您設定多個轉發選項,這些選項將啟用 (+) 或停用 (-) 下列選項。若沒有任何前導符號,選項將會啟用。

後面的四個選項 +ForwardURIxxx 互斥。其中一個是必要的,不允許使用負號前綴。自 1.2.24 版起,預設值為「ForwardURIProxy」。在 1.2.23 版中為「ForwardURICompatUnparsed」,在 1.2.22 版之前為「ForwardURICompat」。您可以開啟其他兩個選項之一來關閉預設值。除非您有非常好的理由要變更,否則您應該將其保留為預設值。

所有選項都從全球伺服器繼承到虛擬主機。支援啟用(加號選項)和停用(減號選項)的選項,會以下列方式繼承
options(vhost) = plus_options(global) - minus_options(global) + plus_options(vhost) - minus_options(vhost)

使用 JkOptions ForwardURIProxy,轉發的 URI 會在 Apache 內部處理後並在轉發到 Tomcat 之前進行部分重新編碼。這將與 mod_rewrite 的本地 URL 操作和 URL 編碼的會話 ID 相容。

JkOptions     +ForwardURIProxy

使用 JkOptions ForwardURICompatUnparsed,轉發的 URI 將不會被解析。它符合規範且安全。它將始終轉發原始請求 URI,因此使用 mod_rewrite 重寫 URI,然後轉發重寫的 URI 將不起作用。

JkOptions     +ForwardURICompatUnparsed

使用 JkOptions ForwardURICompat,轉發的 URI 將由 Apache 解碼。編碼字元將被解碼,並且明確的路徑組件(例如「..」)將已經被解析。這不太符合規範,如果您正在使用 JkMount 前綴,則不安全。此選項將允許在轉發之前使用 mod_rewrite 重寫 URI。

JkOptions     +ForwardURICompat

使用 JkOptions ForwardURIEscaped,轉發的 URI 將是 ForwardURICompat 使用的 URI 的編碼形式。明確的路徑組件(例如「..」)將已經被解析。這將無法與 URL 編碼的會話 ID 結合使用,但它將允許在轉發之前使用 mod_rewrite 重寫 URI。

JkOptions     +ForwardURIEscaped

JkOptions RejectUnsafeURI 將在解碼後封鎖所有包含百分比符號「%」或反斜線「\」的 URL。

大多數 Web 應用程式都不會使用此類 URL。使用 RejectUnsafeURI 選項,您可以封鎖多種已知的 URL 編碼攻擊。預設情況下,未設定此選項。

您也可以使用 mod_rewrite 來實現此類檢查,它功能更強大,但稍微複雜一些。

JkOptions     +RejectUnsafeURI

JkOptions CollapseSlashesAll 已在 1.2.44 中棄用,如果使用,將被忽略。

JkOptions CollapseSlashesUnmount 已在 1.2.44 中棄用,如果使用,將被忽略。

JkOptions CollapseSlashesNone 已在 1.2.44 中棄用,如果使用,將被忽略。

JkOptions ForwardDirectories 與 Apache 的DirectoryIndex 指令一起使用。因此,mod_dir 應該可以透過靜態或動態(DSO)的方式提供給 Apache

當 DirectoryIndex 被設定時,Apache 將為指令中指定的每個 local-url 建立子請求,以確定是否有符合的本地檔案(這透過對檔案進行 stat 來完成)。

如果 ForwardDirectories 被設定為false(預設值)且 Apache 找不到任何符合的檔案,Apache 將提供目錄的內容(如果指令 Options 為該目錄指定了 Indexes)或403 Forbidden 回應(如果指令 Options 未為該目錄指定 Indexes)。

如果 ForwardDirectories 被設定為true 且 Apache 找不到任何符合的檔案,請求將被轉發到 Tomcat 以進行解析。這用於 Apache 由於各種原因無法在檔案系統上看到索引檔案的情況:Tomcat 在不同的機器上執行、JSP 檔案已經被預先編譯等。

請注意,本地可見的檔案將優先於僅 Tomcat 可見的檔案(也就是說,如果 Apache 可以看到檔案,則將提供該檔案)。如果 Tomcat 通常提供多種檔案類型,這一點很重要,例如 Velocity 頁面和 JSP 頁面。

JkOptions     +ForwardDirectories

設定 JkOptions ForwardLocalAddress,您要求 mod_jk 傳送 Apache HTTP 伺服器的本機地址,而非遠端用戶端地址。Tomcat 遠端地址閥門可以使用此功能,僅允許來自已設定 Apache 伺服器的連線。

JkOptions     +ForwardLocalAddress

設定 JkOptions ForwardPhysicalAddress,您要求 mod_jk 傳送實體對等 TCP IP 地址作為用戶端地址。預設情況下,mod_jk 使用由網路伺服器提供的邏輯地址。例如,模組 mod_remoteip 會將邏輯 IP 地址設定為 X-Forwarded-For 標頭中由代理伺服器轉送的用戶端 IP。

JkOptions     +ForwardPhysicalAddress

JkOptions FlushPackets,您要求 mod_jk 在收到 Tomcat 傳送的每個 AJP 封包區塊後,清除 Apache 的連線緩衝區。此選項可能會大幅降低 Apache 和 Tomcat 的效能,因為寫入作業執行次數會比正常情況下更頻繁(例如:在每個回應的結尾)。

JkOptions     +FlushPackets

JkOptions FlushHeader,您要求 mod_jk 在收到 Tomcat 傳送的回應標頭後,清除 Apache 的連線緩衝區。

JkOptions     +FlushHeader

JkOptions DisableReuse,您要求 mod_jk 在使用連線後立即關閉連線。通常,mod_jk 會使用持續連線,並集中閒置連線,以便在必須將新要求傳送至 Tomcat 時重複使用這些連線。

使用此選項可能會大幅降低 Apache 和 Tomcat 的效能。僅在無法解決的網路問題情況下,才將此選項作為最後的手段。如果 Apache 和 Tomcat 之間的防火牆會在不發出通知的情況下終止閒置連線,請嘗試結合使用工作者屬性 socket_keepalive 和作業系統中適當的 TCP keepalive 值。

JkOptions     +DisableReuse

JkOptions ForwardKeySize,您要求 mod_jk 在使用 ajp13 時,也轉送 Servlet API 2.3 所需的 SSL 金鑰大小。當 Servlet 引擎為 Tomcat 3.2.x 時,不應設定此旗標(預設為關閉)。

JkOptions     +ForwardKeySize

JkOptions ForwardSSLCertChain,您要求 mod_jk 在使用 ajp13 時,轉送 SSL 憑證鏈(預設為關閉)。Mod_jk 僅將 SSL_CLIENT_CERT 傳遞至 AJP 連接器。對於自簽憑證或由根 CA 憑證直接簽署的憑證,這不是問題。但是,有許多憑證是由中間 CA 憑證簽署的,這是一個重大問題:Servlet 將無法自行驗證用戶端憑證。透過 AJP 連接器將 SSL_CLIENT_CERT_CHAIN 傳遞至 Tomcat,可以修正此錯誤。
此指令僅存在於版本 1.2.22 以後。

JkOptions     +ForwardSSLCertChain

JkEnvVar 指令讓您可以將環境變數從 Apache 伺服器轉送至 Tomcat 引擎。您可以將預設值新增為指令的第二個參數。如果未明確提供預設值,則只有在執行期間設定變數時才會傳送變數。
變數可以在 Tomcat 端作為要求屬性透過 request.getAttribute(attributeName) 擷取。請注意,透過 JkEnvVar 傳送的變數不會列在 request.getAttributeNames() 中。
變數會從全域伺服器繼承至虛擬主機。

JkEnvVar     SSL_CLIENT_V_START     undefined

將 URL 指定給 Tomcat

如果您已建立 mod_jk.conf-local 的自訂或在地版本,如上所述,您可以變更設定,例如工作人員或 URL 前置詞。

JkMount 指令將特定 URL 指定給 Tomcat。一般來說,JkMount 指令的結構為

JkMount [URL prefix] [Worker name]
# send all requests ending in .jsp to worker1
JkMount /*.jsp worker1
# send all requests ending /servlet to worker1
JkMount /*/servlet/ worker1
# send all requests jsp requests to files located in /otherworker will go worker2
JkMount /otherworker/*.jsp worker2

您可以在頂層或 httpd.conf 檔案的 <VirtualHost> 區段中使用 JkMount 指令。

設定 Apache 以提供靜態 Web 應用程式檔案

如果 Apache HTTP 伺服器可以存取 Tomcat 主機 appBase (webapps) 目錄,則可以設定 Apache 提供 Web 應用程式內容目錄靜態檔案,而不是將要求傳遞給 Tomcat。

注意:基於安全性考量,強烈建議預設使用 JkMount 將所有要求傳遞給 Tomcat,並使用 JkUnMount 明確排除由 Apache 提供的靜態內容。也應注意,由 Apache 提供的內容會略過應用程式 web.xml 中定義的任何安全性限制。

使用 Apache 的 Alias 指令將單一 Web 應用程式內容目錄對應至 VirtualHost 的 Apache 文件空間

# Static files in the examples webapp are served by Apache
Alias /examples /vat/tomcat3/webapps/examples
# All requests go to worker1 by default
JkMount /* worker1
# Serve html, jpg and gif using Apache
JkUnMount /*.html worker1
JkUnMount /*.jpg  worker1
JkUnMount /*.gif  worker1

從 Apache 2.x 的 mod_jk 1.2.6 和 Apache 1.3 的 mod_jk 1.2.19 開始,可以透過設定環境變數 no-jk 排除一些 URL/URI 進行 jk 處理,例如使用 SetEnvIf 指令。

當 jk 和 alias/userdir URL 相符時,您可以使用 no-jk 環境變數修正 mod_alias 或 mod_userdir 指令的問題。

# All URL goes to tomcat except the one containing /home
<VirtualHost *:80>
    ServerName testxxx.mysys
    DocumentRoot /www/testxxx/htdocs

# Use SetEnvIf to set no-jk when /home/ is encountered
    SetEnvIf Request_URI "/home/*" no-jk

# Now /home will goes to /home/dataxxx/
    Alias /home /home/dataxxx/

    <Directory "/home/dataxxx">
        Options Indexes MultiViews
        AllowOverride None
        Require all granted
    </Directory>

    JkMount /* myssys-xxx

</VirtualHost>

使用 mod_jk JkAutoAlias 指令將所有 Web 應用程式內容目錄對應至 Apache 的文件空間。

嘗試存取 Web 應用程式內容或 Tomcat 主機 appBase (webapps) 目錄中的 Web 檔案館 *.war 內的 WEB-INF 或 META-INF 目錄時,會失敗並顯示 HTTP 403,禁止存取

# Static files in all Tomcat webapp context directories are served by Apache
JkAutoAlias /var/tomcat3/webapps

# All requests go to worker1 by default
JkMount /* ajp13
# Serve html, jpg and gif using Apache
JkUnMount /*.html ajp13
JkUnMount /*.jpg  ajp13
JkUnMount /*.gif  ajp13

如果您編碼所有 URL 以包含工作階段 ID (;jsessionid=...),而您稍後決定將部分內容移至 Apache,您可以指示 mod_jk 移除這些要求的 URL 中的所有工作階段 ID,而這些要求不會透過 mod_jk 轉送。

您可以透過將 JkStripSession 設定為開啟來啟用此功能。可以個別為虛擬伺服器啟用。預設值為關閉。

在 Unix 上建置 mod_jk

mod_jk 建置使用廣泛使用的 configure 系統。

從 Subversion 準備 mod_jk configure

如果您從 Subversion 取得原始碼,即沒有現有的 configure 程式碼,您應該使用 autoconf 進行組態和安裝。

若要建立 mod_jk autoconf 程式碼,您需要 libtool 1.5.2、automake 1.10 和 autoconf 2.59 或更新版本。建議使用較新版本,例如,可靠偵測作業系統最新版本的特色。

如果您只是使用從 apache.org 下載的套件,則不需要這些工具,它們僅供開發人員使用。

若要建立 configure 程式碼,只需輸入: ./buildconf.sh

使用 configure 建置 mod_jk

以下是使用 configure 準備 mod_jk 建置的方法,只需輸入

./configure [autoconf arguments] [mod_jk arguments]

您可以設定 CFLAGSLDFLAGS 以新增一些平台特定設定

LDFLAGS=-lc ./configure -with-apxs=/home2/local/apache/bin/apxs

如果您想為 Apache HTTP Server 的不同版本(例如 1.3 或 2.x)建置 mod_jk,您需要為每個版本執行完整的建置程序。請注意,Apache 2.0、2.2 或 2.4 模組相容於二進位。您必須使用您計畫執行模組的 Apache 版本編譯模組。所有 2.x 建置使用的 mod_jk 建置目錄為「apache-2.0」。原始碼相容於 Apache HTTP Server 2.0、2.2 和 2.4。

  • 使用 configure 並指出正確的 Apache HTTP Server apxs 位置(--with-apxs)
  • 使用 make
  • 將產生的 mod_jk.so 二進位檔從 apache-1.3 或 apache-2.0 子目錄複製到 Apache HTTP Server 模組位置。
  • make clean(移除所有先前編譯的物件檔)
  • 重新開始,使用下一個 Apache HTTP Server 版本的 apxs 位置。

configure 參數

與 Apache 相關的參數
--with-apxs[=FILE] FILE 是 apxs 工具的位置。預設為在 PATH 中尋找 apxs。它會建置一個共用 Apache 模組。它會自動偵測 Apache 版本。(2.x 和 1.3)
--with-apache=DIR DIR 是 Apache 原始碼所在的路徑。在組態 mod_jk 之前,應已組態好 Apache 原始碼。DIR 類似於:/home/apache/apache_1.3.19 它會建置一個靜態 Apache 模組。
--enable-EAPI 當使用 Apache-1.3 和 mod_ssl 時,需要這個參數,否則當在 Apache 中載入 mod_jk.so 時,您會收到錯誤訊息:「此模組可能會在 EAPI 下崩潰!」當使用 --with-apxs 時,不需要。
--enable-prefork 如果您為多執行緒 Apache HTTP Server 2.x MPM(多處理模組)建置 mod_jk,mod_jk 程式碼的某些區域需要同步才能使其執行緒安全。由於組態無法輕易偵測您是否使用多執行緒 MPM,因此 mod_jk 預設會為 Apache HTTP Server 2.x 永遠建置執行緒安全。如果您確定您的 MPM 不是多執行緒,您可以使用「--enable-prefork」強制移除同步程式碼(從而稍微提升效能)。例如,prefork MPM 不是多執行緒。對於 Apache HTTP Server 1.3,此旗標會自動設定。
--disable-trace 當使用記錄層級「trace」時,mod_jk 會追蹤許多函式呼叫,並附帶「enter」和「exit」記錄訊息。即使記錄層級不是「trace」,比較記錄層級以決定是否記錄也會對效能造成一些影響。
如果您使用「--disable-trace」,則追蹤記錄程式碼不會編譯到模組二進位檔中,您可以在執行期間節省一些週期。
即使使用「--disable-trace」,仍然可以記錄具有偵錯記錄層級的偵錯訊息。
--enable-api-compatibility 僅使用已選主要 Apache 發行分支的所有 Apache 生產版本中可用的 Apache API 函式。這會改善模組建置與較 mod_jk 建置版本舊的 Apache 版本的二進位相容性(僅限於次要 Apache 版本之間)。
--enable-flock 如果作業系統支援 flock 系統呼叫,請使用此旗標來啟用此較快速的鎖定,此鎖定是以系統呼叫實作,而不是由 GNU C 函式庫模擬。
不過,這些鎖定無法在 NFS 掛載的磁碟區上運作,因此您可以在編譯期間使用「--enable-flock」來強制 flocks() 呼叫。

組態使用範例

Apache 1.3 和 2.x 建置 ./configure --with-apxs=/usr/sbin/apxs
make
cp ./apache-1.3/mod_jk.so /usr/lib/apache
make clean
./configure --with-apxs=/usr/sbin/apxs2
make
cp ./apache-2.0/mod_jk.so /usr/lib/apache2

在 Windows 上建置 mod_jk for Apache

此模組是使用 Microsoft Visual C++ 開發,因此如果您想要執行自己的建置,則必須先安裝 Visual Studio。

您可以使用 IDE GUI 或基於 nmake 的純命令列建置來建置來源。IDE 建置目前僅支援建置 32 位元二進位檔。nmake 建置可供 32 位元和 64 位元二進位檔使用。

所有建置程序的共通步驟如下

  • 為 32 位元或 64 位元設定建置環境。IDE 建置僅支援 32 位元。
  • 以 zip 檔案下載來源並解壓縮。
  • 將目錄變更為 ISAPI redirector 來源目錄。
  • 在您的環境中設定路徑至 Apache 網頁伺服器目錄。
設定 32 或 64 位元建置環境 setenv /Release /X86 或 (IDE 建置無法使用) setenv /Release /X64 https://tomcat.dev.org.tw/download-connectors.cgi 下載 tomcat-connectors-xxx-src.zip 並解壓縮 unzip tomcat-connectors-xxx-src.zip 將目錄變更為 mod_jk 來源目錄。 若要為 Apache HTTP 伺服器 2.0、2.2 或 2.4 建置 mod_jk, 請使用「apache-2.0」目錄,對於舊的 Apache HTTP 伺服器 1.3,請使用「apache-1.3」目錄。 cd tomcat-connectors-xxx-src\native\apache-2.0 設定環境變數「APACHE1_HOME」或 「APACHE2_HOME」或「APACHE22_HOME」或「APACHE24_HOME」 至您的 Apache 網頁伺服器的安裝路徑。 set APACHE24_HOME=D:\software\Apache\httpd-2.4.16

IDE 建置的步驟如下

  • 使用「start mod_jk.dsp」啟動 Visual Studio
  • 在 IDE 啟動期間,在所有轉換快顯視窗中選擇「是」。
  • 接著從下拉式選單中選擇組態。有針對偵錯和發行建置預先定義的組態,且在「apache-2.0」目錄中,每個組態都可用作針對網頁伺服器版本 2.0、2.2 和 2.4 建置的組態。
  • 最後在「建置」功能表中選擇「建置解決方案」。
產生的檔案 mod_jk.so (和偵錯符號檔案 mod_jk.pdb) 位於「偵錯」或「發行」子目錄中,視所選的建置組態而定。對於「apache-2.0」模組,目錄會根據所選的建置組態命名為「Debug_20」、「Release_20」、「Debug_22」、「Release_22」、「Debug_24」和「Release_24」。

nmake 命令列建置的步驟如下

  • 透過編輯檔案 Makefile.vc 中的「ARCH=」行,將您的目標架構設定為 X86 或 X64。
  • 執行「nmake -f Makefile.vc」
產生的檔案 mod_jk.so (和偵錯符號檔案 mod_jk.pdb) 位於「偵錯」或「發行」子目錄中,視所選的建置組態而定。對於「apache-2.0」模組,目錄會根據所選的建置組態命名為「Debug_20」、「Release_20」、「Debug_22」、「Release_22」、「Debug_24」和「Release_24」。

最後,您需要將檔案 mod_jk.so 複製到 Apache HTTP 伺服器 (或舊版 Apache 1.3 的 libexec 目錄) 的模組目錄中。

對於 Apache HTTP Server 1.3,ApacheCore.lib 預期在連結 mod_jk 之前就已存在。

在 System I - i5/OS (OS400) 上建置 mod_jk for Apache

自 OS400 V4R5 以來,System I (AS/400) 已使用 Apache 2.0 作為其主要網路伺服器,取代舊的 IBM 網路伺服器。現在,由於 IBM Rochester Labs 提供資訊和修補程式以將 mod_jk 適應到 i5/OS,因此可以在 System I 上建置 mod_jk。

您至少應該擁有 Apache 2.0.58(產品 5722DG1)、C 編譯器和 IFS。Apache 2.0.58 隨附 iSeries Apache 伺服器的最新 PTF 組合,可在 http://www.ibm.com/servers/eserver/iseries/software/http/ 找到

i5/OS V5R3(或 V5R4)的最新 Apache 2 現在是 2.0.58(截至 2007/04/17)。如果您要使用 jk 1.2.15 和更高版本,請務必載入最新的 PTF。注意:已知在 i5/OS V5R3 上運作的最新 mod_jk 是 1.2.19。

i5/OS V5R4 的新功能,UTF 是必需的,也適用於 Apache 模組,因此 Apache 模組不需要轉換為 EBCDIC 或從 EBCDIC 轉換,但應執行工作以將 mod_jk 1.2.23(和更高版本)移植到 V5R4。根據 V5R4 Infocenter:自 i5/OS(tm) V5R4 起,模組必須使用 UTF 區域設定重新編譯。這會建立一個環境,其中與區域設定相關的 C 執行時期函數假設字串資料已編碼為 UTF-8。任何硬編碼常數都可以透過在模組中新增 #pragma convert(1208) 陳述式來編碼為 UTF-8。此外,從用戶端輸入的資料將不再轉換為 EBCDIC,而是會原樣傳遞。從模組傳送的輸出資料也不會轉換,因此必須視需要編碼為 ASCII 或 UTF8。自 V5R4 起,APR 和 HTTP API 預期資料為 UTF-8。請注意,幾個 API 具有額外的函數,允許設定 CCSID 以指出傳遞參數的編碼。已新增 UTF-8 和 EBCDIC 之間的轉換函數。務必檢閱模組使用的 API,以瞭解目前的變更。

若要在 System I 上設定 mod_jk,請使用 mod_jk 來源隨附的 CL 來源。

  • 取得最新的 mod_jk 來源,並在 Windows 或 Unix 電腦上解壓縮。
  • 在 IFS 中建立一個目錄,例如 /home/apache
  • 透過 FTP 將整個 jk 來源目錄傳送到 System I 目錄。
  • 然後前往 System I 命令列
建立 mod_jk 函式庫 CRTLIB MOD_JK TEXT(‘Apache mod'jk tomcat connector module') 建立服務程式來源檔案 CRTSRCPF MOD_JK/QSRVSRC TEXT(‘Service program source file’) 建立 CL 建置程式來源檔案 CRTSRCPF FILE(MOD_JK/QCLSRC) TEXT(‘Build program source file’) 編輯服務程式來源檔案 STRSEU MOD_JK/QSRVSRC MOD_JK

在已編輯的檔案中,指定只匯出 jk_module: Columns . . : 1 71 Edit MOD_JK/QSRVSRC SEU==> MOD_JK *************** Beginning of data ************************************* 0001.00 STRPGMEXP PGMLVL(*CURRENT) 0002.00 EXPORT SYMBOL("jk_module") 0003.00 ENDPGMEXP ****************** End of data ****************************************

您可以開始建置 mod_jk 的所有模組(V5R4 或先前版本的情況)

從 IFS 複製 i5/OS V5R4 之前的 CL 建置程式來源 CPYFRMSTMF FROMSTMF('/home/apache/jk/native/apache-2.0/bldjk.qclsrc') + TOMBR('/QSYS.LIB/MOD_JK.LIB/QCLSRC.FILE/BLDJK.MBR') MBROPT(*REPLACE) 建置 CL 建置程式 CRTCLPGM PGM(MOD_JK/BLDJK) SRCFILE(MOD_JK/QCLSRC) TEXT('Apache mod_jk 建置程式') 啟動建置 CALL MOD_JK/BLDJK
如果建置成功,請複製新的 mod_jk 模組 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)
從 IFS 複製 i5/OS V5R4 的 CL 建置程式來源 CPYFRMSTMF FROMSTMF('/home/apache/jk/native/apache-2.0/bldjk54.qclsrc') + TOMBR('/QSYS.LIB/MOD_JK.LIB/QCLSRC.FILE/BLDJK54.MBR') MBROPT(*REPLACE) 建置 i5/OS V5R4 的 CL 建置程式 CRTCLPGM PGM(MOD_JK/BLDJK54) SRCFILE(MOD_JK/QCLSRC) TEXT('Apache mod_jk 建置程式') TGTRLS(*CURRENT) 啟動 i5/OS V5R4 的建置 CALL MOD_JK/BLDJK54
如果建置成功,請複製新的 mod_jk 模組 CRTDUPOBJ OBJ(MOD_JK) FROMLIB(MOD_JK) OBJTYPE(*SRVPGM) TOLIB(QHTTPSVR) NEWOBJ(MOD_JK)

接下來,您應該重新啟動 Apache 2.0 執行個體,並在 System I 上享受這段開放原始碼。

ENDTCPSVR SERVER(*HTTP) HTTPSVR(MYSERVER) STRTCPSVR SERVER(*HTTP) HTTPSVR(MYSERVER)

在 MacOS/X 上建置 Apache 的 mod_jk

Mac OS X (10.2.x) 建置筆記

假設您是 root

對於 Apache 1.3: ./configure --with-apxs=/usr/sbin/apxs cd apache-1.3 make -f Makefile.apxs cp mod_jk.so /etc/libexec/httpd 對於 Apache 2.x: ./configure --with-apxs=/usr/local/apache2/bin/apxs (您應該指向安裝 Apache 2.x 的目錄) cd apache-2.0 make -f Makefile.apxs install

讓 mod_jk 與 Apache 靜態連結

mod_jk 允許在 Apache 原始碼樹中安裝 mod_jk,以取得靜態連結的 mod_jk。在 Apache 可執行檔中擁有 mod_jk 會帶來一些小幅效能提升。configure 選項 --with-apache 準備 mod_jk 在 Apache 原始碼樹中安裝。選項 --with-apache 適用於 Apache 1.3 和 Apache 2.x。以下範例顯示如何讓 mod_jk 進入 Apache 程序。

Apache-2.x 的安裝

/home/apache24/httpd-2.4.12 是 Apache HTTP 伺服器原始碼所在目錄。 ./configure --with-apache=/home/apache24/httpd-2.4.12
make
在 /home/apache24/httpd-2.4.12/modules 中安裝 mod_jk 函式庫和其他檔案: make install
無法直接設定 Apache,因為 mod_jk 的 config.m4 必須加入 httpd-2.x 的設定。 cd /home/apache24/httpd-2.4.12 sh buildconf configure ... --with-mod_jk make make install

enable-jk=share 和 enable-jk=static 不受支援。--with-mod_jk 僅允許 mod_jk 進行靜態連結。

Apache-1.3 安裝

/home/apache/apache_1.3.27 是 apache-1.3 原始程式碼所在目錄。 ./configure --with-apache=/home/apache/apache_1.3.27
make
在 /home/apache/apache_1.3.27/src/modules/jk 中安裝 libjk 函式庫、mod_jk.c、包含檔和其他檔案: make install
在 Apache 原始程式碼中設定: cd /home/apache/apache_1.3.27 configure ... --enable-module=dir --disable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --disable-shared=jk make make install

--enable-shared=jk 也能運作,並會建置一個 dso 檔案。

只要變更 Apache 原始程式碼中的設定: configure ... --enable-module=dir --enable-shared=dir \ --activate-module=src/modules/jk/libjk.a \ --enable-shared=jk