Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 容器化Spring boot应用程序中的AJP不';行不通_Spring Boot_Docker_Ajp_Embedded Tomcat 8 - Fatal编程技术网

Spring boot 容器化Spring boot应用程序中的AJP不';行不通

Spring boot 容器化Spring boot应用程序中的AJP不';行不通,spring-boot,docker,ajp,embedded-tomcat-8,Spring Boot,Docker,Ajp,Embedded Tomcat 8,我正在尝试使用AJP协议与使用SpringBoot2.2.6创建的应用程序进行通信,该应用程序使用嵌入式Tomcat和容器化。我的服务器使用Apache服务器将所有请求代理到不同的应用程序,容器化的Spring boot应用程序就是其中之一。当使用http-AJP通信无法工作时,通信工作正常。此外,当我没有将应用程序容器化,只是使用java命令行工具启动它时,它工作得很好 我正在使用脚本检查AJP访问 以下是AJP连接器配置: @Configuration public class Tomcat

我正在尝试使用AJP协议与使用SpringBoot2.2.6创建的应用程序进行通信,该应用程序使用嵌入式Tomcat和容器化。我的服务器使用Apache服务器将所有请求代理到不同的应用程序,容器化的Spring boot应用程序就是其中之一。当使用http-AJP通信无法工作时,通信工作正常。此外,当我没有将应用程序容器化,只是使用
java
命令行工具启动它时,它工作得很好

我正在使用脚本检查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;
    }
}
@配置
公共类TomcatConfiguration实现WebServerFactoryCustomizer
{
@值(${tomcat.ajp.secret}”)
弦乐演奏秘密;
@凌驾
公共void自定义(TomcatServletWebServerFactory)
{
addAdditionalTomcatConnectors(ajpConnector());
}
专用连接器ajpConnector()
{
连接器=新连接器(“AJP/1.3”);
AjpNioProtocol协议=(AjpNioProtocol)连接器。getProtocolHandler();
协议设置机密(ajpSecret);
连接器。设置端口(8009);
连接器。设置安全(正确);
返回连接器;
}
}

因此,我通过检查容器中使用的端口来调查此问题:

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:*   
所以我可以看到AJP使用的端口8009在那里,但是绑定地址与端口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;
    }
}
@配置
公共类TomcatConfiguration实现WebServerFactoryCustomizer
{
@值(${tomcat.ajp.secret}”)
弦乐演奏秘密;
@凌驾
公共void自定义(TomcatServletWebServerFactory)
{
addAdditionalTomcatConnectors(ajpConnector());
}
专用连接器ajpConnector()
{
连接器=新连接器(“AJP/1.3”);
AjpNioProtocol协议=(AjpNioProtocol)连接器。getProtocolHandler();
协议设置机密(ajpSecret);
连接器。设置端口(8009);
连接器。设置安全(正确);
尝试
{
协议.setAddress(InetAddress.getByName(“0.0.0.0”);
}
捕获(未知后异常e)
{
e、 printStackTrace();
}
返回连接器;
}
}

因此,我通过检查容器中使用的端口来调查此问题:

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:*   
所以我可以看到AJP使用的端口8009在那里,但是绑定地址与端口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;
    }
}
@配置
公共类TomcatConfiguration实现WebServerFactoryCustomizer
{
@值(${tomcat.ajp.secret}”)
弦乐演奏秘密;
@凌驾
公共void自定义(TomcatServletWebServerFactory)
{
addAdditionalTomcatConnectors(ajpConnector());
}
专用连接器ajpConnector()
{
连接器=新连接器(“AJP/1.3”);
AjpNioProtocol协议=(AjpNioProtocol)连接器。getProtocolHandler();
协议设置机密(ajpSecret);
连接器。设置端口(8009);
连接器。设置安全(正确);
尝试
{
协议.setAddress(InetAddress.getByName(“0.0.0.0”);
}
捕获(未知后异常e)
{
e、 printStackTrace();
}
返回连接器;
}
}
也许吧

地址

对于具有多个IP地址的服务器,此属性指定将用于侦听指定端口的地址默认情况下,连接器将侦听环回地址。除非使用系统属性对JVM进行了其他配置,否则基于Java的连接器(NIO、NIO2)在配置为0.0.0.0或::时将侦听IPv4和IPv6地址。如果配置为0.0.0.0,则APR/本机连接器将仅侦听IPv4地址;如果配置为::,则APR/本机连接器将侦听IPv6地址(以及可选的IPv4地址,具体取决于ipv6v6only的设置)

地址

对于具有多个IP地址的服务器,此属性指定将用于侦听指定端口的地址默认情况下,连接器将侦听环回地址。除非使用系统属性对JVM进行了其他配置,否则基于Java的连接器(NIO、NIO2)在配置为0.0.0.0或::时将侦听IPv4和IPv6地址。如果配置为0.0.0.0,APR/本机连接器将仅侦听IPv4地址;如果配置为:,则APR/本机连接器将侦听IPv6地址(以及可选的IPv4地址,具体取决于ipv6v6only的设置)