Диагностика проблемы отправки URL в IndexNow при PHP-FPM
Часто при использовании PHP-FPM с WordPress встречаются ситуации, когда автоматическая отправка URL в IndexNow не срабатывает или происходит с задержками. Основные симптомы:
- URL не появляются в панели IndexNow или поисковой системы;
- логи сервера показывают ошибки таймаута или отказа соединения при обращении к API IndexNow;
- переодические сбои при массовой отправке URL из-за ограничений по времени выполнения скрипта;
- отсутствие записи в логи плагинов или кастомных решений для отправки URL.
Причина обычно связана с особенностями работы PHP-FPM: ограниченное время исполнения, ограничение на параллельные запросы, ошибки в конфигурации.
Пошаговое решение: настройка отправки URL в IndexNow с PHP-FPM
1. Увеличение таймаута PHP-FPM
В конфигурационном файле www.conf (обычно в /etc/php/7.x/fpm/pool.d/) увеличьте параметры:
request_terminate_timeout = 60s
; или больше, если нужно
pm.max_children = 10
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
Это позволит скриптам отправлять URL дольше, не прерываясь преждевременно.
2. Асинхронная отправка URL через WP-Cron
Не стоит отправлять URL синхронно при сохранении записи, особенно если у вас большой сайт. Используйте WP-Cron для пакетной отправки.
add_action('save_post', function($post_id) {
if (wp_is_post_revision($post_id)) return;
$queue = get_option('indexnow_url_queue', []);
$url = get_permalink($post_id);
if (!in_array($url, $queue)) {
$queue[] = $url;
update_option('indexnow_url_queue', $queue);
}
});
add_action('indexnow_send_queue', function() {
$queue = get_option('indexnow_url_queue', []);
$api_key = 'ваш_ключ_из_IndexNow';
$endpoint = 'https://api.indexnow.org/indexnow';
$max_batch = 10; // пакет из 10 URL
$batch = array_splice($queue, 0, $max_batch);
if (empty($batch)) return;
$payload = [
'host' => home_url(),
'key' => $api_key,
'keyLocation' => home_url('/key-file.txt'),
'urlList' => $batch
];
$response = wp_remote_post($endpoint, [
'body' => json_encode($payload),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 30
]);
if (is_wp_error($response)) {
error_log('IndexNow error: '.$response->get_error_message());
// можно добавить повторную попытку
} else {
update_option('indexnow_url_queue', $queue);
}
});
if (!wp_next_scheduled('indexnow_send_queue')) {
wp_schedule_event(time(), 'five_minutes', 'indexnow_send_queue');
}
// Регистрируем интервал 5 минут
add_filter('cron_schedules', function($schedules) {
$schedules['five_minutes'] = ['interval' => 300, 'display' => 'Every 5 Minutes'];
return $schedules;
});
3. Использование внешних очередей и очередей задач
Для крупных проектов рекомендуется использовать внешние системы очередей (Redis, RabbitMQ) или WP-CLI для отправки URL вне контекста веб-запроса, снижающих нагрузку на PHP-FPM.
Проверка результата после внедрения решения
- Проверьте логи PHP-FPM и WordPress на отсутствие ошибок при отправке URL;
- В панели IndexNow или в поисковиках убедитесь, что новые URL появляются в индексе;
- Используйте curl для теста API вручную:
curl -X POST 'https://api.indexnow.org/indexnow' \
-H 'Content-Type: application/json' \
-d '{ "host": "https://example.com", "key": "ваш_ключ", "keyLocation": "https://example.com/key-file.txt", "urlList": ["https://example.com/new-page/"] }'
Частые ошибки и их исправление
- Таймауты PHP-FPM: не увеличен
request_terminate_timeout— скрипты прерываются раньше, чем отправляют пакет URL; - Отправка URL при каждом сохранении поста: приводит к нагрузке и блокировкам, лучше использовать очередь и WP-Cron;
- Неправильный формат JSON для IndexNow: внимательно формируйте массив с ключами
host,key,keyLocation,urlList; - Отсутствие файла ключа IndexNow: файл
key-file.txtдолжен быть доступен по адресуhttps://ваш_сайт/key-file.txt; - Проблемы с cURL или wp_remote_post: убедитесь, что сервер поддерживает исходящие HTTPS-запросы и что нет блокировок на уровне firewall.
Практические советы по безопасности и производительности
- Не храните ключ API IndexNow в открытом виде в базе данных — используйте define-константы в
wp-config.phpили защищенные переменные окружения. - Для массовых отправок разделяйте URL на пакеты по 10–20 штук, чтобы избежать перегрузки сервера и превышения лимитов API.
- Используйте транзиенты или кеширование очереди, чтобы избежать дублирующих отправок.
- Регулярно проверяйте логи и настраивайте мониторинг, чтобы вовремя выявлять сбои.
Сравнение вариантов интеграции отправки URL в IndexNow
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Синхронная отправка при сохранении поста | Простая реализация | Нагрузка, таймауты, блокировка PHP-FPM | save_post + wp_remote_post |
| Очередь + WP-Cron | Снижение нагрузки, надежность | Задержка отправки, сложнее настроить | Пример выше |
| Внешние очереди + WP-CLI | Максимальная производительность и масштабируемость | Сложность реализации, требует дополнительного ПО | Использование Redis, RabbitMQ и WP-CLI скриптов |