Spring boot apachecan';t连接到新的tomcat 9 ajp
将Spring boot的版本从2.1.4升级到2.3.2后,我的apache2无法再(通过ajp)连接到Spring boot的嵌入式tomcat 它显示以下错误:Spring boot apachecan';t连接到新的tomcat 9 ajp,spring-boot,apache,tomcat,Spring Boot,Apache,Tomcat,将Spring boot的版本从2.1.4升级到2.3.2后,我的apache2无法再(通过ajp)连接到Spring boot的嵌入式tomcat 它显示以下错误: [proxy:error] [pid xxxx ] (111)Connection refused: AH00957: AJP: attempt to connect to 10.0.75.1:8500 (10.0.75.1) failed [proxy_ajp:error] [pid xxxx ] [client xxx ] A
[proxy:error] [pid xxxx ] (111)Connection refused: AH00957: AJP: attempt to connect to 10.0.75.1:8500 (10.0.75.1) failed
[proxy_ajp:error] [pid xxxx ] [client xxx ] AH00896: failed to make connection to backend: 10.0.75.1, referer: http://myapp.develop/home/
我的开发环境是这样设置的:
- Angular应用程序(在4200上运行的节点服务器)
- spring引导后端(在端口8500的tomcat上设置ajp连接器)
- 正面apache2服务器(位于docker容器上),用于将请求重定向到两个应用程序:
在app.properties中:<VirtualHost *:80> ServerName myapp.develop ProxyPass "/home" "http://10.0.75.1:4200/home" ProxyPassReverse "/home" "http://10.0.75.1:4200/home" ProxyPass "/backend" "ajp://10.0.75.1:8500/backend" ProxyPassReverse "/backend" "ajp://10.0.75.1:8500/backend"
这是tomcat日志:tomcat.ajp.port=8500 tomcat.ajp.remoteauthentication=false tomcat.ajp.enabled=true
我怀疑这种变化:o.s.b.w.e.t.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 8500 (http) o.a.c.h.Http11NioProtocol : Initializing ProtocolHandler ["http-nio-8080"] o.a.c.a.AjpNioProtocol : Initializing ProtocolHandler ["ajp-nio-127.0.0.1-8500"] o.a.c.c.StandardService : Starting service [Tomcat] o.a.c.c.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.37]
- 在8.5.51以后的版本中,AJP连接器的默认侦听地址更改为环回地址,而不是所有地址
是什么导致我出现这个问题,但我不知道如何解决它。我从未见过这样的代码中设置连接器,而是在server.xml中声明的 但是,您的代码是
后来你说你知道这个突破性的变化 在8.5.51以后的版本中,AJP连接器的默认侦听地址更改为环回地址,而不是所有地址 两者结合:您从未在代码中设置侦听地址-因此您可能使用默认地址。当您试图转发到一个非环回地址时,无法通过这种方式到达服务器Connector connector = new Connector("AJP/1.3"); connector.setScheme("http"); connector.setPort(8500); connector.setSecure(false); connector.setAllowTrace(false); ((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);
这个答案的匿名编辑建议connector.setAttribute(“地址”,“0.0.0.0”)代码>,但就我个人而言,我更喜欢将其保存在server.xml中:连接器通常不会在运行时配置和更改,让管理员编辑文本文件在日常操作中更方便。在升级tomcat版本时,我遇到了类似的问题。将下面提到的属性添加到ajp连接器有助于我的案例
详细说明: 令你怀疑的是: 在8.5.51以后的版本中,AJP连接器的默认侦听地址为 更改为环回地址,而不是所有地址 在此更新之前,tomcat AJP连接器愿意接受来自任何IP地址的请求,因此不需要显式指定“address”属性。但是在这次更新之后,默认行为是AJP连接器只愿意接受作为本地主机发出的请求(环回)。使用下面列出的“address”属性将侦听范围扩展到环回地址以外的地址connector.setProperty("address","0.0.0.0"); connector.setProperty("allowedRequestAttributesPattern",".*"); ((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
使用下面的属性启用所有类型的请求属性(除非您有标题信息,否则在这种情况下启用特定的属性)。具有无法识别的请求属性的请求将被403响应拒绝:connector.setProperty("address","0.0.0.0"); // OR connector.setProperty("address","::");
使用“secretRequired”属性定义是否需要与HTTP服务器交换机密,以便允许通过ajp进行请求。如果是,则同时设置“secret”属性。否则,请求将失败,返回403connector.setProperty("allowedRequestAttributesPattern",".*");
参考: 使用AJP协议需要额外的安全注意事项 因为它允许更直接地操作Tomcat的内部 数据结构比HTTP连接器更重要。应特别注意 支付给地址、机密、机密和必需的值 AllowedRequestAttributes模式属性((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
在Spring Boot中,Tomcat嵌入到webapp中,因此没有server.xml可编辑。OP别无选择,只能通过编程创建连接器。当然,他仍然应该通过应用程序属性来配置连接器。他似乎已经声明了一些,但从未在代码中使用它们。((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);