Ubuntu 20.04.3 LTS에서 새 설치 실패

새 EC2 인스턴스에 표준 설정으로 신규 설치 시 실패합니다. AWS에서 Ubuntu 20.04.3 기반의 EC2 인스턴스를 시작하고 최신 Ubuntu 업데이트를 모두 적용했습니다. 여기에서 찾을 수 있는 간단한 표준 설치 과정을 실행했습니다.

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

./discourse-setup

유일한 변수는 설정 실행 중에 HTTP(S)를 통해 서버에 연결하지 못했다는 점입니다. AWS에서 수신 포트 2개를 열어야 한다는 것을 잊고 있었기 때문입니다. 그래서 AWS 보안 그룹에서 포트를 연 후, app.yml 파일을 수동으로 구성하고 ./launcher rebuild app을 실행했습니다.

브라우저가 연결할 수 없으며 프로덕션 로그에는 다음 내용이 표시됩니다.

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus.rb:729:in `block in new_subscriber_thread'
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL) subscribe failed, reconnecting in 1 second. Call stack /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:384:in `rescue in establish_connection'

Discourse를 설치할 때 동일한 문제가 발생했던 재사용 서버(또한 Ubuntu 20.04.3)를 사용했기 때문에, 프로덕션 로그에 동일한 오류가 표시되었습니다. 그래서 처음부터 다시 시작해서 이 과정을 단순하게 해 보려고 했습니다.

재부팅을 시도해 보셨나요?

네, 명령줄에서 인스턴스를 시작하고 중지한 뒤 재부팅도 해봤습니다. 하지만 전혀 도움이 되지 않았습니다.

음, 이제 Ubuntu 20.04.3와 최신 업데이트를 함께 사용할 때 Discourse 설치 프로그램에 문제가 있다는 데 꽤 확신을 갖게 되었습니다. 방금 설치 프로그램을 다시 실행해 보았는데, 이번에는 포트가 열려 있는지 확실하게 확인했기 때문에 app.yml 파일을 수동으로 설정할 필요가 없었습니다(인적 오류 제거). 도메인을 찾았고 모든 것이 순조롭게 진행되어 설치까지 완료된 것 같았습니다. 그런데…… 사이트가 뜨지 않습니다. 프로덕션 로그에는 다음과 같은 내용이 표시됩니다.

/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.6/lib/message_bus.rb:729:in `block in new_subscriber_thread'
Job exception: Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL)

Error connecting to Redis on localhost:6379 (Errno::EADDRNOTAVAIL) subscribe failed, reconnecting in 1 second. Call stack /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:384:in `rescue in establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:365:in `establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.4.0/lib/redis/client.rb:117:in `block in connect'

이번에는 제가 실수할 정도로 단순한 작업이었기 때문에, 스크립트만 실행했을 뿐인데 이런 문제가 발생한다는 것이 이해가 되지 않습니다.

다른 redis가 설치되어 있나요?

RAM 용량이 얼마나 되나요? 스왑이 생성되었나요?

아무것도 설치되어 있지 않습니다. 새로 만든 EC2 인스턴스 t2.small이라 RAM이 2GB입니다. 표준 스왑이 어떻게 생성되는지 확인해 봐야 합니다.

RAM과 스왑 정보가 다음과 같습니다. 이는 최신 버전의 Ubuntu 표준 업데이트가 모두 적용된 신규 AWS 인스턴스로, EC2 t2.small 인스턴스입니다. 아무것도 변경, 추가, 구성하거나 수정하지 않았습니다. 설치 전에 업데이트를 위해 사용한 명령어는 sudo apt update와 sudo apt upgrade뿐이었습니다. 동일한 OS(Ubuntu 20.04.3)를 사용하는 두 개의 서로 다른 인스턴스에서 기본 Discourse 설치를 세 번째로 시도했는데, 동일한 문제가 발생했습니다. 그래서 설치程序和 최근 버전 사이에 문제가 있을 것이라고 생각하고 있습니다.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          1.9Gi       973Mi       131Mi        36Mi       875Mi       855Mi
Swap:         2.0Gi       0.0Ki       2.0Gi

디스크 공간이 문제가 될 수 있다면 참고하세요.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        39G  7.8G   31G  20% /

새로운 Digital Ocean 드롭렛에 설치 과정을 실행해 봤는데 아무 문제 없이 잘 동작했습니다. 설치 프로그램의 문제는 아닙니다.

제 추측으로는, Redis 오류가 발생하는 것이 말이 안 되지만, 설치기를 여러 번 실행하여 Let’s Encrypt의 속도 제한(rate limit)에 도달한 것이 실제 문제의 원인일 수 있습니다.

다른 도메인 이름(예: forum2.example.com)으로 다시 시도해 보세요.

빙고! 또 맞았네요. 잘 작동했습니다.

자, 저는 구 서버에서 포럼을 이전하기 위해 테스트를 많이 해왔기 때문에 많이 재구축했습니다.

이 문제를 어떻게 해결할 수 있을까요? 저는 Let’s Encrypt조차 사용하지 않습니다. 설치가 성공적으로 완료된 후 app.yml 파일을 업데이트하여 도메인을 변경하고, app.yml에서 Let’s Encrypt 템플릿이 주석 처리되어 있는지 확인한 뒤 재구축했지만, 여전히 동일한 Redis 실패 문제가 발생합니다. Let’s Encrypt 호출이 설치 프로그램에 하드코딩되어 있어서 제가 막혀 있는 건가요?

리버스 프록시를 사용하여 HTTPS를 제공하지 않는 한 그렇게 할 수 없습니다. HTTPS가 필수입니다. 그리고 Let’s Encrypt를 제거했다면 HTTPS 템플릿(무엇으로 불리는지 모르겠지만)도 함께 제거해야 합니다.

왜 redis 오류가 발생하는지 정확히 이해하지는 못하겠습니다. Let’s Encrypt를 주석 처리할 때 redis도 함께 주석 처리한 것은 아닐까요? 제 추측으로는 그렇습니다.

Set up Let’s Encrypt with multiple domains / redirects 링크를 따라 두 번째 도메인 이름을 추가해 보거나, 일주일 정도 기다려 보실 수 있습니다.

글쎄요, 스레드를 읽어보시면 완전히 새로운 인스턴스에 단순 설치가 수행되었기 때문에, 설치 관리자로서 제가 주석 처리할 수 있는 것이 없었습니다. 질문을 기반으로 설치 프로그램이 app.yml을 생성하기 때문입니다. 따라서 Redis 실패는 Let’s encrypt의 속도 제한과 직접적으로 관련이 있습니다. 이것이 개발 팀에게 도움이 될 수 있다면 좋겠습니다.

저는 프록시, 더 정확히 말하면 Cloudflare를 사용하여 SSL 인증서를 서빙하고 HTTPS만 연결/전달하고 있습니다.

https 템플릿 - "templates/web.ssl.template.yml"을 주석 처리하고, let’s encrypt 템플릿도 주석 처리한 상태에서 launcher rebuild app을 실행해 보았지만, 같은 일이 발생했습니다. Redis 오류가 났습니다. 그래서 저는 막다른 길에 처해 있는 건가요? Let’s encrypt 호출을 우회하는 방법을 제공하지 않은 설치 프로그램의 결정은 정말 최악입니다. 다른 시도를 제안해 주실 수 없다면, 인내심이 미덕이 될 것입니다. 여러분의 모든 도움을 진심으로 감사드립니다. 저는 겸손하게 좌절하고 있습니다.

이렇게 하면 상황이 훨씬 복잡해지며, Discourse를 깨뜨리지 않도록 Cloudflare를 사용하는 방법에 대해 신중하게 조사하지 않는 한 나중에 다른 문제가 발생할 수 있습니다.