소개
기본적으로 Discourse의 “standalone” 설치 환경은 80번과 443번 포트에 바인딩됩니다. 같은 서버에서 WordPress와 같은 다른 애플리케이션을 호스팅하려면, Discourse를 내부 포트에서 경청하도록 재구성하고 호스트 수준의 Nginx를 Reverse Proxy로 사용하여 트래픽과 SSL 인증서를 관리해야 합니다.
1. 아키텍처 개요
-
호스트 Nginx: 80번과 443번 포트에서 경청하는 주요 게이트웨이입니다. SSL 종단(termination)을 처리하고
server_name에 따라 요청을 적절한 컨테이너로 라우팅합니다. -
Discourse 컨테이너:
localhost:8080에서 경청하도록 재구성됩니다. -
WordPress 컨테이너: Docker Compose를 통해 관리되며
localhost:8081에서 경청합니다.
2. Phase A: Discourse 재구성
공개 포트를 양도하기 위해 /var/discourse/containers/app.yml 파일을 수정합니다:
-
포트 매핑 변경:
YAML
expose: - "8080:80" # 호스트 포트 8080을 컨테이너 포트 80으로 매핑 -
내부 SSL 비활성화: SSL 및 Let’s Encrypt 템플릿을 주석 처리합니다:
YAML
templates: - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/web.template.yml" # - "templates/web.ssl.template.yml" # - "templates/web.letsencrypt.ssl.template.yml" -
재빌드:
./launcher rebuild app을 실행합니다.
3. Phase B: Docker Compose를 통한 WordPress 배포
WordPress 사이트를 전용 디렉터리에 정리합니다. 데이터 손실을 방지하기 위해 데이터베이스 볼륨이 영구적으로 유지되도록 확인하십시오.
YAML
services:
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: 'your_secure_password'
volumes:
- ./mysql_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8081:80"
volumes:
- .:/var/www/html
4. Phase C: 최종 Nginx 설정 (SSL 및 443번 포트)
2025년의 전문적인 설정에는 완전한 HTTPS 및 HTTP/2 지원이 필요합니다. 호스트에 Nginx를 설치(sudo apt install nginx)한 후, 도메인을 위한 설정을 생성합니다.
프로 팁: sudo certbot --nginx를 실행하여 SSL 블록을 자동으로 생성하되, Discourse가 올바르게 작동하도록 다음 프록시 헤더가 포함되도록 확인하십시오.
Nginx
server {
listen 443 ssl http2;
server_name discourse.com;
# Certbot으로 생성된 SSL 인증서
ssl_certificate /etc/letsencrypt/live/discourse.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/discourse.com/privkey.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # Discourse의 HTTPS 감지에 필수
}
}
5. 고생 끝에 얻은 교훈 및 모범 사례
-
데이터베이스 자격 증명: 비밀번호에
&나?와 같은 특수 문자가 포함되어 있다면, 셸 해석 오류를 방지하기 위해 설정 파일과 터미널 명령어에서 항상 작은따옴표' '로 감싸야 합니다. -
파일 권한: WordPress 컨테이너는
www-data(UID 33)로 실행됩니다.root로 파일을 업로드하거나 압축을 해제한 경우, 500 Internal Server Errors를 피하기 위해chown -R 33:33 .을 실행해야 합니다. -
Cloudflare 설정: 서버 내 SSL 인증서(Let’s Encrypt)를 사용하는 경우, Cloudflare의 SSL/TLS를 **Full (Strict)**로 설정하십시오. “Flexible” 모드에서 흔히 발생하는 “Too Many Redirects” 루프를 방지할 수 있습니다.
-
영구 볼륨: 데이터베이스 파일이 영구 볼륨(예:
./mysql_data)에 저장되어 있는지 확인하지 않고docker compose down또는rebuild를 실행하지 마십시오.
결론: Reverse Proxy를 사용하여 애플리케이션을 80/443번 포트에서 분리하는 것은 멀티 사이트 VPS를 관리하는 가장 확장 가능한 방법입니다. 이를 통해 SSL을 중앙 집중식으로 관리하고 호스트 수준의 Nginx 로그를 통해 디버깅을 쉽게 수행할 수 있습니다.