При посещении моего сайта иногда возникают ошибки 500 для всех файлов JavaScript, обычно при первой загрузке страницы (даже если файлы уже закэшированы или должны быть закэшированы). Иногда они сообщают об ошибке NS_ERROR_CORRUPTED_CONTENT.
Моя тема загружается нормально (фон был удален для лучшей видимости), но кроме этого ничего, что могло бы вызвать эту проблему, нет. Ошибка исправляется, если подождать 30 секунд и перезагрузить страницу.
Мой сайт обновлен почти до последней версии (отстает на 2 коммита), и в логах нет никаких подозрительных записей. Мой кластер дисков в норме. Что вызывает эту проблему и как ее исправить?
Мои первоначальные предположения указывали на проблему с оптимизацией Cloudflare — убедитесь, что функция Rocket Launcher отключена (вероятно, она и так отключена, но стоит проверить).
Кроме того, я думаю, вам стоит настроить хранение объектов в S3-совместимом хранилище Cloudflare R2, если вы хотите продолжить использование текущего оборудования.
Вы упоминали в нашем чате, что используете некоторые пожертвованные старые SSD-диски, которые установили незадолго до начала возникновения проблемы. Это явный признак неисправности: прошивка Dell сообщает о неисправности дисков, но утилита smartctl показывает их как исправные. Я думаю, прошивка Dell мигает оранжевым индикатором, потому что обнаруживает высокую задержку и нестабильные ответы ввода-вывода или неподдерживаемую версию прошивки. Discourse запрашивает чтение десятков скомпилированных файлов JavaScript одновременно, и старые неподдерживаемые SSD-диски могут не справиться с такой внезапной нагрузкой на ввод-вывод. Контроллер хранения зависает, пытаясь получить данные, и завершает работу с таймаутом ровно через 30 секунд — это стандартное значение таймаута для устройств SCSI/блочных устройств.
Поскольку диски зависают на 30 секунд, Discourse, Rails или Nginx завершают работу или превышают время ожидания при попытке получить файлы и выдают ошибку 500. Cloudflare, вероятно, перехватывает эти ошибки 500, применяет неверные заголовки и передает их браузеру, что вызывает ошибку NS_ERROR_CORRUPTED_CONTENT, которую вы видите.
Замените эти SSD-диски. Если же вы вынуждены их использовать, настройте бакет объектного хранилища для выгрузки ресурсов Discourse и загрузок — вы можете использовать бесплатное S3-совместимое хранилище Cloudflare R2 (у меня такое есть, и оно работает хорошо). Тогда вашему серверу не придется читать тысячи мелких файлов с этих неисправных SSD-дисков, так как он будет обходить аппаратное ограничение для веб-ресурсов.
Об этом я раньше не знал, и это, безусловно, объясняет ситуацию. В каждом руководстве по серверу повсюду сказано, что мигающий оранжевый светодиод означает, что диск полностью вышел из строя, но если они вызывают тайм-ауты ввода-вывода или ведут себя иначе странно, то для меня имеет смысл, почему Discourse возвращает ошибку 500.
Я крайне против подписок, и в долгосрочной перспективе, вероятно, имеет смысл купить новые SSD, когда они снова станут доступными по цене. Если бы я потратил 150 долларов на новые SSD для этого сервера, который принадлежит мне навсегда, я бы предпочёл это, чем платить Cloudflare 5 долларов в месяц вечно. Если это бесплатно (как вы утверждаете), я, возможно, рассмотрю этот вариант как временную альтернативу, пока не лопнет этот пузырь вокруг ИИ