AJP в загрузочном приложении Spring в контейнере не работает - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать протокол AJP для связи с приложением, созданным с помощью Spring Boot 2.2.6 со встроенным Tomcat и упакованным в контейнеры с использованием этого официального руководства . Мой сервер использует Apache Сервер для передачи всех запросов к различным приложениям, и загрузочное приложение Spring в контейнерах является одним из них. Связь работает просто отлично, когда используется http - AJP связь не работает, хотя. Более того, он прекрасно работает, когда я не упаковал приложение и не запустил его, используя java инструмент командной строки.

Я использую скрипт AJPing для проверки доступа AJP.

А вот конфигурация разъема AJP:

@Configuration
public class TomcatConfiguration implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>
{
    @Value( "${tomcat.ajp.secret}" )
    String ajpSecret;

    @Override
    public void customize( TomcatServletWebServerFactory factory )
    {
        factory.addAdditionalTomcatConnectors( ajpConnector() );
    }

    private Connector ajpConnector()
    {
        Connector connector = new Connector( "AJP/1.3" );
        AjpNioProtocol protocol = (AjpNioProtocol) connector.getProtocolHandler();
        protocol.setSecret( ajpSecret );
        connector.setPort( 8009 );
        connector.setSecure( true );

        return connector;
    }
}

1 Ответ

0 голосов
/ 30 апреля 2020

Итак, я исследовал эту проблему, проверив, какие порты используются в контейнере:

docker ps
docker exec -it ${docker-id-from-previous-command} netstat -lntup

, и вот результат, который я получил:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.11:8009            0.0.0.0:*               LISTEN      1/java
tcp        0      0 127.0.0.11:37327        0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1/java
udp        0      0 127.0.0.11:55038        0.0.0.0:*   

Итак, я мог видеть этот порт 8009 использовался AJP, но bind-адрес отличался от адреса, используемого портом 8080. Поэтому установка адреса порта на «0.0.0.0» решила мою проблему, но я не могу сказать, что полностью ее понимаю - вот конфигурация с исправлением:

@Configuration
public class TomcatConfiguration implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>
{
    @Value( "${tomcat.ajp.secret}" )
    String ajpSecret;

    @Override
    public void customize( TomcatServletWebServerFactory factory )
    {
        factory.addAdditionalTomcatConnectors( ajpConnector() );
    }

    private Connector ajpConnector()
    {
        Connector connector = new Connector( "AJP/1.3" );
        AjpNioProtocol protocol = (AjpNioProtocol) connector.getProtocolHandler();
        protocol.setSecret( ajpSecret );
        connector.setPort( 8009 );
        connector.setSecure( true );

        try
        {
            protocol.setAddress( InetAddress.getByName( "0.0.0.0" ) );
        }
        catch( UnknownHostException e )
        {
            e.printStackTrace();
        }

        return connector;
    }
}
...