Мой сайт почти не отвечает в течение трех дней из-за большого объема трафика.
Элемент JavaScript на странице регулярно запрашивал изображения с сервера, и количество подключений становилось проблемой, поскольку люди оставляли окна браузера открытыми (и поэтому никогда не прекращали запрашивать изображения).
Я переделал сайт, чтобы использовать один спрайт и загружать его только один раз; однако сейчас происходит огромное количество ошибок 404, поскольку люди все еще пытаются загрузить старый контент. Сайт находится на VPS, и его нельзя использовать из-за задержки.
Что еще хуже, я изначально предполагал, что задержка связана с отсутствием кеширования. Я добавил в файл .htaccess директиву, чтобы посетители могли кэшировать ресурсы (включая старый неэффективный код).
Мой хозяин не смог устранить проблему. Что можно сделать, чтобы постоянные соединения перестали загружать устаревший контент?
Вы действительно не можете помешать кому-то сделать запрос к несуществующему ресурсу (например, любой может создать URL-адрес для страницы, которая не существует, и получить 404). Однако вы можете кое-что сделать, чтобы улучшить ситуацию.
Во-первых, измените имя файла в вашем новом контенте - если вы все еще ссылаетесь на файл javascript в своем html, убедитесь, что у него другое имя, чем то, с которым возникла проблема, чтобы браузер не использовал кешированную копию.
Во-вторых, сделайте свою страницу 404 как можно более простой (определенно выберите статическую страницу, а не что-то динамическое и очень маленькое).
В-третьих, Apache не настолько эффективен при обработке большого количества одновременных запросов без большого количества доступной памяти (он запускает один рабочий поток на запрос). Рассмотрите возможность (по крайней мере временно) добавления другого сервера перед Apache, который будет более эффективно обрабатывать запросы 404. Некоторые примеры могут включать:
Я бы начал с немедленного создания файла с нулевым байтом, чтобы избавиться от ошибок 404 и минимизировать стоимость каждого извлечения.
Системный администратор на моем хосте решил это с помощью скрипта:
Любой IP-адрес, который пытается получить доступ к старому контенту (по своей природе, такой пользователь постоянно делает запросы и использует соединения), немедленно добавляется к брандмауэру сервера. На данный момент обнаружено и заблокировано всего несколько сотен (из многих тысяч посетителей). Решение работает очень хорошо.