以Apache和AJP为前端的spring boot

以Apache和AJP为前端的spring boot,spring,spring-boot,mod-jk,ajp,Spring,Spring Boot,Mod Jk,Ajp,有很多文档解释您应该使用各种其他东西(包括简单代理),但AJP灵活快速,它确实帮助我集成SAML2 SSO,而无需任何Web应用程序担心这些 我现在正试图让一个spring启动应用程序以同样的方式工作,并且经历了一段非常糟糕的时光。主要症状是“坏网关”,错误消息如下: [错误]ajp_get_reply::jk_ajp_common.c(2126):(boot_worker_1)Tomcat 连接中断或被拒绝。尚未向客户端发送响应 (尚未) [信息]ajp_服务::jk_ajp_common.c

有很多文档解释您应该使用各种其他东西(包括简单代理),但AJP灵活快速,它确实帮助我集成SAML2 SSO,而无需任何Web应用程序担心这些

我现在正试图让一个spring启动应用程序以同样的方式工作,并且经历了一段非常糟糕的时光。主要症状是“坏网关”,错误消息如下:

[错误]ajp_get_reply::jk_ajp_common.c(2126):(boot_worker_1)Tomcat 连接中断或被拒绝。尚未向客户端发送响应 (尚未)

[信息]ajp_服务::jk_ajp_common.c(2623):(引导工作者1)发送 由于协议错误,对tomcat的请求失败(可恢复) (尝试次数=1)

[错误]ajp_连接\u tcp_获取\u消息::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,因为它只会使事情变得复杂,而且一旦你花时间在zookeeper、kafka等不安全的世界中,你可能会在一段时间后放弃,并认为你的ESB是RFC1918和防火墙)

我的问题是:

1) 这一切真的可以用属性文件来完成吗?如何完成

2) 通过以上硬编码配置,我可以远程登录端口8092并发出GET请求。。。我不确定为什么我可以这样做,因为这些GET是http,我已经将协议配置为AJP/1.3,所以我认为它不应该工作。但这就是Apache面临的问题吗?我找不到关于“错误消息格式0x4854”或错误“-11”的任何解释


--Chris

我也遇到了同样的问题,通过添加连接器实现解决了这个问题

例如:

Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");
可用实现的列表: (议定书)

或者只需指定协议(AJP而不是HTTP):

有关从属性文件动态读取值的完整示例,请参见

中的基于属性的示例。
Connector ajpConnector = new Connector("AJP/1.3");