Apache mod_proxy 뒤에 Discourse 설치 방법

안녕하세요 여러분.

Docker 컨테이너에서 Discourse를 설정하려고 합니다. 호스트 환경(Debian)에는 Apache httpd 서버가 실행 중입니다(다른 사이트를 Apache에 호스팅하고 있기 때문에 nginx를 실행할 수 없습니다). 포트 3000에서 리스닝 중인 컨테이너로 리버스 프록시하기 위해 mod_proxy를 사용하려고 합니다.

현재 이 vhost에 대한 Apache 설정은 다음과 같습니다:

<VirtualHost *:80>
  ServerAdmin webmaster@example.com
  ServerName example.com
  ServerAlias www.example.com

  ErrorLog ${APACHE_LOG_DIR}/vhosts/example.com/error.log
  CustomLog ${APACHE_LOG_DIR}/vhosts/example.com/access.log combined

  <IfModule proxy_module>
  ## <https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247>
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
  </IfModule>
</VirtualHost>

처음에는 ProxyPass와 ProxyPassReverse 지시어만 사용하고, ProxyPreserveHost와 RequestHeader 지시어를 하나씩 추가해 보았습니다. 이러한 지시어로 프록시를 어떻게 구성하든, 문서 루트 아래에 있는 특정 파일(예: /images와 /assets 안의 항목)에 액세스할 때 404 오류가 발생합니다.

nginx 구문에서 Apache 구문으로 변환한 Discourse Meta URL이 포함된 주석을 참고해 주세요.

이 문제를 해결하는 방법에 대한 조언을 주시면 감사하겠습니다!

Set up Discourse on a server with existing Apache sites 를 확인해 보세요.

즉, 제안하시는 해결책은 Apache 뒤에 HAProxy를, 그리고 HAProxy 뒤에 Discourse를 실행하는 것이죠?

말씀드렸듯이, 이 머신에 다른 vhost를 호스팅하고 있기 때문에 프론트에 Apache를 사용해야 합니다.

nginx를 쓰지 않는 이유는 무엇인가요? Apache 환경에서 Discourse의 성능이 어떤지 확신이 서지 않습니다.

지금 당장 nginx로 전환할 시간이나 자원이 없습니다.

정리하자면, Discourse 자체는 nginx에서 실행되지만 Apache를 통해 프록시되어야 합니다.

이 문제에 대해 조금 더 조사해 본 결과, HAProxy가 vhost를 기준으로 백엔드를 선택할 수 있는 것 같아서 내가 원하는 것을 달성할 수 있을 것 같습니다.

죄송합니다. 검색을 잘못했습니다. Apache에 대한 #howto를 다시 시도해 보시면 찾을 수 있을지도 모릅니다.

HAProxy는 제가 원하는 기능을 제공하며, 매우 세련되고 유용한 도구로 보입니다. 안내해 주셔서 감사합니다.

그러나 templates/web*.yml 파일을 편집하여 기본 포트인 80과 443 외에 다른 포트에서 리스닝하도록 설정하는 부분이 문제였던 것 같습니다. 기본 설정으로 되돌린 후 containser/app.yml 파일을 편집하여 다음과 유사한 줄을 추가했는데, 404 오류가 사라졌습니다:

expose:
  - "127.0.0.1:1234:80"    # http

요즘 traefik을 써서 정말 만족하고 있어요. Let’s Encrypt 인증서를 자동으로 발급해 주거든요. (HA-Proxy도 가능하지만, 설정이 좀 더 번거로워요.)

해결하셨다니 다행이에요!