へっぽこITエンジニア@名古屋のブログ

Follow me on GitHub

SpringBootとApache連携

SpringBootとAJP/1.3でApache連携する際に、はまったことを記載します。

ajpとhttpの違い。

apacheとSpringBootに内包されているTomcatは、 ajpというプロトコルで連携できます。

ajpはhttpより早いそうで、 理由は以下のためだそうです。

  • TCP/IPレベルの接続を維持したまま接続を使いまわすことをしている。
  • テキストベースのhttpに対してajpは一部、情報をバイナリ化している。

Spring Boot とApacheの連携

記載したソースコードは今のような感じです。

package com.example.demo;

import java.net.InetAddress;
import java.net.UnknownHostException;

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 org.apache.coyote.ajp.AbstractAjpProtocol;

@Configuration
public class AppConfig {
 
    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
        Connector connector = new Connector("AJP/1.3");
        connector.setPort(8009);
        connector.setRedirectPort(8443);
        // はまりポイント①
        ((AbstractAjpProtocol<?>) connector.getProtocolHandler()).setSecretRequired(false);

        // はまりポイント② >>>>
        InetAddress ip = null;
        try {
            ip = InetAddress.getByName("0.0.0.0");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        ((AbstractAjpProtocol<?>) connector.getProtocolHandler()).setAddress(ip);
        // はまりポイント② <<<<
        return factory -> factory.addAdditionalTomcatConnectors(connector);    
    }
}

secretRequiredをfalseに設定

はまったことの1つ目はここです。

((AbstractAjpProtocol<?>) connector.getProtocolHandler()).setSecretRequired(false);

これがないと動作しませんでした。
Tomcatを9.0.34でsecretというのが追加されたようです。 新しいのを使う場合は、気を付けてください。

IPアドレスの設定

はまったことの2つ目はここです。

InetAddress ip = null;
try {
    ip = InetAddress.getByName("0.0.0.0");
} catch (UnknownHostException e) {
    e.printStackTrace();
}
((AbstractAjpProtocol<?>) connector.getProtocolHandler()).setAddress(ip);

0.0.0.0を設定することで、すべてのIPからのアクセスが許可されます。

これがないと、127.0.0.1でapache→tomcatにアクセスしないと AJPの連携ができません。

以下のようにApacheの設定ファイルhttpd.confに記載した場合、サーバ名のところが127.0.0.1でないと動作しません。

ProxyPass / ajp://サーバー名:8009/

なのでapacheとtomcatが同一サーバでないと動作しません。
0.0.0.0はやりすぎかもしれませんが、設定が必要です。

まとめ

spring bootとApacheをajpで連携させるために、@Configurationで設定しますが、 以下2点の設定が必要でした。

  • secretの設定
  • IP「0.0.0.0」の設定

皆さん気を付けてください。

作成日:2022-11-13  更新日:2023-09-16