Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot apachecan';t连接到新的tomcat 9 ajp_Spring Boot_Apache_Tomcat - Fatal编程技术网

Spring boot apachecan';t连接到新的tomcat 9 ajp

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

将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/
我的开发环境是这样设置的:

  • Angular应用程序(在4200上运行的节点服务器)

  • spring引导后端(在端口8500的tomcat上设置ajp连接器)

  • 正面apache2服务器(位于docker容器上),用于将请求重定向到两个应用程序:

    <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"
    
    在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]
    
    我怀疑这种变化:

    • 在8.5.51以后的版本中,AJP连接器的默认侦听地址更改为环回地址,而不是所有地址

    是什么导致我出现这个问题,但我不知道如何解决它。

    我从未见过这样的代码中设置连接器,而是在server.xml中声明的

    但是,您的代码是

    Connector connector = new Connector("AJP/1.3");
    connector.setScheme("http");
    connector.setPort(8500);
    connector.setSecure(false);
    connector.setAllowTrace(false);
    ((AbstractAjpProtocol) connector.getProtocolHandler()).setSecretRequired(false);
    
    后来你说你知道这个突破性的变化

    在8.5.51以后的版本中,AJP连接器的默认侦听地址更改为环回地址,而不是所有地址

    两者结合:您从未在代码中设置侦听地址-因此您可能使用默认地址。当您试图转发到一个非环回地址时,无法通过这种方式到达服务器


    这个答案的匿名编辑建议
    connector.setAttribute(“地址”,“0.0.0.0”),但就我个人而言,我更喜欢将其保存在server.xml中:连接器通常不会在运行时配置和更改,让管理员编辑文本文件在日常操作中更方便。

    在升级tomcat版本时,我遇到了类似的问题。将下面提到的属性添加到ajp连接器有助于我的案例

    connector.setProperty("address","0.0.0.0");
    connector.setProperty("allowedRequestAttributesPattern",".*");
    ((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
    
    详细说明:

    令你怀疑的是:

    在8.5.51以后的版本中,AJP连接器的默认侦听地址为 更改为环回地址,而不是所有地址

    在此更新之前,tomcat AJP连接器愿意接受来自任何IP地址的请求,因此不需要显式指定“address”属性。但是在这次更新之后,默认行为是AJP连接器只愿意接受作为本地主机发出的请求(环回)。使用下面列出的“address”属性将侦听范围扩展到环回地址以外的地址

    connector.setProperty("address","0.0.0.0"); // OR connector.setProperty("address","::");
    
    使用下面的属性启用所有类型的请求属性(除非您有标题信息,否则在这种情况下启用特定的属性)。具有无法识别的请求属性的请求将被403响应拒绝:

    connector.setProperty("allowedRequestAttributesPattern",".*"); 
    
    使用“secretRequired”属性定义是否需要与HTTP服务器交换机密,以便允许通过ajp进行请求。如果是,则同时设置“secret”属性。否则,请求将失败,返回403

    ((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
    
    参考:

    使用AJP协议需要额外的安全注意事项 因为它允许更直接地操作Tomcat的内部 数据结构比HTTP连接器更重要。应特别注意 支付给地址、机密、机密和必需的值 AllowedRequestAttributes模式属性


    在Spring Boot中,Tomcat嵌入到webapp中,因此没有server.xml可编辑。OP别无选择,只能通过编程创建连接器。当然,他仍然应该通过应用程序属性来配置连接器。他似乎已经声明了一些,但从未在代码中使用它们。
    ((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);