HTTPS를 사용하지 않으면 Nginx가 IPv6에서 리스닝하지 않음

내부 네트워크(외부에서 접근할 수 없으므로 Let’s Encrypt를 설정할 수 없음)에 테스트 서버를 구성했는데, 서버에 IPv6 주소가 있음에도 nginx가 IPv6를 듣지 않는 문제를 발견했습니다. 컨테이너 내부의 /etc/nginx/conf.d/discourse.conf 파일에는 listen 80;은 있지만 listen [::]:80;은 없습니다.

IPv6로 정상적으로 접근할 수 있는 다른 프로덕션 서버가 하나 더 있습니다. 그리고 메타(Meta)를 검색하여 테스트 서버 구성에서 무엇이 잘못되었는지 찾아보았습니다. 결국 app.yml에 web.letsencrypt.ssl.template.yml과 web.ssl.template.yml을 추가해야만 IPv6를 정상적으로 사용할 수 있다는 사실을 발견했습니다. 그 이유는 이 파일들이 nginx 설정 파일에 listen [::]:80;과 listen [::]:443 ssl http2;를 추가하기 때문입니다.

팀에서는 HTTPS가 아닌 설치 환경에도 IPv6 지원을 추가할 수 있습니다. 즉, web.template.yml에 listen [::]:80;을 추가하는 것입니다.

Discourse는 HTTPS 없이 제대로 작동하지 않는 경우가 대부분입니다. 요청하신 기능이 추가되지 않을 수도 있습니다. 하지만 ssl 템플레이트를 살펴보면 IPv6를 활성화하기 위해 어떤 설정이 포함되는지 확인할 수 있으며, 해당 코드를 자신의 템플레이트나 app.yml에 추가할 수 있습니다.

네, app.yml에 이렇게 추가해 보았는데 작동합니다.

hooks:
  after_web_config:
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /listen.+$/
        to: |
          listen 80;
          listen [::]:80;