사이트를 방문할 때, 모든 JavaScript 파일에서 500 오류가 여러 개 발생하는 경우가 있습니다. 주로 첫 페이지 로드 시에 발생하며(파일들이 캐시되어 있거나 캐시되어야 하는 경우에도 마찬가지입니다). 때로는 NS_ERROR_CORRUPTED_CONTENT라는 메시지가 표시됩니다.
처음에는 Cloudflare 최적화 문제일 것 같다고 추측했습니다. Rocket Launcher가 비활성화되어 있는지 확인해 보세요(아마 비활성화되어 있겠지만, 점검해 볼 가치가 있습니다).
또한, 현재 사용 중인 하드웨어를 계속 사용하려면 S3 버킷 객체 저장을 Cloudflare R2로 구성하는 것이 좋을 것 같습니다.
채팅에서 이 문제가 발생하기 직전에 기부받은 오래된 SSD를 설치했다고 말씀하셨는데, 이것이 결정적인 단서입니다. Dell 펌웨어에서는 드라이브가 불량이라고 표시하지만, smartctl에서는 정상으로 표시됩니다. Dell 펌웨어가 오렌지색으로 깜빡이는 이유는 높은 지연 시간과 불규칙한 I/O 응답, 또는 지원되지 않는 펌웨어를 감지하기 때문일 것입니다. Discourse는 수십 개의 컴파일된 JavaScript 파일을 정확히 동시에 읽으라고 드라이브에 요청하는데, 오래되고 지원되지 않는 SSD는 이러한 갑작스러운 I/O 버스트에 대응하지 못하고 막힐 수 있습니다. 저장 컨트롤러는 데이터를 가져오려다 정확히 30초 후 타임아웃됩니다. 이는 일반적인 기본 SCSI/블록 디바이스 타임아웃입니다.
드라이브가 30초 동안 멈추기 때문에, Discourse의 Rails/Nginx는 파일을 가져오려다 충돌하거나 타임아웃되어 500 에러를 발생시킵니다. Cloudflare는 이 500 에러를 포착하고 잘못된 헤더를 적용하여 브라우저로 전달하므로, 여러분이 보고 있는 NS_ERROR_CORRUPTED_CONTENT가 발생합니다.
해당 SSD를 교체하거나, 반드시 사용해야 한다면 Discourse 자산과 업로드 파일을 객체 저장소 버킷으로 오프로드하여 하드웨어 병목 현상을 우회하세요. Cloudflare R2의 무료 S3 호환 버킷을 사용할 수 있습니다(저도 사용하고 있으며 잘 작동합니다). 이렇게 하면 웹 자산을 위해 실패하는 SSD에서 수천 개의 작은 파일을 읽을 필요가 없게 됩니다.
저는 이 사실을 이전에 알지 못했으며, 이는 확실히 문제를 설명해 줍니다. 서버 매뉴얼 어디를 봐도 오렌지색 LED가 깜빡인다는 것은 드라이브가 100% 고장 났다는 것을 의미한다고 되어 있지만, 이러한 드라이브들이 I/O 타임아웃을 일으키거나 이상하게 동작한다면 Discourse가 500 오류 코드를 반환하는 이유가 제게는 이해가 됩니다.
저는 구독 서비스에 대해 매우 반대하는 편입니다. 장기적으로는 가격이 합리적으로 떨어지면 결단을 내리고 새로운 SSD를 구매하는 것이 나을 것 같습니다. 이 서버를 영원히 소유할 수 있도록 새로운 SSD에 150달러를 쓰는 것이, 영원히 Cloudflare에 월 5달러를 내는 것보다 훨씬 낫다고 생각합니다. 무료라면(그렇게 말씀하셨죠) 이 AI 버블이 꺼질 때까지 기다리는 동안 임시 대안으로 살펴볼 수도 있습니다
여기서 해결책을 하나 제안해 보겠습니다. 사실 이 문제는 Discourse가 아니었고, Dell의 펌웨어나 제 서버 문제도 아니었습니다. 제 친구가 호스팅하는 Nginx 인스턴스(제 Discourse가 이 인스턴스보다 하위 스트림에 위치해 있음)가 약 2년 전 버전으로 구식이었고, 이 인스턴스가 내부 서버 오류를 발생시키고 있었던 것입니다. Nginx 인스턴스를 업데이트한 이후로는 이러한 오류가 완전히 사라졌습니다.