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で指定したポートとは別に開放されます。
意外と簡単な方法でしたが、これを見つけるまでにまあまあ時間がかかってしまいました……