네, 프론트엔드 리버스 프록시 서버로 nginx를 사용할 경우 프로덕션에서 완벽하게 동작합니다.
저희는 다음과 같이 구성합니다.
세 개의 컨테이너:
- Data (data.yml)
- Socket1 (socket1.yml)
- Socket2 (socket2.yml)
nginx config에서 단일 유닉스 도메인 소켓을 지정합니다. 예를 들어 다음과 같습니다:
location / {
proxy_pass http://unix:/var/run/nginx.http.sock;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
}
그 다음, 실제 소켓으로 심볼릭 링크를 만들어 라이브로 만들 컨테이너를 선택합니다. 예를 들어 다음과 같습니다:
socket2 컨테이너를 라이브로 만들 경우:
ls -sf /var/discourse/shared/socket2/nginx.http.sock /var/run/nginx.http.sock
socket1에서 변경 사항을 적용하고 socket1을 라이브로 만들 경우:
cd /var/discourse
./launcher rebuild socket1
ls -sf /var/discourse/shared/socket1/nginx.http.sock /var/run/nginx.http.sock
참고로, socket1 컨테이너를 bootstrap only할 이유는 없습니다. 컨테이너는 자체 공유 디렉터리/볼륨을 통해 유닉스 도메인 소켓으로 노출되므로, 이 두 “웹 앱” 컨테이너는 동시에 실행할 수 있습니다:
- Socket1: /var/discourse/shared/socket1/nginx.http.sock
- Socket2: /var/discourse/shared/socket2/nginx.http.sock
TCP/IP 컨테이너 포트가 노출될 때 발생하는 "포트 바인딩 충돌"과 같은 문제는 없습니다. 이 때문에 프로덕션에서는 유닉스 도메인 소켓만 노출하고 TCP/IP 포트는 노출하지 않습니다.
원하시면 bootstrap를 수행할 수도 있습니다:
cd /var/discourse
./launcher bootstrap socket1
./launcher start socket1
ls -sf /var/discourse/shared/socket1/nginx.http.sock /var/run/nginx.http.sock
사용자 선택 사항이지만, 두 컨테이너를 동시에 실행하면 둘 다 sidekiq를 실행하고 예약된 작업을 수행하게 된다는 점을 염두에 두시기 바랍니다(저희 경험상). 따라서 저희는 가끔 두 컨테이너의 업로드 파일을 동기화합니다.
이 방법은 저희에게 완벽하게 동작하며, 웹 앱 컨테이너를 리빌드하고 라이브로 전환하는 데 기본적으로 거의 다운타임이 없습니다. 프로덕션에서는 다운타임을 매우 심각하게 받아들이며, 가능한 한 이를 피합니다.
참고:
위 방법은 솔루션의 웹 앱 부분에 대한 것이며, 데이터 컨테이너에 대한 것은 아닙니다. 데이터에 대해 유사한 솔루션을 만든 적은 없지만, 언젠가 시간을 내어 데이터 컨테이너를 위한 유사하지만(물론 다른) 솔루션(일종의 “두 개의 데이터 컨테이너, DB 동기화” 방식, 현재로서는 제 머릿속에서 완전히 미정)을 구축할 수도 있습니다.
따라서 저는 실제로는 이것과 정반대의 방식을 취하고 있습니다:
말씀드렸듯이, 개발 환경에서는 잘 동작합니다.
저는 일반적으로 개발 환경에서 이 구성을 하지 않습니다. 설정에 시간이 더 걸리고, 개발 환경에서는 사용자가 사이트를 방문하지 않으므로("나와 코드"만 존재하며, 라이브로 사용자나 봇이 사이트를 타격하지 않으므로) 약간의 다운타임은 괜찮기 때문입니다. 또한 데스크톱에서는 개발에 도커를 사용하지 않습니다**.
도움이 되셨으면 좋겠습니다.
**여기서 "개발"이란 소프트웨어(예: 플러그인) 개발을 의미하며, 단순히 Discourse 설치 환경을 "스테이징"하는 것을 말하는 것이 아닙니다. 후자는 "스테이징"이라고 부르고 "개발"이라고 하지 않습니다(정확히 구분하기 위해).