spring-boot 以 Apache 和 AJP 为前端

标签 spring spring-boot mod-jk ajp

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

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

[error] ajp_get_reply::jk_ajp_common.c (2126): (boot_worker_1) Tomcat is down or refused connection. No response has been sent to the client (yet)

[info] ajp_service::jk_ajp_common.c (2623): (boot_worker_1) sending request to tomcat failed (recoverable), because of protocol error (attempt=1)

[error] ajp_connection_tcp_get_message::jk_ajp_common.c (1289): wrong message format 0x4854 from 127.0.0.1:8092

最后一个似乎是一个线索,但我一直没能找到它。

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

--克里斯

最佳答案

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

例如:

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

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

或者简单地指定协议(protocol)(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/

关于spring-boot 以 Apache 和 AJP 为前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458028/

相关文章:

apache - (48) 地址已在使用中:make_sock: 无法绑定(bind)到 OS x Mavericks 上的地址 [::]:80

java - 无法通过 Jackson2ObjectMapperBuilder DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 将空字符串设置为 null

java - Spring Framework 5 中 Guava 的支持下降是什么意思?

java - Spring Boot 2 没有序列化 LocalDateTime

java - 尝试在多个实例上运行批处理作业时出现 DuplicateKey 异常

java - spring boot中两个实体之间的多对多关系

java - 多个数据库的 Dao 接口(interface)?

hibernate - Spring Boot 中的多个 SQL 导入文件

linux - Linux 上 apache 的 mod_jk 模块

tomcat - 如何配置 struts2 与 tomcat 和 apache 与 mod_jk?