Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

Apache + Spring Bootの環境構築メモ

スポンサードリンク

f:id:fa11enprince:20180508140318j:plain 開発環境での構築手順です。 本番環境なら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/imagespublic/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間をバイナリでやり取りするとのこと。