서버 장애 및 마이그레이션

DigitalOcean 서버에 호스팅된 제 Discourse 웹사이트가 어떤 유형의 문제를 겪었고, DigitalOcean에서 제 웹사이트를 다른 서버로 마이그레이션하려고 하고 있습니다. 해당 문제에 대해 DigitalOcean과 연락 중이지만, Discourse 커뮤니티에서 이전에 비슷한 상황을 겪어보신 분이 있는지 궁금해서 질문드립니다.

이 상황에 대한 팁이 있으신가요? 보통 이 과정이 완료되면 통지를 해주나요? 아직 이메일에 답변을 주지 않았습니다. 제 웹사이트가 며칠 동안 완전히 다운된 상태이며, 이는 제 커뮤니티에 좋지 않은 영향을 미치고 있습니다. 저는 Discourse에 어떤 변경 사항도 적용하지 않았으므로, 문제가 DigitalOcean 서버 이슈로 인해 발생했음을 알고 있습니다. 제가 직접 해야 할 특정 조치가 있는지, 아니면 더 기다려야 하는지 궁금합니다.

Droplet을 껐다 켰고, ./launcher rebuild app 명령으로 Discourse를 재빌드했습니다. 재빌드 후 다음과 같은 오류가 발생합니다:

Error response from daemon: driver failed programming external connectivity on endpoint app (fd1221330787160dee95f94a1256ca0dc8ddb8be2bc3c4d576ab54d3b768613a): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use.

DigitalOcean에서 온 이메일:

아래에 나열된 Droplet 중 하나 이상을 호스팅하는 물리적 머신에서 문제가 확인되었습니다. 중단을 최소화하기 위해 해당 Droplet을 더 건강한 물리적 머신으로 마이그레이션할 예정입니다. 마이그레이션 동안, 영향을 받는 Droplet에 대한 제어판 및 API 이벤트(전원 끄기, 리사이즈, Droplet 삭제 시도 포함)는 성공하지 못할 수 있습니다.

다운타임을 최소화하기 위해 가능한 모든 경우에 라이브 마이그레이션을 시도할 것입니다. 라이브 마이그레이션은 다운타임이 없으며, 네트워크가 새로운 물리적 호스트로 전환되는 동안 디스크 I/O의 경미한 성능 저하와 1초 미만의 패킷 손실만 발생합니다.

Droplet의 라이브 마이그레이션을 수행할 수 없는 경우, 해당 Droplet이 전원이 꺼진 상태에서 지정된 시간 창 동안 오프라인 마이그레이션이 수행됩니다.

제 추측으로는 Digital Ocean 관련 사항은 무관하고, 서버에 다른 웹 서버가 설치되어 있거나 실행 중인 것 같습니다. Apache나 nginx가 설치되어 있나요? Discourse가 실행되지 않는 상태에서도 사이트에 웹 서버가 응답하나요?

처음에 모든 것을 설정할 때 DigitalOcean Discourse 자동 설치기를 사용했습니다. 이 설치기는 Ubuntu와 함께 포함된 기타 패키지를 사용합니다. 이 드롭렛에는 다른 웹사이트가 없습니다. nginx가 활성화되어 실행 중인 것으로 보입니다. Apache 상태를 확인하면 오류가 반환됩니다.

FireFox로 내 다운된 웹사이트를 방문하면 다음과 같은 내용이 표시됩니다:

Error 521Ray ID: 5c686964ad310d1a • 2020-08-22 00:17:35 UTC
Web server is down

Browser - Cloudflare - Host
Working - Working - Error

Apache가 실행 중인지 확인하기 위해 systemctl status apache2 코드를 실행했는데, 다음과 같이 표시됩니다:

    ● apache2.service - The Apache HTTP Server
       Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset:
      Drop-In: /lib/systemd/system/apache2.service.d
               └─apache2-systemd.conf
       Active: failed (Result: exit-code) since Fri 2020-08-21 16:16:24 UTC; 7h ago
      Process: 912 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILUR
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: AH0055
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: (98)Ad
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: (98)Ad
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: no lis
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: AH0001
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: Action
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 apachectl[912]: The Ap
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 systemd[1]: apache2.se
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 systemd[1]: apache2.se
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 systemd[1]: Failed to 
lines 1-17/17 (END)

nginx를 확인하기 위해 systemctl status nginx 코드를 실행했는데, 다음과 같이 표시됩니다:

● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: en
   Active: active (running) since Fri 2020-08-21 16:16:24 UTC; 8h ago
     Docs: man:nginx(8)
  Process: 972 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=
  Process: 917 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process o
 Main PID: 976 (nginx)
    Tasks: 2 (limit: 1108)
   CGroup: /system.slice/nginx.service
           ├─976 nginx: master process /usr/sbin/nginx -g daemon on; master_proc
           └─977 nginx: worker process

Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 systemd[1]: Starting A
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 systemd[1]: nginx.serv
Aug 21 16:16:24 discourse-beta-ubuntu-s-1vcpu-1gb-nyc1-01 systemd[1]: Started A
lines 1-15/15 (END)

해당 이메일을 보면 그냥 기다렸다가 그들이 어떤 조치를 취하는지 지켜보는 것도 괜찮아 보입니다. 하지만 만에 하나를 대비해 오프사이트 백업은 꼭 확보해 두시는 것을 권장합니다!

일반적으로는 공식 설치 방법을 사용하는 것이 훨씬 좋습니다. 해당 드롭렛을 Discourse 외에 다른 용도로도 사용하고 있지 않다면, 이 기회에 새 드롭렛을 준비하고 아래 공식 지원 문서에 따라 처음부터 새로 설치하는 것을 제안합니다: discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub

그 다음 기존 인스턴스에서 백업을 다운로드하여 새 인스턴스에 업로드하면, 공식적으로 지원되며 유지보수가 더 수월한 인스턴스로 다시 서비스를 시작할 수 있습니다.