将 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 ] AH00896: failed to make connection to backend: 10.0.75.1, referer: http://myapp.develop/home/
我的开发环境是这样设置的:<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"
我通过/etc/hosts 上的域名访问我的网络应用程序:myapp.develop
这是我的spring boot tomcat的配置
Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(8500);
connector.setSecure(false);
connector.setAllowTrace(false);
((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);
在 app.properties 中:tomcat.ajp.port=8500
tomcat.ajp.remoteauthentication=false
tomcat.ajp.enabled=true
这是 tomcat 日志: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]
我怀疑这种变化:是什么导致了我这个问题,但我不知道如何解决它。
最佳答案
我在升级 tomcat 版本时遇到了类似的问题。将下面提到的属性添加到 ajp 连接器有助于我的情况。
connector.setProperty("address","0.0.0.0");
connector.setProperty("allowedRequestAttributesPattern",".*");
((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
详细说明:对于你的疑问:
In 8.5.51 onwards, the default listen address of the AJP Connector was changed to the loopback address rather than all addresses.
在此更新之前,tomcat AJP 连接器愿意接受来自任何 IP 地址的请求,因此不需要明确指定“地址”属性。但是在此更新之后,默认行为是 AJP 连接器愿意接受仅作为 localhost(环回)发出的请求。使用下面列出的“地址”属性将监听范围扩展到不仅是环回地址
connector.setProperty("address","0.0.0.0"); // OR connector.setProperty("address","::");
使用以下属性启用所有类型的请求属性(除非您有 header 信息,在这种情况下启用特定的)。具有无法识别的请求属性的请求将被拒绝并返回 403 响应:connector.setProperty("allowedRequestAttributesPattern",".*");
使用“secretRequired”属性来定义是否需要与 HTTP 服务器交换 secret 以允许通过 ajp 的请求。如果是,则还要设置“secret”属性。否则请求将失败并显示 403。((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
引用:Apache Tomcat 8 Configuration ReferenceUse of the AJP protocol requires additional security considerations because it allows greater direct manipulation of Tomcat's internal data structures than the HTTP connectors. Particular attention should be paid to the values used for the address, secret, secretRequired and allowedRequestAttributesPattern attributes.
关于spring-boot - Apache 无法连接到新的 tomcat 9 ajp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63505670/