Apache는 새로운 Tomcat 9 ajp에 연결할 수 없습니다.
내 apache2는 스프링 부트 버전을 2.1.4에서 2.3.2로 업그레이드 한 후 더 이상 내 스프링 부트의 포함 된 바람둥이에 연결할 수 없습니다 (ajp로).
다음 오류가 표시됩니다.
[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에서 실행되는 노드 서버)
스프링 부트 백엔드 (포트 8500의 tomcat에 설정된 ajp 커넥터)
두 앱에 요청을 리디렉션하도록 설정된 정면 apache2 서버 (도커 컨테이너에 있음) :
<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
이것은 내 봄 부팅 바람둥이의 구성입니다.
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
그리고 이것은 바람둥이 로그입니다.
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 커넥터의 기본 수신 주소가 모든 주소가 아닌 루프백 주소로 변경되었습니다.
나 에게이 문제를 일으키는 원인이지만 해결 방법을 모르겠습니다.
답변
바람둥이 버전을 업그레이드 할 때 비슷한 문제가 발생했습니다. 아래 언급 된 속성을 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 커넥터가 localhost (루프백)로만 요청을 수락하는 것입니다. 아래 나열된 "주소"속성을 사용하여 루프백 주소뿐만 아니라 수신 범위를 확장합니다.
connector.setProperty("address","0.0.0.0"); // OR connector.setProperty("address","::");
아래 속성을 사용하여 모든 유형의 요청 속성을 활성화합니다 (헤더 정보가없는 경우 특정 속성을 활성화합니다). 인식 할 수없는 요청 속성이있는 요청은 403 응답으로 거부됩니다.
connector.setProperty("allowedRequestAttributesPattern",".*");
"secretRequired"속성을 사용하여 ajp를 통한 요청을 허용하기 위해 HTTP 서버와 비밀을 교환해야하는지 여부를 정의합니다. 그렇다면 "비밀"속성도 설정하십시오. 그렇지 않으면 요청이 403으로 실패합니다.
((AbstractAjpProtocol)connector.getProtocolHandler()).setSecretRequired(false);
참조 : Apache Tomcat 8 구성 참조
AJP 프로토콜을 사용하면 HTTP 커넥터보다 Tomcat의 내부 데이터 구조를 더 직접적으로 조작 할 수 있으므로 추가적인 보안 고려 사항이 필요합니다. address , secret , secretRequired 및 allowedRequestAttributesPattern 속성에 사용되는 값에 특히주의해야 합니다.
이 같은 코드에서 커넥터가 설정되는 것을 본 적이 없으며 오히려 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("address", "0.0.0.0");
했지만 개인적으로 server.xml에 보관하는 것을 선호합니다. 커넥터는 일반적으로 런타임에 구성 및 변경되지 않으며 관리자가 텍스트 파일을 편집하도록하는 것이 일상적으로 훨씬 더 편리합니다. -하루 운영.