有很多文档解释说应该使用其他各种东西(包括简单代理),但是AJP非常灵活和快速,并且它真正帮助我集成了我们的SAML2 SSO,而不需要任何Web应用程序担心这些问题。现在我正在尝试使一个Spring Boot应用程序以同样的方式工作,但是遇到了一些麻烦。主要症状是“网关错误”,并显示如下错误消息:
[error]ajp_get_reply::jk_ajp_common.c(2126):(boot_worker_1)Tomcat已关闭或拒绝连接。 尚未向客户端发送任何响应。
[info] ajp_service::jk_ajp_common.c(2623):(boot_worker_1)发送请求到tomcat失败(可恢复),因为协议错误(尝试= 1)
[error] ajp_connection_tcp_get_message::jk_ajp_common.c(1289):来自127.0.0.1:8092的消息格式0x4854错误
最后一个看起来像个线索,但是我还没有找到答案。Spring Boot手册似乎建议如果只有一个连接,则可以在application.properties中设置它 - 这正是我想要做的事情,但我无法找到任何示例。从发布的角度来看,这似乎是理想的 - 发布一个jar,提供给用户一个文档化的属性文件。既然那样不起作用,我尝试通过编程方式来实现:
[error]ajp_get_reply::jk_ajp_common.c(2126):(boot_worker_1)Tomcat已关闭或拒绝连接。 尚未向客户端发送任何响应。
[info] ajp_service::jk_ajp_common.c(2623):(boot_worker_1)发送请求到tomcat失败(可恢复),因为协议错误(尝试= 1)
[error] ajp_connection_tcp_get_message::jk_ajp_common.c(1289):来自127.0.0.1:8092的消息格式0x4854错误
最后一个看起来像个线索,但是我还没有找到答案。Spring Boot手册似乎建议如果只有一个连接,则可以在application.properties中设置它 - 这正是我想要做的事情,但我无法找到任何示例。从发布的角度来看,这似乎是理想的 - 发布一个jar,提供给用户一个文档化的属性文件。既然那样不起作用,我尝试通过编程方式来实现:
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
Connector ajpConnector = new Connector();
ajpConnector.setProtocol("AJP/1.3");
ajpConnector.setPort(8092);
ajpConnector.setSecure(false);
ajpConnector.setAllowTrace(false);
ajpConnector.setScheme("http");
tomcat.addAdditionalTomcatConnectors(ajpConnector);
return tomcat;
}
我真的不想为本地主机连接配置SSL,因为这只会使事情更加复杂。一旦你花时间在未安全保护的zookeeper、kafka等领域,你就会放弃,认为你的ESB已经符合RFC1918并且有防火墙了。
我的问题是:
1)这些都可以通过属性文件完成吗?如何操作?
2)使用上述硬编码配置,我可以通过telnet到8092端口并发出GET请求……我不确定为什么可以这样做,因为这些GET请求是http协议,而我已经将协议配置为AJP/1.3,所以我认为它不应该起作用。但这是Apache遇到的问题吗?我找不到任何关于“错误消息格式0x4854”或错误“-11”的解释。
--Chris