Molti asset restituiscono casualmente 500

Il mio primo sospetto era un problema di ottimizzazione di Cloudflare: assicurati che Rocket Loader sia disabilitato (probabilmente lo è già, ma vale la pena verificare).

Inoltre, penso che tu possa voler configurare l’archiviazione degli oggetti del bucket S3 utilizzando Cloudflare R2 se desideri continuare a utilizzare l’hardware che stai attualmente impiegando.

Hai menzionato nella nostra chat che stai utilizzando alcuni SSD più vecchi donati, installati poco prima che iniziasse questo problema, il che è un indizio fondamentale: il firmware Dell segnala che sono difettosi, ma smartctl li mostra come funzionanti. Credo che il firmware Dell lampeggi in arancione perché rileva latenze elevate e risposte I/O erratiche o un firmware non supportato. Discourse richiede ai dischi di leggere decine di file JavaScript compilati tutti insieme nello stesso istante, e gli SSD più vecchi e non supportati possono andare in blocco sotto questo improvviso picco di I/O. Il controller di archiviazione si blocca mentre tenta di recuperare i dati, andando in timeout dopo esattamente 30 secondi, che è un timeout predefinito comune per i dispositivi SCSI/block.

Poiché i dischi rimangono bloccati per 30 secondi, Discourse (Rails/nginx) va in crash o va in timeout durante il tentativo di recuperare i file e restituisce un errore 500. Cloudflare probabilmente intercetta gli errori 500, applica le intestazioni errate e le inoltra al browser, causando così l’errore NS_ERROR_CORRUPTED_CONTENT che stai osservando.

Sostituisci quegli SSD oppure, se devi per forza utilizzarli, impiega un bucket di archiviazione oggetti per scaricare le risorse e gli upload di Discourse: puoi usare Cloudflare R2, compatibile con S3 nel piano gratuito (ne ho uno io e funziona bene). In questo modo il tuo server non dovrà leggere migliaia di piccoli file da quegli SSD difettosi, poiché aggirerà il collo di bottiglia hardware per le risorse web.