Molti asset restituiscono casualmente 500

Quando visito il mio sito, a volte ricevo una serie di errori 500 su tutti i file JavaScript, solitamente al primo caricamento della pagina (anche se i file sono, o dovrebbero essere, nella cache). A volte riportano NS_ERROR_CORRUPTED_CONTENT.

Il mio tema si carica correttamente (lo sfondo è stato rimosso per visibilità), ma oltre a questo non ci dovrebbe essere nulla che causi il problema. Il problema si risolve aspettando 30 secondi e ricaricando la pagina.

Il mio sito è aggiornato all’ultimo commit quasi più recente (con 2 commit di ritardo) e non ci sono anomalie nei log. Il mio cluster di disco è sano. Cosa sta causando questo problema e come posso risolverlo?

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.

Non lo sapevo e sicuramente spiegherebbe la situazione. Ogni manuale per server disponibile afferma che un LED arancione lampeggiante indica che il disco è morto al 100%, ma se questi stanno generando timeout I/O o si comportano in modo strano, ha senso che Discourse restituisca il codice di errore 500.

Sono molto contrario agli abbonamenti e, a lungo termine, probabilmente ha senso per me prendere la decisione definitiva e acquistare nuovi SSD non appena saranno di nuovo accessibili. Se spendessi 150 dollari per alcuni nuovi SSD per questo server che possiedo per sempre, preferirei di gran lunga farlo piuttosto che pagare a Cloudflare 5 dollari al mese per l’eternità. Se è gratuito (come dici), potrei prenderlo in considerazione come alternativa temporanea mentre aspetto che questa bolla dell’IA si sgonfi :slight_smile: