사용자 정의 컨텍스트 XML을 사용할 때 Manager URL API를 사용하여 Tomcat 애플리케이션을 배포하는 방법

사용자 정의 컨텍스트 XML을 사용할 때 Manager URL API를 사용하여 Tomcat 애플리케이션을 배포하는 방법

내 애플리케이션 컨텍스트는 my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml.

<Context docBase='/my/path/to/myApp/myAppWarFile.war'>
   <Environment name='my_config_dir' value='/my/path/to/myApp' type='java.lang.String'/>
</Context>

/my/path/to/myAppWAR 파일 myAppWarFile.war과 Spring이 읽는 여러 외부화된 속성이 포함되어 있습니다.

Tomcat은 autoDeploy가 꺼진 상태로 구성됩니다. Tomcat을 시작하면 my/path/to/Tomcat/conf/webapps/my-app/예상대로 WAR 파일이 생성되고 이 위치에 압축이 풀립니다. 물론 애플리케이션도 예상대로 실행될 수 있습니다.

Tomcat을 다시 시작하지 않고 새 버전을 배포하려면 다음과 같이 undeploy 명령을 실행합니다.

curl http://localhost:8080/manager/text/undeploy?path=/my-app --user my-username:my-password

... 그리고 그것은 작동합니다. 그러나 Tomcat에 다음 컬 문을 사용하여 배포하도록 지시하면 오류가 발생합니다.

curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml --user my-username:my-password
# Tomcat response
FAIL - Invalid context path null was specified

경로를 추가해도 큰 도움이 되지 않으며 여전히 실패합니다.

curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml\&path=/my-app --user my-username:my-password

# Tomcat response
FAIL - Failed to deploy application at context path /my-app

최악의 부분은 catalina.out을 추적해도 아무런 통찰력을 얻을 수 없다는 것입니다. 게다가 Tomcat은 애플리케이션 컨텍스트 XML 파일을 삭제합니다 my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml!

당연히 나는 Tomcat 문서를 검토했습니다(https://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Deploy_using_a_Context_configuration_%22.xml%22_file) 그리고 나는 이것을 알아내기 위해 하루 종일 구글을 검색했지만 이 특정 구성에 도움이 될 수 있는 것을 찾지 못했습니다.

선택은 다음과 같습니다.

  1. autoDeploy가 설정된 Tomcat(프로덕션에는 권장되지 않음) 이 경우 새 WAR을 삭제하기만 하면 /my/path/to/myApp/Tomcat이 앱을 핫 배포하게 됩니다.
  2. autoDeploy가 꺼진 Tomcat이지만 재배포하려면 배포 API가 광고된 대로 작동하지 않는 것 같기 때문에 Tomcat을 다시 시작해야 합니다.

이 구성으로 이 작업을 수행한 사람이 있습니까?

편집하다:

Catalina에 로그인을 설정했습니다. 경로 없이 첫 번째 배포 명령을 실행하면 다음과 같은 로그 항목 세트가 표시됩니다.

FINE: Start processing with input [config=file:/my/apth/to/tomcat/conf/Catalina/localhost/my-app.xml]
Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [OPEN]
Oct 13, 2015 10:04:53 AM org.apache.coyote.http11.AbstractHttp11Processor process
FINE: Error parsing HTTP request header
java.io.EOFException: Unexpected EOF read on the socket
    at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:168)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:982)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:744)

Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [CLOSED]
Oct 13, 2015 10:04:53 AM org.apache.tomcat.util.threads.LimitLatch countDown
FINE: Counting down[http-bio-8080-exec-16] latch=1

답변1

문제는 일반적인 것입니다. 바이너리 이식 가능한 war 파일을 사용하면 컨텍스트 구성(환경)이 war 파일이 아닌 있어야 하는 컨텍스트에 있습니다. 재배포 시(예: 소프트웨어 패치 적용 시) 컨테이너(Tomcat)는 컨텍스트를 삭제하지 않고 재배포해야 합니다.

이 문제는 다음에서 해결되고 있습니다.컨텍스트를 삭제하지 않고 전쟁에서 재배포. 분명히 이것은 텍스트 인터페이스에서 이미 가능하다고 가정하므로 이것이 불가능한 경우는 버그로 간주될 수 있습니다.

제안된 해결 방법은 Tomcat 문제가 해결될 때까지 지켜보는 것입니다. 왜냐하면 이 서버 오류 문제가 그것과 중복되기 때문입니다.

관련 정보