Lorsque je visite mon site, j’obtiens parfois une série d’erreurs 500 sur tous les fichiers JavaScript, généralement lors du premier chargement de la page (même si les fichiers sont, ou devraient être, mis en cache). Parfois, elles indiquent NS_ERROR_CORRUPTED_CONTENT.
Mon thème se charge correctement (l’arrière-plan a été retiré pour plus de visibilité), mais à part cela, il ne devrait rien y avoir qui cause ce problème. Le problème se résout en attendant 30 secondes puis en rechargeant la page.
Mon site est à jour avec la version presque la plus récente (à 2 commits près) et il n’y a rien d’anormal dans les logs. Mon cluster de disques est en bonne santé. Qu’est-ce qui cause ce problème et comment puis-je le résoudre ?
Ma première hypothèse était un problème d’optimisation de Cloudflare : assurez-vous que Rocket Loader est désactivé (ce qui est probablement le cas, mais une vérification ne fait pas de mal).
De plus, je pense que vous souhaiterez configurer le stockage d’objets du bucket S3 en utilisant Cloudflare R2 si vous voulez continuer à utiliser le matériel que vous utilisez actuellement.
Vous avez mentionné dans notre discussion que vous utilisiez quelques SSD plus anciens donnés que vous avez installés peu de temps avant que ce problème ne commence, ce qui est un indice accablant : le firmware Dell indique qu’ils sont défectueux, mais smartctl les affiche comme corrects. Je pense que le firmware Dell clignote en orange car il détecte une latence élevée et des réponses d’E/S erratiques ou un firmware non pris en charge. Discourse demande aux disques de lire des dizaines de fichiers JavaScript compilés tous en même temps, et les SSD plus anciens non pris en charge peuvent être saturés par cette soudaine rafale d’E/S. Le contrôleur de stockage se bloque en essayant d’obtenir les données, avec un timeout après exactement 30 secondes, ce qui correspond au délai d’attente par défaut courant pour les périphériques SCSI/block.
Puisque les disques se bloquent pendant 30 secondes, Discourse (Rails/Nginx) plante ou atteint le délai d’attente en essayant de récupérer les fichiers et renvoie une erreur 500. Cloudflare intercepte probablement ces erreurs 500, applique les mauvais en-têtes et les transmet au navigateur, ce qui provoque l’erreur NS_ERROR_CORRUPTED_CONTENT que vous observez.
Remplacez ces SSD, ou si vous tenez à les utiliser, utilisez un bucket de stockage d’objets pour décharger les actifs et les téléchargements de Discourse ; vous pouvez utiliser Cloudflare R2 (compatible S3 et gratuit, j’ai cette configuration et cela fonctionne bien). Ainsi, votre serveur n’aura pas besoin de lire des milliers de petits fichiers à partir de ces SSD défaillants, car il contournera le goulot d’étranglement matériel pour les actifs web.
Ce n’est pas quelque chose que je savais auparavant et cela expliquerait certainement le problème. Tous les manuels du serveur indiquent qu’un voyant orange clignotant signifie que le disque est 100 % mort, mais si ces disques génèrent des délais d’attente I/O ou se comportent de manière étrange, cela me semble logique pour expliquer pourquoi Discourse renvoie le code d’erreur 500.
Je suis très contre les abonnements et, à long terme, il est probablement logique pour moi de mordre la poussière et d’acheter de nouveaux SSD dès qu’ils redeviendront abordables. Si je dépensais 150 pour de nouveaux SSD pour ce serveur que je possède à jamais, je préfère largement cela que de payer 5 par mois à Cloudflare pour l’éternité. Si c’est gratuit (comme vous le dites), je pourrais envisager cela comme une solution temporaire en attendant que cette bulle de l’IA éclate