기본 nginx 대신 Apache vhost에서 Discourse를 실행하는 데 성공하신 분이 계신가요?
이 포럼에서 Apache 관련 논의의 대부분은 이미 Apache가 실행 중인 호스트에서 Discourse를 실행하는 방법에 대한 것입니다. 제가 본 모든 사례에서 사람들은 Apache를 nginx로 프록시하도록 설정하고 있었습니다. 명확히 하자면: 저는 Discourse를 실행하는 Docker 백엔드 컨테이너가 Nginx가 아닌 Apache에서 가상 호스트를 실행하길 원합니다.
구체적으로 말하면, mod_security를 활성화하기 위해 Nginx 대신 Apache에서 Discourse 백엔드를 실행하길 희망합니다. Nginx에 mod_security를 설정하려면 소스에서 Nginx를 컴파일해야 하는데, 이러한 복잡성은 피하고 싶습니다.
현재 프로덕션 서버에는 여러 사이트(WordPress, MediaWiki 등)가 이미 실행 중입니다. 우리는 Nginx로 HTTPS를 종료하고 기본적인 DOS 속도 제한을 수행한 후, Varnish 캐시를 거쳐 mod_security가 적용된 Apache 백엔드로 요청을 전달하는 아키텍처를 사용하고 있습니다. 가능하다면 Discourse에도 이 아키텍처를 유지하고 싶으며, 백엔드 Discourse Docker 컨테이너가 Nginx가 아닌 mod_security가 적용된 Apache를 실행하도록 하고 싶습니다.
죄송합니다, 저는 Docker에 처음입니다. ‘/etc/nginx/conf.d/discourse.conf’ 파일이 Docker 컨테이너에 어떻게 배치되는지 찾는 데 큰 어려움을 겪고 있습니다. ‘./launcher’ 스크립트가 이 파일을 생성하고 컨테이너에 배치하는 과정을 단계별로 설명해 주실 수 있을까요?
수정: 잠깐, Nginx가 이미 Discourse에 의해 소스에서 컴파일되고 있는 건가요?
저는 image/base/install-nginx에서 소스에서 nginx를 컴파일할 때 nginx가 nginx.sample.conf 파일을 단순히 설치한다고 가정하고 있었습니다. 하지만 컨테이너에서 찾은 유일한 nginx.sample.conf 파일(/var/www/discourse/config/nginx.sample.conf)에는 이미 Discourse에 특화된 지시문(directives)이 포함되어 있었습니다.
정확히 말씀드리면, Discourse vhost를 apache(nginx 대신) 뒤에 배치하도록 컨테이너를 업데이트하는 것보다, ‘image/base/install-nginx’ 스크립트를 수정하여 mod_security 지원을 포함하도록 Discourse docker 컨테이너에서 nginx를 컴파일하는 것이 더 안전하다고 보시는 건가요? 그렇다면 install-nginx 스크립트를 수정할 때의 위험성은 무엇이며, 이것이 미래에 제 Discourse 설치를 어떻게 깨뜨릴 수 있을까요?
@ledimeo@pfaffman이 제안한 방법이며, 이번 경우 더 나은 선택이라고 생각합니다. 향후 새 버전이 출시될 때 문제를 크게 일으키지 않기 위해서입니다. 하지만 그는 이미 프론트에 다른 nginx를 리버스 프록시로 사용하고 있으며, 다음과 같은 구성을 원하지 않는 것 같습니다:
그럼에도 불구하고, apache를 nginx로 프록싱하는 것(결국 4층 구조가 되더라도)은 공식 설치에서 discourse의 동작 방식을 변경하려는 시도보다 최소한 유지보수가 더 용이하다고 생각합니다.
Discourse의 nginx에 Apache를 프록시로 추가하는 것은 확실히 하나의 옵션입니다.
전문가가 향후 업그레이드를 더 쉽게 만들어 줄 것이라는 점에 동의하며, 이는 중요한 포인트입니다.
하지만 아키텍처에 또 다른 홉(hop)을 추가하면 향후 문제를 디버깅하는 것이 더 복잡해질 뿐만 아니라, @sam이 2016년 이 게시물에서 지적했듯이 장기 폴링(long polling)을 사용하는 웹 애플리케이션에 대한 Apache의 프록시 성능에 대해서도 우려가 있습니다.
일반적으로 mod_security를 제외하고는 nginx를 Apache보다 선호합니다. OS 저장소에 Apache처럼 nginx에서 mod_security를 활성화할 수 있는 패키지가 포함되어 있다면 좋겠지만, 현재 nginx에서 mod_security를 활성화하려면 RHEL/Cent와 Debian 모두에서 소스에서 nginx를 컴파일해야 합니다. 그리고 프로덕션 환경에서 소스에서 컴파일된 패키지에 의존하는 것은 전염병처럼 피하려 합니다.
불행히도 업데이트된 /var/discourse/image/base/install-nginx 스크립트가 /var/discourse/launcher destroy app && /var/discourse/launcher/rebuild app을 실행할 때 실행되지 않는 것으로 보입니다.
이 rebuild 명령이 업데이트된 install-nginx 스크립트를 다시 실행하지 않는 데에는 어떤 이유가 있을까요?