有很多文档解释说,您应该使用其他各种东西(包括简单的代理),但是AJP是灵活和快速的,它确实帮助我集成我们的SAML2 SSO,而不必担心任何这些。
现在,我正试图让一个spring引导应用程序以同样的方式工作,并且非常糟糕。其主要症状是“不良网关”,其中包含错误消息,如:
错误ajp_get_reply::jk_ajp_common.c (2126):(boot_worker_1) Tomcat关闭或拒绝连接。尚未向客户端发送任何响应(尚未) info ajp_service::jk_ajp_common.c (2623):(boot_worker_1)向tomcat发送请求失败(可恢复),原因是协议错误(attempt=1) 错误ajp_connection_tcp_get_message::jk_ajp_common.c (1289):来自127.0.0.1:8092的错误消息格式0x4854
最后一条似乎是线索,但我一直找不到。
spring引导手册似乎表明,如果您只有一个连接,您可以在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,因为它只会使事情变得复杂,一旦您花费时间在动物园管理员、kafka等不安全的世界中,您会在一段时间后放弃,并认为您的ESB是RFC1918和防火墙)。
我的问题是:
( 1)这一切真的可以用属性文件来完成吗?
2)使用上述硬编码配置,我可以通过远程访问端口8092发出GET请求.我不知道我为什么能这么做,因为这些GET是http,我已经将协议配置为AJP/1.3,所以我认为它不应该工作。但这就是Apache遇到的问题吗?我找不到任何解释“错误的消息格式0x4854”或错误“-11。
--克里斯
发布于 2015-05-04 15:18:30
我也遇到了同样的问题,并通过添加连接器实现来解决它。
例如:
Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");可用实现列表:Attributes (协议)
或者简单地指定协议(AJP而不是HTTP):
Connector ajpConnector = new Connector("AJP/1.3");有关从属性文件动态读取值的完整示例,请参阅https://blog.swdev.ed.ac.uk/2015/06/24/adding-embedded-tomcat-ajp-support-to-a-spring-boot-application/。
https://stackoverflow.com/questions/29458028
复制相似问题