Spring-boot与Apache和AJP对接

wz2*_*z2b 5 spring ajp mod-jk spring-boot

有很多文档说明你应该使用各种其他东西(包括简单的代理),但AJP是灵活和快速的,它真的帮助我集成我们的SAML2 SSO,而没有任何webapps不必担心任何这些.

我现在正试图让spring-boot应用程序以相同的方式工作并且有一个非常糟糕的时间.主要症状是"Bad Gateway",错误消息如下:

[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失败(可恢复),因为协议错误(attempt = 1)

[error] ajp_connection_tcp_get_message :: jk_ajp_common.c(1289):错误的消息格式0x4854来自127.0.0.1:8092

最后一个似乎是一个线索,但我一直无法找到它.

春季启动手册似乎表明,如果你只有一个连接,你可以在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;
}
Run Code Online (Sandbox Code Playgroud)

(我真的不愿意为本地主机连接配置SSL,因为它只会使事情变得复杂,一旦你花费时间在动物园管理员,卡夫卡等不安全的世界中,你会在一段时间之后放弃并想象你的无论如何,ESB是RFC1918和防火墙.

我的问题是:

1)这一切都可以通过属性文件完成,以及如何完成?

2)使用上面的硬编码配置,我可以telnet到端口8092并发出GET请求...我不知道为什么我可以这样做,因为这些GET是http,我已经将协议配置为AJP/1.3所以我不认为它应该工作.但这是Apache的问题吗?我找不到"错误的消息格式0x4854"或错误"-11"的任何解释.

- 克里斯

Y.M*_*.M. 3

我遇到了同样的问题并通过添加连接器实现来解决它。

例如 :

Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");
Run Code Online (Sandbox Code Playgroud)

可用实现列表: https://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html#Common_Attributes (协议)

或者简单地指定协议(AJP 而不是 HTTP):

Connector ajpConnector = new Connector("AJP/1.3");
Run Code Online (Sandbox Code Playgroud)

有关从属性文件动态读取值的完整示例,请参阅https://blog.swdev.ed.ac.uk/2015/06/24/adding-embedded-tomcat-ajp-support-to-a-spring-boot-应用/