Spring boot 容器化Spring boot应用程序中的AJP不';行不通
我正在尝试使用AJP协议与使用SpringBoot2.2.6创建的应用程序进行通信,该应用程序使用嵌入式Tomcat和容器化。我的服务器使用Apache服务器将所有请求代理到不同的应用程序,容器化的Spring boot应用程序就是其中之一。当使用http-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
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的设置)