У меня есть приличный сайт (nginx -> apache -> mod_php / mysql), чтобы немного его настроить, и я считаю, что самая большая проблема заключается в том, что поисковые роботы, используемые для его перегрузки, отправляют много запросов одновременно.
В ядре сайта есть кеш (то есть в PHP), поэтому автор сайта сообщил, что проблем быть не должно, но на самом деле узким местом является то, что ответ apache слишком длинный, так как слишком много запросов на страницу.
Что я могу себе представить, так это иметь некоторый кэш на основе nginx для кэширования страниц только для ботов. TTL может быть достаточно высоким (на странице нет ничего такого динамичного, что не может ждать обновления 5-10 минут). Давайте определим «бот» как любой клиент, у которого в строке UA есть «бот» («BingBot» как пример).
Поэтому я пытаюсь сделать что-то подобное:
map $http_user_agent $isCache {
default 0;
~*(google|bing|msnbot) 1;
}
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
...
location / {
proxy_cache my_cache;
proxy_cache_bypass $isCache;
proxy_cache_min_uses 3;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_pass http://my_upstream;
}
# location for images goes here
}
Я прав с моим подходом? Похоже, это не сработает.
Любые другие подходы, чтобы ограничить нагрузку от ботов? Конечно, не посылая им коды 5xx (так как поисковые системы могут понижать позиции для сайтов с 5xx).
Спасибо!
Если ваши страницы содержимого могут отличаться (например, если пользователь вошел в систему, и на этой странице содержится «добро пожаловать, Джон Доу»), то эта версия страницы может быть кэширована, так как каждый запрос обновляет кэшированную копию (т.е. зарегистрированный пользователь будет обновить кэшированную версию, в том числе их сеансовые куки, что плохо).
Лучше всего сделать что-то похожее на следующее:
map $http_user_agent $isNotBot {
~*bot "";
default "IAmNotARobot";
}
server {
...
location / {
...
# Bypass the cache for humans
proxy_cache_bypass $isNotBot;
# Don't cache copies of requests from humans
proxy_no_cache $isNotBot;
...
}
...
}
Таким образом, только запросы бота кэшируются для будущих запросов ботов, и только боты обслуживаются кэшированными страницами.
Других решений пока нет …