為 Apache HTTP Server 設定 mod_jk

設定指令

大部分指令都可以在 Apache HTTP Server 設定的全球部分中使用一次,也可以在每個 <VirtualHost> 元素中使用一次。此規則的例外情況會明確列在下表中。

大部分值都會從主伺服器繼承到虛擬主機。自 1.2.20 版本以來,它們可以在虛擬主機中覆寫。此規則的例外情況也會明確列在下表中。特別請參閱 JkMountCopy。

警告:如果 Apache 和 Tomcat 設定為從同一個檔案系統位置提供內容,則必須小心確保 Apache 無法提供不適當的內容,例如 WEB-INF 目錄的內容或 JSP 原始碼。

如果 Apache DocumentRoot 與 Tomcat 主機的 appBase 或任何 Context 的 docBase 重疊,可能會發生這種情況。使用 Apache Alias 指令與 Tomcat 主機的 appBase 或任何 Context 的 docBase 時也可能會發生這種情況。

以下是 Apache 支援的所有指令

屬性 說明
JkWorkersFile

Tomcat servlet 容器的工作執行緒檔案名稱。
此指令只允許使用一次。它必須放入設定的全球部分。
如果您不使用 JkWorkerProperty 指令,則必須使用有效的 JkWorkersFile 定義您的工作執行緒。沒有預設值。

JkWorkerProperty

啟用在 Apache 設定檔中設定工作執行緒屬性。語法與 JkWorkersFile (通常是 workers.properties) 中的語法相同。只要在每一行前面加上「JkWorkerProperty」,就能直接將其放入 Apache 設定檔中。
此指令允許多次使用。必須放入組態的全球部分。
如果您不使用 JkWorkerProperty 指令,則必須使用有效的 JkWorkersFile 定義您的工作執行緒。沒有預設值。
此指令在 jk1.2.7 版本及更新版本中提供。

JkShmFile

共用記憶體檔案名稱。僅在 unix 平台上使用。shm 檔案由平衡器和狀態工作人員使用。
此指令只允許使用一次。它必須放入設定的全球部分。
預設值為 logs/jk-runtime-status。強烈建議將 shm 檔案放在本機磁碟機上,而非 NFS 共享。

共用記憶體包含負載平衡器工作人員及其成員的組態和執行時期資訊。所有 Apache 子項都需要它

  • 共用負載平衡成員的相同狀態資訊 (正常、錯誤... 等),
  • 共用個別工作人員負載的資訊,
  • 共用組態部分的資訊,這些部分會在執行時期由狀態工作人員變更。

JkShmSize

共用記憶體檔案名稱的大小。
此指令只允許使用一次。它必須放入設定的全球部分。
預設值取決於平台。通常小於 64KB。

JkMountFile

包含從內容環境對應到 Tomcat 工作人員的多重對應的檔案。通常稱為 uriworkermap.properties。
有關繼承規則,請參閱:JkMountCopy。
沒有預設值。

JkMountFileReload

此指令設定重新載入檢查間隔 (單位為秒)。系統會定期檢查 JkMountFile 是否有變更。變更的檔案會自動重新載入。如果您將此指令設定為「0」,則會關閉重新載入檢查。
預設值為 60 秒。
此指令已新增至 mod_jk 的 1.2.20 版本。

JkMount

從內容環境對應到 Tomcat 工作人員的掛載點。
此指令允許多次使用。允許在全球組態和 VirtualHost 中使用。
您也可以在 Location 內使用它,但語法不同。在 Location 內,省略第一個引數 (路徑),它會從 Location 引數逐字繼承。雖然 <Location /myapp> 會比對任何以「/myapp」開頭的 URI,但嵌在這種 Location 區塊中的任何 JkMount 只會比對 URI 為 /myapp 的要求。因此,通常不建議在 Location 內嵌套 JkMount。
預設情況下,JkMount 項目不會從全球伺服器繼承到其他 VirtualHost 或 VirtualHost 之間。有關完整的繼承規則,請參閱:JkMountCopy。
您可能會附加規則延伸至工作人員名稱。延伸會以分號「;」與工作人員名稱分隔,並使用與 uriworkermap.properties 檔案中相同的語法。

JkUnMount

從某個內容到 Tomcat 工作站的排除掛載點。在將要求對應到 Tomcat 工作站後,將檢查所有排除掛載。如果要求也對應到排除,則不會將其轉發到 Tomcat,而是會在本地提供服務。
此指令允許多次使用。允許在全球組態和 VirtualHost 中使用。
您也可以在 Location 中使用不同的語法。在 Location 中,省略第一個參數(路徑),它會從 Location 參數中逐字繼承。雖然 <Location /myapp> 符合任何以「/myapp」開頭的 URI,但嵌套在這樣的 Location 塊中的任何 JkUnMount 只會符合 URI 為 /myapp 的要求。因此,通常不建議將 JkUnMount 嵌套在 Location 中。
有關繼承規則,請參閱:JkMountCopy。
此指令在 jk1.2.7 版本及更新版本中提供。

JkAutoAlias

自動將 Webapp 內容目錄別名設為 Apache 文件空間。
應小心確保僅透過 Apache 提供靜態內容,這是使用此指令的結果。Apache 提供的任何靜態內容都將繞過應用程式的 web.xml 中定義的任何安全性約束。
有關繼承規則,請參閱:JkMountCopy。
沒有預設值。

JkMountCopy

如果此指令在某些虛擬伺服器中設為「開啟」,則來自全球伺服器的掛載將複製到此虛擬伺服器,更精確地說,是 JkMount 或 JkUnMount 定義的所有掛載。由 JkMountFile 和 JkAutoAlias 定義的掛載將僅在 VirtualHost 未定義其自己的 JkMountFile 或 JkAutoAlias 時繼承。
如果您希望所有 vhost 繼承主伺服器的掛載,則可以在主伺服器中將 JkMountCopy 設為「全部」。
此指令僅允許在 VirtualHost(值為「開啟」)和全球伺服器(值為「全部」)中使用。
預設為關閉,因此不會從全球伺服器繼承任何掛載到任何 VirtualHost。
從 1.2.26 版開始,您也可以在全球虛擬伺服器中將其設為「全部」。這會將預設值切換為開啟。

JkWorkerIndicator

Apache 環境變數的名稱,可與 SetHandler jakarta-servlet 結合使用,以設定工作站名稱。
此指令每部虛擬伺服器僅允許使用一次。它允許在全球設定和 VirtualHost 中使用。
預設值為 JK_WORKER_NAME。

JkWatchdogInterval

此指令設定監控執行緒間隔(單位為秒)。工作站會由背景執行緒定期維護,該執行緒每隔 watchdog_interval 秒執行一次。工作站維護會檢查閒置連線、修正負載狀態,並能夠偵測後端健康狀態。
維護僅會在自上次維護以來至少經過 worker.maintain 秒時發生。因此,將 JkWatchdogInterval 設為遠小於 worker.maintain 是沒有用的。
預設值為 0 秒,表示不會建立看門狗執行緒,而維護工作則與一般要求合併執行。
此指令只允許使用一次。它必須放入設定的全球部分。
此指令已新增至 mod_jk 的 1.2.27 版中。它僅適用於 Apache 2.x 以上版本,使用包含執行緒支援的 APR 函式庫。

JkLogFile

mod_jk 日誌檔案的完整路徑或伺服器相對路徑。它也能與管線搭配使用,方法是使用「| ...」格式的值。
預設值為 logs/mod_jk.log。
管線僅支援 Apache 1.3,且僅支援 1.2.16 以上版本。預設值僅存在於 1.2.20 以上版本。

JkLogLevel

mod_jk 日誌層級,可以是 debug、info、warn error 或 trace。
預設值為 info。

JkLogStampFormat

mod_jk 日期日誌格式,使用延伸的 strftime 語法。此格式將用於 JkLogFile 中的時間戳記。格式的最大長度為 63 個字元。
從 mod_jk 的 1.2.24 版開始,您也可以使用 %Q 將毫秒新增至日誌,以及使用 %q 表示微秒。這些轉換規格符是 strftime 的延伸。它們僅在具有 gettimeofday() 函式的平台上運作。您只能在模式中使用 %Q 和 %q 一次,而且不能在同一個模式中同時使用這兩個規格符。
預設值為「[%a %b %d %H:%M:%S %Y] 」,而從 1.2.24 版開始,在具有 gettimeofday() 函式的平台上,預設值為「[%a %b %d %H:%M:%S.%Q %Y] 」。

JkRequestLogFormat

要求日誌格式字串。請參閱以下詳細說明。
沒有預設值。如果不定義值,要求記錄將關閉。

JkExtractSSL

開啟 mod_jk 的 SSL 處理和資訊收集
預設值為開啟。
若要讓 Apache 中的 SSL 資料可供 mod_jk 使用,您需要設定 SSLOptions +StdEnvVars。對於憑證資訊,您也需要新增 SSLOptions +ExportCertData

特別是,mod_jk 會根據 Servlet 規格 3.0 第 3.8 節,將下列環境變數從 Apache 匯出至 Tomcat,並使用這些要求屬性

環境變數要求屬性名稱類型範例
SSL_CIPHER
(或 JkKEYSIZEIndicator)
javax.servlet.request.cipher_suite java.lang.String DHE-RSA-AES256-SHA
SSL_CIPHER_USEKEYSIZE
(或 JkKEYSIZEIndicator)
javax.servlet.request.key_size java.lang.Integer 256
SSL_SESSION_ID
(或 JkSESSIONIndicator)
javax.servlet.request.ssl_session java.lang.String 905...32E (十六進制字串)
SSL_CLIENT_CERT_CHAIN_n
(或 JkCERTCHAINPrefixn)
javax.servlet.request.X509Certificate java.security.X509Certificate[] (憑證鏈,信任度由低到高,第一個是用戶端憑證,第二個是該憑證的簽署者,以此類推)

此外,mod_jk 會將 SSL 協定的名稱傳送為專有的要求屬性,名稱為 AJP_SSL_PROTOCOL。現代的 Tomcat 版本會以 org.apache.tomcat.util.net.secure_protocol_version 的名稱公開這個屬性。此功能已新增至 mod_jk 的 1.2.41 版本。另請參閱 JkSSLPROTOCOLIndicator。

對於所有其他與 SSL 相關的變數,請針對每個需要的變數使用 JkEnvVar。請注意,與 JkEnvVar 一樣,這些變數可從要求屬性取得,而非環境變數或要求標頭。

JkRequestIdIndicator

Apache 環境變數的名稱,其中包含唯一的請求 ID。環境變數的值會新增至大部分 mod_jk 錯誤記錄行,並允許透過在 Apache 記錄中新增該環境變數,輕鬆與 Apache 記錄進行關聯。
預設值為「UNIQUE_ID」。載入模組「mod_unique_id」會自動在該名稱下提供唯一的請求 ID。

此功能已新增至 mod_jk 的 1.2.49 版本。

如果請求 ID 是由用戶端或其他反向代理程式透過 HTTP 要求標頭傳送,則可使用 mod_setenvif 將此 ID 複製至環境變數,讓 mod_jk 可使用。
SetEnvIf X-REQUEST-ID-HEADER "(.+)" X-REQUEST-ID=$1
將輸入標頭 X-REQUEST-ID-HEADER 的值複製至環境變數 X-REQUEST-ID。mod_jk 可透過 JkRequestIdIndicator X-REQUEST-ID 從該處擷取。

JkHTTPSIndicator

Apache 環境變數的名稱,其中包含 SSL 資訊。
預設值為「HTTPS」。

JkSSLPROTOCOLIndicator

Apache 環境變數的名稱,其中包含 SSL 協定名稱。
預設值為「SSL_PROTOCOL」。
此指令已新增至 mod_jk 的 1.2.41 版本。

JkCERTSIndicator

包含 SSL 用戶端憑證的 Apache 環境變數名稱。
預設值為「SSL_CLIENT_CERT」。

JkCIPHERIndicator

包含 SSL 用戶端加密的 Apache 環境變數名稱。
預設值為「SSL_CIPHER」。

JkCERTCHAINPrefix

包含 SSL 用戶端鏈結憑證的 Apache 環境(前綴)名稱。
預設值為「SSL_CLIENT_CERT_CHAIN_」。

JkSESSIONIndicator

包含 SSL 會話的 Apache 環境變數名稱。
預設值為「SSL_SESSION_ID」。

JkKEYSIZEIndicator

包含正在使用的 SSL 金鑰大小的 Apache 環境變數名稱。
預設值為「SSL_CIPHER_USEKEYSIZE」。

JkLocalNameIndicator

可用于覆寫轉發的本地名稱的 Apache 環境變數名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_LOCAL_NAME」。
此指令已新增至 mod_jk 的 1.2.28 版本。

JkIgnoreCLIndicator

強制忽略現有 Content-Length 要求標頭的 Apache 環境變數名稱。可用于使 mod_jk 與 mod_deflate 要求主體膨脹相容(請參閱 下方)。
預設值為「JK_IGNORE_CL」。
此指令已新增至 mod_jk 的 1.2.41 版本。

JkLocalAddrIndicator

可用于覆寫轉發的本地 IP 位址的 Apache 環境變數名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_LOCAL_ADDR」。
此指令已新增至 mod_jk 的 1.2.41 版本。

JkLocalPortIndicator

可用于覆寫轉發的本地埠的 Apache 環境變數名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_LOCAL_PORT」。
此指令已新增至 mod_jk 的 1.2.28 版本。

JkRemoteHostIndicator

可用于覆寫轉發的遠端(用戶端)主機名稱的 Apache 環境變數名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_REMOTE_HOST」。
此指令已新增至 mod_jk 的 1.2.28 版本。

JkRemoteAddrIndicator

可用于覆寫轉發的遠端(用戶端)IP 位址的 Apache 環境變數名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_REMOTE_ADDR」。
此指令已新增至 mod_jk 的 1.2.28 版本。

JkRemotePortIndicator

可用于覆寫轉發的遠端(用戶端)IP 位址的 Apache 環境變數名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_REMOTE_PORT」。
此指令已新增至 mod_jk 的 1.2.32 版本。

JkRemoteUserIndicator

Apache 環境變數的名稱,可用於覆寫轉發的使用者名稱。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_REMOTE_USER」。
此指令已新增至 mod_jk 的 1.2.28 版本。

JkAuthTypeIndicator

Apache 環境變數的名稱,可用於覆寫轉發的驗證類型。僅在需要調整資料時使用(請參閱 代理 文件)。
預設值為「JK_AUTH_TYPE」。
此指令已新增至 mod_jk 的 1.2.28 版本。

JkOptions

設定一個或多個選項來設定 mod_jk 模組。請參閱下方有關此指令的詳細資訊。
此指令可針對每個虛擬伺服器使用多次。
自 1.2.24 版起,預設值為「ForwardURIProxy」。在 1.2.23 版中為「ForwardURICompatUnparsed」,在 1.2.22 版之前為「ForwardURICompat」。

JkEnvVar

新增名稱和環境變數的選用預設值,應作為要求屬性傳送至 servlet 引擎。如果未明確提供預設值,則僅在執行期間設定時才會傳送變數。
預設值為空,因此不會傳送其他變數。
此指令可針對每個虛擬伺服器使用多次。設定會在全球伺服器和任何虛擬伺服器之間合併。
您可以在 Tomcat 上透過 request.getAttribute(attributeName) 將變數作為要求屬性擷取。請注意,透過 JkEnvVar 傳送的變數不會列在 request.getAttributeNames() 中。
自 1.2.20 版起支援空預設值。自 1.2.21 版起,已新增不傳送具有空預設值和空執行期間值的變數。

JkStripSession

如果此指令在某些虛擬伺服器中設定為開啟,則會移除未轉發但由本機伺服器處理的 URL 的會話 ID ;jsessionid=...
此指令僅允許在 VirtualHost 內使用。
預設為關閉。
此指令已在 1.2.21 版中新增。
自 1.2.27 版起,此指令可以有選用的會話 ID 識別碼。如果未指定,則預設為 ;jsessionid

設定指令類型

我們將在此討論 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 設定記錄層級介於

  • 資訊 記錄將包含標準 mod_jk 活動(預設)。
  • 警告 記錄將包含非致命錯誤報告。
  • 錯誤 記錄還將包含錯誤報告。
  • 偵錯 記錄將包含 mod_jk 活動的所有資訊
  • 追蹤 記錄將包含 mod_jk 活動的所有追蹤資訊
JkLogLevel    info

資訊 應該是您在正常操作中的預設選項。

JkLogStampFormat 將設定 mod_jk 記錄檔中找到的日期/時間格式。請參閱上方以取得詳細資訊。

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

您可以使用 Apache 標準模組 mod_log_config 記錄 mod_jk 資訊。此模組在 Apache 註解表中設定多個註解。其中大多數僅與負載平衡器工作人員結合使用時才有用。

屬性 說明
JK_WORKER_NAMEURI 對應選取的工作人員名稱
JK_WORKER_TYPEURI 對應選取的工作人員類型
JK_WORKER_ROUTEURI 對應選取的實際工作人員名稱(通常是負載平衡器的成員)。
在版本 1.2.26 之前,僅在設定 JkRequestLogFormat 時可用。
JK_REQUEST_DURATION請求持續時間(以秒和微秒為單位)。
在版本 1.2.26 之前,僅在設定 JkRequestLogFormat 時可用。
JK_LB_FIRST_NAME負載平衡器:嘗試的第一個工作人員名稱
JK_LB_FIRST_TYPE負載平衡器:嘗試的第一個工作人員類型
JK_LB_FIRST_ACCESSED負載平衡器:嘗試的第一個工作人員的存取次數
JK_LB_FIRST_SESSIONS負載平衡器:嘗試的第一個工作人員建立的階段數
JK_LB_FIRST_READ負載平衡器:嘗試的第一個工作人員讀取的位元組數
JK_LB_FIRST_TRANSFERRED負載平衡器:嘗試的第一個工作人員傳輸的位元組數
JK_LB_FIRST_ERRORS負載平衡器:嘗試的第一個工作人員的錯誤次數
JK_LB_FIRST_BUSY負載平衡器:嘗試的第一個工作人員的忙碌次數
JK_LB_FIRST_ACTIVATION負載平衡器:嘗試的第一個工作人員的啟動狀態
JK_LB_FIRST_STATE負載平衡器:嘗試的第一個工作人員的錯誤狀態
JK_LB_LAST_NAME負載平衡器:嘗試的最後一個工作人員名稱
JK_LB_LAST_TYPE負載平衡器:嘗試的最後一個工作人員類型
JK_LB_LAST_ACCESSED負載平衡器:嘗試的最後一個工作人員的存取次數
JK_LB_LAST_SESSIONS負載平衡器:最後嘗試的工作階段建立的會話數目
JK_LB_LAST_READ負載平衡器:最後嘗試的工作階段讀取的位元組
JK_LB_LAST_TRANSFERRED負載平衡器:最後嘗試的工作階段傳輸的位元組
JK_LB_LAST_ERRORS負載平衡器:最後嘗試的工作階段的錯誤數目
JK_LB_LAST_BUSY負載平衡器:最後嘗試的工作階段的忙碌數目
JK_LB_LAST_ACTIVATION負載平衡器:最後嘗試的工作階段的啟用狀態
JK_LB_LAST_STATE負載平衡器:最後嘗試的工作階段的錯誤狀態
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 會設定此協定的格式。它會根據每個虛擬主機進行設定和啟用。若要為虛擬主機啟用請求記錄,只要新增 JkRequestLogFormat 設定即可。格式字串的語法類似於 Apache LogFormat 指令,以下是可用的請求記錄格式選項清單

屬性 說明
%b傳送的位元組,不包括 HTTP 標頭 (CLF 格式)
%B傳送的位元組,不包括 HTTP 標頭
%H請求協定
%m請求方法
%p提供請求服務的伺服器正規 Port
%q查詢字串 (如果存在查詢字串,則前面加上 ?,否則為空字串)
%r請求的第一行
%s請求 HTTP 狀態碼
%T請求持續時間,處理請求所花的時間,秒數 '.' 微秒
%U請求的 URL 路徑,不包括任何查詢字串。
%v提供請求服務的伺服器正規 ServerName
%V根據 UseCanonicalName 設定的伺服器名稱
%wTomcat 工作階段名稱
%R實際工作階段名稱
JkRequestLogFormat     "%w %V %T"

轉送

指令 JkOptions 讓您可以設定許多轉送選項,這些選項會啟用 (+) 或停用 (-) 下列選項。如果沒有任何前導符號,選項將會啟用。

下列四個選項 +ForwardURIxxx 互斥。必須只使用其中一個,且不允許使用負號前綴。自 1.2.24 版起,預設值為「ForwardURIProxy」。在 1.2.23 版中為「ForwardURICompatUnparsed」,而 1.2.22 版之前則為「ForwardURICompat」。您可以開啟其他兩個選項之一來關閉預設值。除非您有非常充分的理由,否則應將其設為預設值。

所有選項都會從全域伺服器繼承到虛擬主機。支援啟用 (加號選項) 和停用 (減號選項) 的選項會以下列方式繼承
選項(vhost) = 加號選項(全域) - 減號選項(全域) + 加號選項(vhost) - 減號選項(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。

大多數的網路應用程式都不會使用此類 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 應可供 Apache 使用,不論是靜態或動態 (DSO)

當 DirectoryIndex 已設定時,Apache 會為指令中指定的每個 local-url 建立子要求,以確定是否有符合的本機檔案 (透過 stat-ing 檔案來完成)。

如果 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 Server 的本機位址,而非遠端客戶端位址。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,當使用 ajp13 時,您要求 mod_jk 轉發 SSL 金鑰大小,這是 Servlet API 2.3 所需。當 servlet 引擎為 Tomcat 3.2.x 時,不應設定此旗標(預設開啟)。

JkOptions     +ForwardKeySize

JkOptions ForwardSSLCertChain,當使用 ajp13 時,您要求 mod_jk 轉發 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 指令。

JkUnMount 指令與 JkMount 相反,並封鎖存取特定 URL。目的是能夠從已掛載的內容類型中篩選出特定內容類型。下列範例會掛載 /servlet/* 內容類型,但不會提供屬於該內容類型的所有 .gif 檔案。

# send all requests ending with /servlet to worker1
JkMount /servlet/* worker1
# do not send requests ending with .gif to worker1
JkUnMount /servlet/*.gif worker1

JkUnMount 優先於 JkMount 指令,表示 JK 會先嘗試掛載,然後檢查是否有 JkUnMount 定義的排除。JkUnMount 僅在 JkMount 和 JkUnMount 中的工作人員名稱相同時,才會覆寫 JkMount。

下列範例會封鎖所有 .gif 檔案,即使有 JkMount 可用於這些檔案

# do not send requests ending with .gif to worker1
JkUnMount /*.gif worker1
# The .gif files will not be mounted cause JkUnMount takes
# precedence over JkMount directive
JkMount /servlet/*.gif worker1

從 JK 的 1.2.26 版開始,您可以將 JkUnMount 套用至任何工作人員,方法是在 JkUnMount 中使用星號字元 '*' 作為工作人員名稱。JkUnMount 工作人員名稱中不允許有更複雜的模式。

# Mapping the webapps myapp1 and myapp2:
/myapp1/*=worker1
/myapp2/*=worker2
# Exclude the all subdirectories static for all workers:
!/*/static/*=*
# Exclude some suffixes for all workers:
!*.html=*

JkAutoAlias 指令會自動將 webapp 內容類型目錄別名為 Apache 文件空間。它讓 Apache 能提供靜態內容類型,而 Tomcat 則提供動態內容類型。此指令用於方便,讓您不必為 Tomcat 的 webapp 目錄中的每個應用程式目錄放置 Apache 別名指令。基於安全性考量,強烈建議預設使用 JkMount 將所有請求傳遞給 Tomcat,並使用 JkUnMount 明確排除由 Apache 提供的靜態內容。還應注意,由 Apache 提供的內容會繞過應用程式的 web.xml 中定義的任何安全性限制。此指令僅適用於具有單一路徑元素且沒有版本標記的內容類型的簡單情況。它支援

  • ROOT 情境(例如 .../webapps/ROOT)
  • 多層級情境(例如 .../webapps/foo#bar)
  • 平行部署(例如 .../webapps/foo##v00.05.12)

# enter the full path to the tomcat webapps directory
JkAutoAlias /opt/tomcat/webapps

以下範例說明如何使用 Tomcat 提供動態情境,並使用 Apache 提供靜態情境。webapps 目錄必須可由 Apache 存取。

# enter the full path to the tomcat webapps directory
JkAutoAlias /opt/tomcat/webapps

# Mount 'examples' directory. It's physical location
# is assumed to be in the /opt/tomcat/webapps/examples
# ajp13w is a worker defined in the workers.properties
JkMount /examples/* ajp13w

# Unmount desired static content from examples webapp.
# This content will be served by the Apache directly.
JkUnMount /*.gif ajp13w

請注意,您可以在 httpd.conf 中的每個虛擬主機中只有一個 JkAutoAlias 指令

JkWorkerProperty 是 JK 1.2.7 版中新增的指令。這是一種用於設定通常在 workers.propeties 檔案中設定的指令的便利方法。該指令的參數是 workers.properties 檔案中的原始行。

# Just like workers.properties but exact line is prefixed
# with JkWorkerProperty

# Minimal jk configuration
JkWorkerProperty worker.list=ajp13w
JkWorkerProperty worker.ajp13w.type=ajp13
JkWorkerProperty worker.ajp13w.host=localhost
JkWorkerProperty worker.ajp13w.port=8009   

JkMountFile 是 JK 1.2.9 版中新增的指令。它用於在執行階段動態更新掛載點。當掛載檔案變更時,JK 會重新載入其內容。

# Load mount points

JkMountFile conf/uriworkermap.properties

如果掛載點 URI 以驚嘆號「!」開頭,它會以與 JkUnMount 相同的方式定義一個排除項。如果掛載點 URI 以減號「-」開頭,掛載點將只會被停用。停用的掛載點可以透過刪除減號並等待 JkMountFile 重新載入來重新啟用。排除項可以透過加上減號為其加上前綴來停用。

# Sample uriworkermap.properties file

/examples/*=ajp13w
# Do not map .gif files
!/*.gif=ajp13w
# Make jsp examples initially disabled  
-/examples/jsp/*=ajp13w

在執行階段,您可以變更這個檔案的內容。例如,移除減號將會啟用先前停用的 URI 對應。您可以在執行階段新增任何數量的反映新部署應用程式的全新項目。Apache 會在 60 秒的間隔內重新載入檔案並更新掛載點。

沒有辦法透過動態重新載入來刪除項目,但您可以停用或排除對應。

使用 SetHandler 和環境變數

除了 mod_jk 特定的指令之外,您也可以使用 SetHandler 和環境變數來控制哪些要求會透過哪些工作人員轉送。這會讓您有更大的彈性,但結果可能比較難理解。如果您同時使用這兩種方式來定義轉送,通常 mod_jk 指令會獲勝。

SetHandler jakarta-servlet 會強制要求由 mod_jk 處理。例如,您可以在 Location 區塊中或在 Apache 2.2 及更新版本中也可以在 RewriteRule 中使用 SetHandler。

為了使用 SetEnvIfRewriteRule 來控制工作人員以取得更複雜的規則,您可以將環境變數 JK_WORKER_NAME 設定為您選擇的目標工作人員名稱。這讓您可以更彈性地決定所選擇的工作人員,包括依賴於 cookie 值。此功能已新增至 mod_jk 的 1.2.19 版。此外,您可能會將規則延伸套件附加到工作人員名稱。延伸套件會以分號「;」與工作人員名稱分隔,使用與 uriworkermap.properties 檔案中相同的語法。在工作人員名稱中支援規則延伸套件的功能已新增至 1.2.33 版。

為了使用 JK_WORKER_NAME 以外的變數,您可以透過 JkWorkerIndicator 指令來設定此變數的名稱。

您也可以透過設定環境變數 no-jk 來定義 mod_jk 轉發的排除項目。

# Automatically map all encoded urls
<Location *;jsessionid=>
  SetHandler jakarta-servlet
  SetEnv JK_WORKER_NAME my_worker
</Location>

# Map all subdirs to workers via naming rule
# and exclude static content.
<Location /apps/>
  SetHandler jakarta-servlet
  SetEnvIf REQUEST_URI ^/apps/([^/]*)/ JK_WORKER_NAME=$1
  SetEnvIf REQUEST_URI ^/apps/([^/]*)/static no-jk
</Location>

進階環境變數

環境變數允許根據要求屬性(例如要求 URI、標頭值或 Cookie)覆寫 mod_jk 的預設行為。這可以使用 SetEnvIfRewriteRule 指令來完成。

環境變數 JK_ROUTE 可以設定為明確選擇負載平衡器工作者的成員。其值必須等於成員的路由屬性,或者如果沒有使用該屬性,則等於成員名稱。請注意,這僅在要求中以非標準方式編碼會話 ID 和路由時才需要。預設支援使用 Java Servlet 相容方式編碼 ID 的黏著性。這在版本 1.2.33 中開始提供。

環境變數 JK_REPLY_TIMEOUT 可以設定為動態定義回覆逾時。其值必須以毫秒為單位。這在版本 1.2.27 中開始提供。

環境變數 JK_STICKY_IGNORE 可以設定為停用個別要求的會話黏著性。如果該變數設定為空字串或非零數字,則會停用會話黏著性。將其設定為 0 將重設為工作者組態所定義的行為。這在版本 1.2.33 中開始提供。

當使用基於 Cookie 的會話黏著性時,此功能有助於最佳化負載平衡。在此情況下,只要使用者持續開啟瀏覽器,任何啟動會話的使用者要求都會傳送到同一個 Tomcat 執行個體,即使他離開使用會話的應用程式部分。例如,您可以在使用者要求登入表單時設定此環境變數,以確保此初始會話要求以非黏著性方式進行平衡。

環境變數 JK_STATELESS 可用於改善基於會話的平衡方法 SessionNext 的負載平衡。在此情況下,通常任何沒有會話 ID 的要求都會視為新會話。例如,如果在沒有會話 ID 的情況下擷取靜態內容,這可能會造成問題。如果您為要求設定環境變數 JK_STATELESS,則即使要求沒有會話 ID,也不會將其視為新會話。這在版本 1.2.33 中開始提供。

環境變數 JK_IGNORE_CL 可以設定為強制忽略要求的 Content-Length 標頭(如果存在)。然後,mod_jk 會串流要求主體,直到 Web 伺服器指出已讀取完整主體。不會將 Content-Length 標頭傳送到後端。這在版本 1.2.41 中開始提供。

此功能可用於使 mod_jk 與會變更請求主體大小的篩選器相容。其中一個此類篩選器是 mod_deflate,當用於膨脹具有 gzip 編碼主體的請求主體時。在此情況下,mod_jk 預設會轉送截斷的主體,因為它從網路伺服器取得錯誤的主體大小。告知 mod_jk 忽略 Content-Length 標頭將導致串流所有它可以從網路伺服器讀取到後端的請求主體資料。

您應該只針對實際需要它的請求設定 JK_IGNORE_CL 環境變數。不幸的是,mod_jk 無法自動偵測需求。