SpringBootで複数ポート接続を行う

SpringBootを使用したWebAPIを作成しているんですが、その際に443ポート(HTTPS)をデフォルトとして使用していました。

が、サービス稼働の監視の用途で80ポート(HTTP)でもアクセスを許可しないといけない事になったので、その方法を調べてみた所以下の方法でできましたので、備忘録として残しておきます。

動作を確認したSpringBootのバージョンは2.2.5RELEASEになります。

設定ファイルのみでは実現不可

設定ファイルに使用するポートを書く形になるんですが、ここには1つのポートしか指定できないので、設定ファイルだけでは複数ポートの許可を行えません。

server.port=443
server.ssl.enabled=true
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=storepassword
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=mycert

例としてはこんな形でSSL可をしていますが(properties形式)、これだとポートは1つのみの指定になります。

内部のTomcatの設定を書き換える事で可能に

じゃあどうするかと言えば、SpringBootに内蔵されているTomcatの設定を書き換える形のメソッドを書いてあげれば行けました。

具体的には、まず(プロジェクト名)Applicationクラスに以下の様に追記してあげます。

@SpringBootApplication
public class TestApplication {

    @Value("${server.http.port}")
    private int httpPort;

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(httpPort);
        return connector;
    }
}

ServletWebServerFactoryを返すservletContainerメソッドを書き、その中で新たなコネクションを生成する形になります。

ServletWebServerFactoryはインターフェースですが、返す実装はTomcatServletWebServerFactoryとなっています。

@Value(“${server.http.port}”)でポート番号を指定しますので、設定ファイルの方でもserver.http.portの項目を設定すれば、そのポートがserver.portで指定したポートとは別に開放されます。

意外と簡単な方法でしたが、これを見つけるまでにまあまあ時間がかかってしまいました……

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です