開発環境での構築手順です。
本番環境ならajpを使ったほうが良いと思います。
組込みTomcat(jar)を使った場合のajpの有効化方法は後述します。
今回は単純にApacheとSpring Bootをhttpで連携する方法を書きます。
Windowsを想定しています。
(Linuxとほぼ変わらないですが、
今回使うApcheのディストリビューションの形式がLinuxの一般的なものと配置などが違っています。)
Spring Bootのjarの準備
単純にmvn install / mvn package
などすればjarが出来上がります(Mavenの場合)。
Apacheのインストール
入手先がわかりにくいので、
https://httpd.apache.org/download.cgi
でFiles for Microsoft Windows
のリンクをたどる
https://httpd.apache.org/docs/current/platform/windows.html#down
に飛ぶはずなので、Apache Lounge
のリンクを押します。
そうすると、
https://www.apachelounge.com/download/
に飛びますので、
Apache 2.4.38 Win64
をダウンロードします
ダウンロードしたhttpd-2.4.38-win64-VC15.zip
を展開します。
httpd-2.4.38-win64-VC15
フォルダの中に
Apache24フォルダ -- Win64 VC15 -- ReadMe.txt
があるので、ReadMe.txtを_ReadMe.txt
にリネームしてApache24フォルダに移動させましょう。
リネームしたReadMe.txtは大事なことが書いてあるので一度読んでおきましょう。
-- Win64 VC15 --
はどうでもいいのですが、これも一応移動させておきましょう。
あとはApache24フォルダをCドライブ直下に置けばOKです。
Apacheの設定とサービス化
最低限の設定をします。 今回は単純にhttp://localhost:8080をリバースプロクシするだけということにしておきます。
Apache24\conf\httpd.conf
なにやらいっぱいモジュールの設定がコメントアウトされていますが、
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
の2つを有効化するだけでOKです(今回はajpを使いませんが)。
今回DocumentRoot
の設定は特にいじりません。
htdocs
が嫌とかそういうことがあれば変えてください。
Options Indexes FollowSymLinks
とかAllowOverride None
とかなんだっけという方はこちら。
core - Apache HTTP サーバ バージョン 2.4
あと、末尾にTimeOut 3600
を付け加えておきます
Apache24\conf\extra\proxy-html.conf
末尾に追加します
# /images/... へのリクエストはプロキシしない(必要に応じて) ProxyPass /images/ ! ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/
2行目はWebアプリ内部で/imagesでアクセスできるものがあればプロクシしたくないはずなので、
たいていは書くことになるのかなと思います。
具体的にはSpring Boot配下に作ったstatic/images
かpublic/images
が存在するときです。
これらが終われば、管理者でコマンドプロンプトを立ち上げて
C:\Apache24\bin\httpd -t
と打ってSyntax OK
とでればサービス化します
C:\Apache24\bin\httpd -k install
でおしまいです。サービス一覧で確認すると起動していると思います。
組込みTomcatでのajp有効化方法
java - Spring Boot 2 - AJP - Stack Overflow によると下記のように書くとできるそうです。 Spring Boot 2ではこのように書きます。
import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Optional; @Configuration public class AppConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() { return server -> Optional.ofNullable(server) .ifPresent(s -> s.addAdditionalTomcatConnectors(redirectConnector())); } private Connector redirectConnector() { Connector connector = new Connector("AJP/1.3"); connector.setScheme("http"); connector.setPort(8009); connector.setRedirectPort(8443); connector.setSecure(false); connector.setAllowTrace(false); return connector; } }
この場合設定ファイルを
ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/
とするだけです。 検証したら追記・修正するかも…。
そもそもAJPとは
ざっくりいうとAJPのほうが早いらしくHTTPのようなオーバヘッドがない。
Apache HTTP ServerとTomcat間をバイナリでやり取りするとのこと。