Discourse를 다른 포트에서 실행할 수 없어요

Discourse 포럼을 WordPress 서버와 함께 실행하고 싶습니다. 하지만 두 서비스 모두 기본적으로 포트 80과 443을 사용하죠. 이 문제를 해결하기 위해 NGINX 리버스 프록시를 사용해, 외부에서 접근하는 서브도메인을 백엔드에서 다른 포트에서 실행 중인 애플리케이션으로 변환할 계획입니다. 아래는 Discourse를 설치하기 위해 수행한 단계입니다:

mkdir /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

# 설정 파일 생성
cat <<"EOF" > /var/discourse/containers/discourse
## 이것은 올인원, 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다
##
## 이 파일을 변경한 후에는 반드시 재빌드해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 *매우* 주의하세요!
## YAML 파일은 공백이나 정렬 실수에 대해 매우 민감합니다!
## 필요할 경우 http://www.yamllint.com/에서 이 파일을 검증하세요

templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

## 이 컨테이너가 노출해야 할 TCP/IP 포트는 무엇인가요?
## Apache나 nginx 같은 다른 웹서버와 포트를 공유하려면
## https://meta.discourse.org/t/17247 을 참고하세요
expose:
- "10080:80"   # http
- "10443:443" # https

params:
db_default_text_search_config: "pg_catalog.english"

## db_shared_buffers를 총 메모리의 최대 25%로 설정하세요.
## bootstrap이 감지된 RAM 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
#db_shared_buffers: "256MB"

## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
#db_work_mem: "40MB"

## 이 컨테이너가 사용할 Git 리비전은 무엇인가요? (기본값: tests-passed)
#version: tests-passed

env:
LC_ALL: en_GB.UTF-8
LANG: en_GB.UTF-8
LANGUAGE: en_GB.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en

## 동시 웹 요청을 얼마나 지원할 수 있나요? 메모리와 CPU 코어 수에 따라 달라집니다.
## bootstrap이 감지된 CPU 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
#UNICORN_WORKERS: 3

## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
## 필수 항목입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
DISCOURSE_HOSTNAME: 'forum.example.com'

## 컨테이너가 위에서 지정한 도메인 이름(-h 옵션)과 동일한
## 호스트네임으로 시작되도록 하려면 주석을 해제하세요 (기본값 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true

## TODO: 초기 가입 시 관리자 및 개발자로 지정될 쉼표로 구분된 이메일 목록
## 예시 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'webmaster@example.com'

## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
# SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
# 경고: SMTP 비밀번호에 '#' 문자가 있으면 문제가 발생할 수 있습니다!
DISCOURSE_SMTP_ADDRESS: smtp-relay.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: info@example.com
DISCOURSE_SMTP_PASSWORD: password
DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)
#DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (일부 제공업체에서 필수)
DISCOURSE_NOTIFICATION_EMAIL: no-reply@example.com    # (알림을 보내는 주소)

## Lets Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 얻으려면 아래 주석을 해제하세요
LETSENCRYPT_ACCOUNT_EMAIL: webmaster@example.com

## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (인출 설정)
## 세부 사항은 https://meta.discourse.org/t/14857 을 참고하세요
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## IP 주소 조회를 위한 maxmind 지리 위치 IP 주소 키
## 세부 사항은 https://meta.discourse.org/t/-/137387/23 을 참고하세요
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker 컨테이너는 상태가 없으며(stateless), 모든 데이터는 /shared에 저장됩니다
volumes:
- volume:
	host: /var/discourse/shared/standalone
	guest: /shared
- volume:
	host: /var/discourse/shared/standalone/log/var-log
	guest: /var/log

## 플러그인은 여기에 배치됩니다
## 세부 사항은 https://meta.discourse.org/t/19157 을 참고하세요
hooks:
after_code:
	- exec:
		cd: $home/plugins
		cmd:
		- git clone https://github.com/discourse/docker_manager.git

## 빌드 후 실행할 사용자 정의 명령
run:
- exec: echo "Beginning of custom commands"
## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
## 첫 번째 가입 이메일을 받은 후, 이 줄의 주석을 다시 설정하세요. 한 번만 실행하면 됩니다.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "End of custom commands"
EOF

# 설정 파일로 discourse 설정
./launcher bootstrap discourse

Discourse가 올바른 포트에서 리스닝하는지 확인할 수 있습니다:

root@ubuntu-server:~# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:10080           0.0.0.0:*               LISTEN      185948/docker-proxy
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      150667/docker-proxy
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      150655/docker-proxy
tcp        0      0 0.0.0.0:10443           0.0.0.0:*               LISTEN      185937/docker-proxy
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      169991/nginx: maste
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      519/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1465/sshd: /usr/sbi
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      169991/nginx: maste
tcp6       0      0 :::22                   :::*                    LISTEN      1465/sshd: /usr/sbi

URL과 포트 번호로 curl을 실행하면 301 Moved permanently가 반환됩니다:

root@ubuntu-server:~# curl forum.example.com:10080
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>

아마도 HTTP 포트가 HTTPS 포트로 리다이렉트되는 것 같습니다. (curl에 -I 플래그를 사용하면 리다이렉트 대상이 표시됩니다.)

curl forum.example.com:10443을 실행하면 예상대로 사이트가 로드되어야 합니다.

Discourse와 같은 머신에 다른 웹사이트 실행하기를 확인해 보셨나요?