多数のアセットで500エラーがランダムに発生

私のサイトにアクセスすると、JavaScript ファイルのすべてで 500 エラーが発生することがあります。通常は最初のページ読み込み時に発生します(ファイルがキャッシュされている、またはされるべき場合でも)。まれに NS_ERROR_CORRUPTE_CONTENT というメッセージが表示されることがあります。

テーマは正常に読み込まれています(視認性を高めるために背景は削除済み)が、それ以外にはこれが引き起こす原因となるものはありません。30 秒待ってから再読み込みすると修正されます。

私のサイトはほぼ最新コミット(2 つ遅れ)に更新されており、ログには何も異常はありません。ディスククラスタも健全です。これは何が原因で、どのように修正すればよいでしょうか?

最初の推測では、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 から数千の小さなファイルを読み込む必要がなくなります。これにより、Web アセットに関するハードウェアのボトルネックを回避できるからです。

これは以前知りませんでしたし、確かにその説明がつきます。サーバーに関するあらゆるマニュアルには、オレンジ色の LED が点滅している場合はドライブが 100% 故障していると書かれていますが、もしこれらのドライブが I/O タイムアウトを起こしたり、奇妙な挙動を示したりしているなら、Discourse が 500 エラーコードを返す理由も納得できます。

私はサブスクリプションに非常に反対しており、長期的には手頃な価格になった時点で新しい SSD を購入して乗り切る方が理にかなっていると思います。このサーバー用に 150 ドルほど新しい SSD を購入して永久に所有する方が、Cloudflare に毎月 5 ドルを永遠に支払い続けるよりもずっと良いです。もし無料(あなたが言う通りなら)であれば、この AI バブルが弾けるまでの間の一時的な代替案として検討してみてもいいかもしれません :slight_smile: