Apache mod_jk SSL & appBase
我正在為 Apache 設置 mod_jk 以與 Tomcat 一起使用,我遇到了兩個問題。
SSL
我在 Apache 上啟用了 SSL,所有流量都通過 HTTPS,包括轉發到 Tomcat 的請求。Tomcat 是否也需要以任何方式配置 SSL 或者 Apache 是否完全處理它?我發現的所有內容都沒有說 Tomcat 需要任何配置,但我在 Tomcat 中收到以下可能相關的錯誤。
IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
appBase/安裝
我在 Tomcat 中的 appBase 是典型的“path/to/webapps”,當 Apache 轉發請求時,它自然會給出完整路徑。但是,由於我只想將某些 URL 轉發到 Tomcat,所以我的 JkMount 看起來像“JkMount /apps/* worker1”。問題是 Tomcat 將在“path/to/webapps/apps/”中尋找應用程序,這不是應用程序部署所在的目錄。使用 RewriteRule 從我假設的路徑中刪除“應用程序”會導致它不會被轉發到 Tomcat。我不確定是否有更好的解決方案。
所有流量都通過 HTTPS,包括轉發到 Tomcat 的請求
這並不完全正確。如果您使用mod_jk,則從 Apache 到 Tomcat 的請求使用AJP,這是一種非加密二進制協議。您在日誌中發現的錯誤意味著某些東西正在使用二進制協議連接到 Tomcat的**HTTP連接器。**確保您的 Tomcat 配置中有一個 AJP 連接器:
<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
並且您使用相同的埠(例如
8009
)而不是 mod_jk 中的 HTTP 埠worker.properties
。關於JkMount指令,無法使用mod_jk重寫 URI 路徑:如果 Apache 收到請求表單
https://example.com/apps/foo/bar
,它將向 Tomcat 請求/apps/foo/bar
.如果您希望 Apache 進行檢索
/foo/bar
,您可以使用mod_proxy_ajp而不是 mod_jk:ProxyPass "/apps" "ajp://backend.example.com:8009"
但是,我建議不要重寫請求的 URI 路徑。如果你這樣做,你會遇到這樣的問題。