Lightsail에 Discourse 배포 시 "connection refused" 오류

안녕하세요,

최근 install-cloud 가이드를 따라 AWS Lightsail 인스턴스에 Discourse를 설치했습니다. 설명서를 꼼꼼히 따랐고 처음부터 여러 번 다시 시도했지만, 포럼에 접근하려고 할 때 “connection refused”(연결 거부) 오류가 발생합니다.

따른 단계는 다음과 같습니다:

  1. 새로운 Lightsail 인스턴스 생성
  2. 정적 IP 주소 할당
  3. 포트 443 열기
  4. 서브도메인(forum.procedural.audio)을 해당 IP 주소로 지정
  5. 가이드의 Discourse 설치 명령어 수행 (LETS_ENCRYPT용 이메일 주소 제공 포함)
  6. 포럼으로 브라우저 접속… 연결 거부

./discourse-doctor를 실행하면 forum.procedural.audio의 Discourse 버전이 NOT FOUND(찾을 수 없음)라고 출력됩니다. Discourse에서 테스트 이메일은 정상적으로 수신할 수 있습니다.

ping forum.procedural.audio를 실행하면 데이터를 수신하지는 못하지만, 올바른 정적 IP는 찾습니다.

로그에서 다음 오류들을 확인했습니다.

$ ./launcher logs app
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
nginx: [emerg] cannot load certificate "/shared/ssl/forum.procedural.audio.cer": PEM_read_bio_X509_AUX() failed (S
SL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)
(수차례 반복)

따라서 문제는 SSL과 관련된 것으로 보이지만, 어떻게 수정해야 하는지 확실하지 않습니다. shared/standalone/ssl/ 디렉터리에는 네 개의 파일이 있습니다.

  1. forum.procedural.audio.cer (파일이 비어 있음)
  2. forum.procedural.audio.key (파일에 키가 포함되어 있음)
  3. forum.procedural.audio_ecc.cer (파일이 비어 있음)
  4. forum.procedural.audio_ecc.key (파일에 키가 포함되어 있음)

따라서 .cer 파일이 비어 있는 것이 문제의 일부인지 모르겠습니다. 또한 로그에서는 /shared/standalone/ssl/* 대신 /shared/ssl/* 위치의 파일을 찾고 있는 것으로 나타나는데, 이것도 관련이 있어 보입니다.

도움 주셔서 감사합니다.

문제는 Lightsail 인스턴스가 외부에서 접근할 수 없다는 것입니다. discourse-doctor가 알려준 내용과 일치합니다. 443 포트만 열었다면 이것이 원인이었을 가능성이 높습니다.

인증서가 없으면 443 포트의 HTTPS는 작동하지 않습니다. 인증서가 없기 때문에(그리고 해당 인증서 파일은 비어 있음) let’s encrypt가 통신 문제로 인해 등록을 실패한 것입니다.

정적 외부 주소를 할당했다면 80 포트도 열고 다시 시도해 보세요. HTTP로 연결하는 클라이언트를 리디렉션할 수 있도록 80 포트는 어쨌든 열려 있어야 합니다.

방금 확인해 보니 이 호스트명이 유효하지 않습니다. 먼저 이를 수정해야 합니다.

cannot resolve forum.procedural.audio: Unknown host

Lightsail 인스턴스의 경우 포트 22와 80이 기본적으로 열려 있습니다. 따라서 포트 80을 여는 것이 해결책이 될 것이라고 생각하지 않습니다.

죄송하지만 좀 더 자세히 설명해 주시겠어요? 호스트명이 어떤 의미에서 잘못된 건가요?

forum.procedural.audio가 DNS에 표시되지 않거나, 다른 표현으로 하면 해당 호스트명이 IP 주소로 해석되지 않습니다. 방금 CloudFlare와 Google DNS를 통해 확인해 보았는데, 둘 다 해당 호스트명을 찾을 수 없습니다. 제가 해석할 수 없다면 discourse-doctor도 해석할 수 없습니다.

서버의 ‘a’ 레코드를 언제 생성했나요? 복제 시간을 확인해 보셨나요?

서버를 다시 빌드하기 전에 이 문제를 반드시 해결해 주세요. Let’s Encrypt는 등록/갱신을 위한 시도 횟수에 한도가 있으며, 그 한도에 도달하면 7일 동안 인증서를 발급받을 수 없습니다.

2일 동안 Namecheap에서 도메인을 보유하고 있으며, 이는 Route 53을 가리키고 있습니다(추가 간접 레이어가 있는 이유는 Route 53이 .audio 도메인을 지원하지 않기 때문입니다). 주요 도메인 항목은 그 2일 중 대부분 동안 존재해 왔습니다. 해당 서브도메인 레코드는 약 1시간 동안 존재해 왔습니다.

만약 이것이 문제였다면, 제 인스턴스에서 ping forum.procedural.audio를 실행했을 때 IP 주소가 해석되지 못했을 것입니다. 하지만 IP 주소는 정상적으로 해석됩니다.

외부적으로 해결되지 않습니다. Let’s Encrypt는 DNS를 사용하여 서버가 주장하는 대로 해당 서버임을 확인합니다.

ping forum.procedural.audio                                                                                                              ✔  ✔  1909  ✔  10:59:47
ping: cannot resolve forum.procedural.audio: Unknown host

음. https://dnschecker.org/#A/forum.procedural.audio 를 확인해 보면 여러 지역에서 이름이 해석되는 것으로 보이므로, 아마도 DNS 전파(propagation) 문제일 수 있습니다. 1.1.1.1이나 8.8.8.8로 조회를 하면 응답이 없지만, NS-337.AWSDNS-42.COM으로 조회하면 응답이 돌아오므로, 잠시 기다려 보시는 것이 좋을 것 같습니다.

하지만 discourse-setup은 주소를 조회하고 스스로에게 연결할 수 있는지 확인하려고 합니다. 이 작업이 실패하는 경우는 일반적으로 DNS 문제이거나 포트가 열려 있지 않은 경우입니다.

안녕하세요,

거의 일주일 가까이 지났지만 여전히 포럼을 배포하지 못하고 있습니다. 혹시 추가적인 아이디어가 있으신 분 계신가요? 포트 80과 443은 열려 있습니다. DNS 문제라고 생각하지는 않습니다. discourse-doctor가 localhost(그리고 forum.procedural.audio)에서 discourse 버전을 찾지 못하기 때문입니다. 도움이 되시면 감사하겠습니다.

nslookup.exe forum.procedural.audio
Server:  dns.google
Address:  8.8.8.8

*** dns.google can't find forum.procedural.audio: Server failed

DNS 문제입니다.

음, https://dnschecker.org/#A/forum.procedural.audio 에 따르면 32개 위치 중 31곳에 전파된 것으로 보입니다. DNS 레코드 전파에 144시간 이상 걸린다는 말은 처음 들어봅니다. 하지만 이제 Nslookup.io 를 확인해 보니 Cloudflare와 Google에서는 이를 해석할 수 없지만, 권한 있는 서버(authoritative server)에서는 해석할 수 있습니다.

그러니 제 추측이 틀렸던 것 같지만, 이 문제를 어떻게 해결해야 할지 모르겠습니다. discourse-doctor가 localhost에서 discourse 버전을 찾을 수 없는 이유도 모르겠습니다.

즉, DNS 문제가 있는 것입니다.

그리고 여러 번 재구축을 했다면 Let’s Encrypt 속도 제한 문제가 있는 것입니다.