Apache 2.4에서 동일한 서버의 상대 URL("하위 디렉터리")에서 "포트" 응용 프로그램을 프록시로 사용합니까?

Apache 2.4에서 동일한 서버의 상대 URL("하위 디렉터리")에서 "포트" 응용 프로그램을 프록시로 사용합니까?

나는 보았다역방향 프록시를 사용하여 상대 URL을 올바르게 처리하는 방법- 그러나 나는 이것을 이해하고 그것을 내 문제에 적용하는 데 큰 어려움을 겪고 있습니다. 누군가가 도울 수 있기를 바랍니다.

내 서버에 서버 OS로 Ubuntu 20.04가 있다고 가정해 보겠습니다 example.com.

그런 다음 설치합니다.https://github.com/hartwork/jawanndenn서버에서 실행합니다. 이 애플리케이션은 기본적으로 포트 8080에서 실행됩니다. 다음을 실행하여 서버 자체에서 실행되는지 확인할 수 있습니다.

wget -O- http://127.0.0.1:8080

여태까지는 그런대로 잘됐다. 이제 제가 원하는 것은 https://example.com:8080이 애플리케이션에 액세스하기 위해 액세스하는 대신 액세스하고 싶습니다 https://example.com/jaw. 일반적으로 "하위 디렉터리"라고 부르지 /jaw만 더 정확하게는 상대 URL일 수도 있습니다. 즉, 용어를 올바르게 이해하면 https://example.com/jaw프록시를 https://example.com:8080.

그래서 나는 <VirtualHost *:443>.conf파일의 정의 내에서 이 작업을 시도했습니다.

  <Location /jaw>
    Options -Multiviews -Indexes
    RewriteEngine On
    ProxyPass         http://127.0.0.1:8080
    ProxyPassReverse  http://127.0.0.1:8080
    SetOutputFilter proxy-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </Location>
  RewriteRule ^/jaw$ /jaw/ [R]

이는 작동합니다. 즉, 애플리케이션의 시작 페이지가 로드된다는 의미입니다. 하지만 엄청난 양의 리소스(.css, .js)를 로드할 수 없습니다. 브라우저에서 콘솔을 열면 다음에 대한 여러 404 요청을 볼 수 있습니다.

https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...

그래서 내 생각에는 단순히 로드하려는 .js 파일이나 이와 유사한 파일이 있고 /static/..."포트" 주소에서 호출되면 해당 파일이 매핑되고 http://127.0.0.1:8080/static/...모두 괜찮을 것입니다. 하지만 지금은 프록시가 지정되었으므로 다음과 같습니다.

  • 브라우저 요청https://example.com/jaw
  • https://example.com:8080Apache는 이를 받아 애플리케이션이 수신하는 으로 전달합니다 .
  • 애플리케이션은 다음 형식의 링크가 있는 파일(.js)을 다시 보냅니다./static/...
  • 브라우저에 다시 도착하면 https://example.com/static/...서버에 대한 요청으로 사용되기 전에 -로 해석되어 서버에서 찾을 수 없습니다.

또한 위의 전체 코드 조각을 제거 <Location>하고 노드에서 다음을 사용해 보았습니다 <VirtualHost *:443>.

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

이전과 똑같은 일이 발생합니다. 첫 번째 페이지가 로드되고 다른 모든 리소스는 명백히 참조되며 /static/...모두 404입니다.

마지막으로 위의 진술도 제거하고 다음을 사용했습니다.

  ProxyPass /jaw/  http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080  /jaw
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

이는 정확히 동일한 동작을 가집니다. 첫 번째 페이지 로드, 리소스 실패. 단, 리소스는 이제 브라우저 콘솔에 다음과 같이 나열됩니다.

https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...

... 그리고 502 프록시 오류로 인해 실패합니다. 그래서 일부 재작성이 발생했지만 여전히 뭔가가 옳지 않습니다.

그래서 내 질문은 - 어떻게 Apache에 프록시로 말할 수 있습니까?모든 것127.0.0.1:8080의 애플리케이션에서 "하위 디렉터리"(상대 URL? 여기 /jaw)로 나타나는 항목으로 이동합니까?


편집: 502 프록시 오류의 원인은 다음과 같습니다.

AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js

... 슬래시가 누락된 것이 분명합니다. 그래서 결국 이렇게 되었습니다:

  ProxyPass /jaw/  http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/  /jaw/
  <Location /jaw/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTMLEnable On
    ProxyHTMLURLMap  /  /jaw/
  </Location>

... 실제로 작동합니다 - 대부분의 경우( /static자원); 그런데 그때 전화가 와요./data 그런데 이 호출이 처리되지 않는 경우가모든 것"

답변1

올바른 기본 URL로 백엔드 서버를 구성하세요. 이는 프록시를 강제로 다시 작성하는 것보다 훨씬 쉽습니다.

설정은 이어야 합니다 JAWANNDENN_URL_PREFIX. 로 설정하면 /jaw모든 URL이 올바르게 생성됩니다.

그러면 첫 번째 예는 ProxyHTMLURLMap 및 OutputFilter 없이도 작동합니다.

관련 정보