2012年2月15日

使用 Gradle 開啟 Jetty 的 AJP 協定 (Ajp13SocketConnector)

使用 Gradle + Jetty Plugin 可以快速建立 Java Web App 的開發與測試環境。

但是 jettyRun 或 jettyRunWar task 預設只會啟動 8080 的 Http Server,在某情況下,我們可能需要搭配 Apache 或 Nginx,不管是為了做 load balance 或是讓 local vm 可以對外提供服務,都會用到 AJP。

Jetty 或 Tomcat 等廣泛被使用的 JavaEE Container 都支援 AJP(Apache JServ Protocol) socket connector,它可以讓 Apache(或 Nginx)與 Jetty(或 Tomcat)之間的串接效果更好,包括更好的效能及 SSL 支援等。

關於 Tomcat 及 Nginx 的設定可以參考:

介紹 Jetty + AJP 的文章不少,例如 Eclipse Wiki 提供這篇(Jetty 新版本已由 Eclipse 托管):

不難發現 Jetty 要開啟 AJP 只是在設定中增加一個 Ajp13SocketConnector,但如果要用 Gradle 內建的 Jetty Plugin 完成這件事,用「gradle Ajp13SocketConnector」卻找不到什麼參考資料。

經過一番試驗,發現這個修改可以作用:
  1. 增加一個自訂的 src/main/resources/jetty.xml,對 Jetty Server 執行 addConnector 呼叫。
  2. 在 build.gradle 增加 jetty-ajp dependencies 及 jettyConfig、additionalRuntimeJars 設定。

如此一來,使用 Gradle 建置的 Java Web App,不僅可以輕鬆將 Jetty 用於測試階段,也可以實際透過 AJP 搭配 Apache/Nginx 提供服務。(正式產品還是建議先用 Gradle 打包成 .war 檔再 deploy 到 production server。)

https://gist.github.com/1832631

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!