HTTPS는 정상 작동하지만, HTTP URL에서는 NGINX 환영 페이지가 표시되고 리다이렉트가 되지 않습니다

최근 Ubuntu Focal Fossa VPS에 Discourse를 설치했는데 잘 동작하지만, URL 관련 몇 가지 특이사항을 해결하는 데 어려움을 겪고 있습니다.

다음은 제가 확인한 동작 방식입니다(사파리 기준). 등록 대행업체에서 @, WWW, *에 대한 A NAME 레코드를 생성해 두었습니다.

example.com [nginx 환영 페이지 표시] 실패
www.example.com [https://example.com으로 리다이렉트] 성공
http://example.com [nginx 환영 페이지 표시] 실패
http://www.example.com [https://example.com으로 리다이렉트되고 정상 작동] 성공
https://example.com [예상대로 작동하며 리다이렉트되지 않음] 성공
https://www.example.com ['이 연결은 안전하지 않습니다' 브라우저 오류 메시지 표시] 실패

설치 위치를 루트/에이펙스 도메인으로 설정하고 싶어서 설치 시 example.com을 입력했습니다.

도움 주시면 감사하겠습니다!

Discourse 서버에서 외부 nginx를 실행하고 계신가요? 이유는 무엇인가요?

Discourse에는 이미 사전 구성이 완료된 nginx가 포함되어 있으며, 80번 포트와 443번 포트에 경청하도록 설정해 두면 해당 작업을 처리해 줍니다.

@Falco님, 답변 감사합니다. 제가 아는 한, 아닙니다. VPS 제공업체에서 제공하는 이미지는 단순히 "Focal Fossa Clean OS"라고 불리며, 이는 제3자 도구가 포함되지 않았다는 뜻으로 추정됩니다.

공개된 “30분” 설치 방법을 그대로 사용해 기본 상태로 설치했습니다.

sudo su

wget -qO- https://get.docker.com/ | sh

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

cd /var/discourse

./discourse-setup

아, 그러면 정말 이상한 동작이네요!

app.yml 파일을 여기에 공유해 주실 수 있을까요? (비밀번호 같은 민감한 데이터는 제거해 주세요.) 해당 파일은 /var/discourse/containers/app.yml 경로에 있습니다.

그리고 docker ps -a 명령어의 출력 결과도 함께 보내 주세요.

네, 감사합니다. 제 도메인의 TLD가 좀 특이해서(.community) 문제가 생길까요?

## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Set db_shared_buffers to a max of 25% of the total memory.
  ## will be set automatically by bootstrap based on detected RAM, or you can override
  db_shared_buffers: "768MB"

  ## can improve sorting performance, but adds memory usage per-connection
  #db_work_mem: "40MB"

  ## Which Git revision should this container use? (default: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## How many concurrent web requests are supported? Depends on memory and CPU cores.
  ## will be set automatically by bootstrap based on detected CPUs, or you can override
  UNICORN_WORKERS: 8

  ## TODO: The domain name this Discourse instance will respond to
  ## Required. Discourse will not work with a bare IP number.
  DISCOURSE_HOSTNAME: example.com

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: List of comma delimited emails that will be made admin and developer
  ## on initial signup example 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: ‘email@gmail.com'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  DISCOURSE_SMTP_ADDRESS: smtp.postmarkapp.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: username
  DISCOURSE_SMTP_PASSWORD: “password”
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (required by some providers)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  LETSENCRYPT_ACCOUNT_EMAIL: email@gmail.com


  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Any custom commands to run after building
run:
  - exec: echo "Beginning of custom commands"
  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  ## After getting the first signup email, re-comment the line. It only needs to run once.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

그리고

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                      NAMES
465fbf1c3fb8   local_discourse/app   "/sbin/boot"   47 minutes ago   Up 46 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app

아마도 제공업체가 제공한 이 디스트로에 nginx가 미리 설치되어 있을 수 있습니다.

curl -I localhost 명령을 실행하면 어떤 결과가 출력됩니까?

HTTP/1.1 301 Moved Permanently
Server : nginx/1.18.0
Date : Mon, 25 Jan 2021 20:18:00 GMT
Content-Type : text/html
Content-Length : 169
Connection : keep-alive
Location : https://example.com

이건 이미 설치되어 있다는 뜻인가요? (이 분야에 초보라서 죄송합니다)

정상 작동할 때 예상되는 응답이 정확히 그 내용입니다. 그렇다면 http://example.com은 여전히 nginx 환영 페이지를 표시하고 있는 건가요?

https://example.com은 정상적으로 작동하지만, http://example.com(HTTP)은 Welcome to nginx! 페이지로 이동합니다 :sob:

실제 도메인을 공유해 주시겠어요?

자, 그러면 nginx 환영 페이지가 전혀 나오지 않는군요.

휴대폰 같은 다른 기기에서 시도해 볼 수 있을까요?

curl -I example.com -L
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Mon, 25 Jan 2021 20:35:21 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

HTTP/2 200 
server: nginx
date: Mon, 25 Jan 2021 20:35:22 GMT
content-type: text/html; charset=utf-8
vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: finish_installation/index
cache-control: no-cache, no-store
content-security-policy: base-uri 'none'; object-src 'none'; script-src https://example.com/logs/ https://example.com/sidekiq/ https://example.com/mini-profiler-resources/ https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/extra-locales/ https://example.com/highlight-js/ https://example.com/javascripts/ https://example.com/plugins/ https://example.com/theme-javascripts/ https://example.com/svg-sprite/; worker-src 'self' https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/javascripts/ https://example.com/plugins/
x-request-id: 8755d4fa-387f-4509-8709-b6075f274d09
x-runtime: 0.026020
strict-transport-security: max-age=31536000

음, 저는 분명히 멍청한 것 같습니다. 4G로 폰에서 테스트를 해봤는데(로컬 DNS를 확인하기 위함) 모든 URL이 정상적으로 작동했습니다. 다시 Wi-Fi에 연결했는데, 이것도 모두 정상적으로 작동하더군요. 그러자 데스크톱의 Safari 캐시를 지웠더니, 이쪽에서도 모든 것이 정상적으로 작동하기 시작했습니다.

처음 호스트를 테스트할 때부터 캐시가 플러시되지 않았던 것 같습니다. 문제를 해결하는 데 도움을 주셔서 정말 감사드리고, 시간을 뺏어서 죄송합니다.

참고로, 오늘 저도 Ubuntu 22.04에서 동일한 문제를 겪었습니다. Safari 캐시를 지우고 새로고침을 하니까 문제가 해결됐어요.