Воркер обхода выглядит просто: взял адрес, запросил, следующий. Но в деталях — куда отправлять запрос, с какими заголовками, сколько успевать за прогон — сидит половина проблем, которые мы ловили на живых сайтах.
Это тридцатая часть цикла «Кэш страниц без MISS».
Не через публичный домен
Запрос на публичный адрес сайта идёт наружу и обратно: DNS, внешний балансировщик, TLS. Медленно и зависит от того, что творится снаружи. Обходчик отправляет запросы прямо в nginx своего сайта по внутренней сети, а сайтом представляется заголовками:
wp_remote_get('http://' . NGINX_INTERNAL . $path, [
'headers' => [
'Host' => cache_site_host(), // канонический домен, см. 25-ю часть
'X-Forwarded-Proto' => 'https',
'User-Agent' => $ua,
],
'redirection' => 0,
'timeout' => 15,
]);
- Host — канонический домен: он входит в ключ кэша, иначе прогреются не те ячейки;
- X-Forwarded-Proto: https — без него WordPress решит, что запрос пришёл по http, соберёт http-ссылки, и в кэш ляжет страница со смешанным содержимым;
- redirection = 0 — редирект не следовать, а записать (двадцать восьмая часть).
Точное имя контейнера. Если на сервере несколько сайтов в общей docker-сети, имя «nginx» может разрешиться в чужой стек. Обходчик тогда честно греет кэш соседа. Указывайте точное имя контейнера своего nginx.
Параметры прогона
| Параметр | Значение | Зачем |
|---|---|---|
| бюджет прогона | 15 адресов × 2 User-Agent | телефон и компьютер — разные ячейки |
| обрыв по времени | 50 с | прогон не должен жить дольше минуты крона |
| недогретое | в голову очереди | начать с него в следующем прогоне |
| замок | 3 минуты | два прогона не идут параллельно |
| потолок очереди | 3000 адресов | защита от разрастания |
| круг | раз в сутки + по сигналу сброса | страховка от вытеснения |
Если прогон упёрся в замок — он перепланирует себя. Иначе очередь может встать навсегда; это отдельная история, тридцать пятая часть.
Прогрев работает, а страницы всё равно холодные?
Пришлите адрес — проверю, куда и с какими заголовками ходит ваш обходчик.
// загружаю комментарии…