Spring Boot与Apache和AJP集成的前端

6
有很多文档解释说应该使用其他各种东西(包括简单代理),但是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,提供给用户一个文档化的属性文件。既然那样不起作用,我尝试通过编程方式来实现:
@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

1个回答

3

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

例如:

Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");

可用实现列表: https://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html#Common_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/


http://www.appsdev.is.ed.ac.uk/blog/?p=525 有一个基于属性的示例。 - pdorgambide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接