Время до первого байта (TTFB): нормативы и серверная оптимизация
1. Архитектура и принцип работы
Браузер отправляет HTTP-запрос. Сначала резолвится DNS, устанавливается TCP-соединение (и TLS-рукопожатие для HTTPS). Затем запрос уходит на сервер: веб-сервер (Nginx/Apache) принимает его, передаёт приложению (PHP, Python, Node.js), которое обращается к базе данных, кэшу или внешним API. После формирования ответа сервер отправляет первый байт заголовков и тела. TTFB измеряется от начала запроса до этого момента. Чем дольше бэкенд думает, чем больше сетевых прыжков и чем медленнее база — тем выше TTFB. Кэширование на уровне сервера, CDN и оптимизация запросов сокращают эту задержку.
2. Математическая механика и триггеры ранжирования
TTFB = DNS + TCP + TLS + (время очереди + время обработки + время БД + время рендеринга). На практике для динамических страниц с PHP-FPM и MySQL: 20–50 мс на соединение, 10–30 мс на TLS, 50–200 мс на выполнение SQL-запроса без индексов. Норматив: <200 мс для статики (CDN), <500 мс для динамики, >1 с — критично. Ключевые параметры: keepalive_timeout (Nginx), worker_connections, opcache.enable, pm.max_children (PHP-FPM). Формула для расчёта целевого TTFB: TTFB_target = (LCP_target * 0.2) — если LCP = 2.5 с, TTFB не должен превышать 500 мс. Используйте server-timing заголовки для разбивки этапов.
3. Специфика в Яндекс (YATI) vs Google
Яндекс учитывает TTFB как часть скорости сайта в ранжировании, особенно для мобильных. В Яндекс.Вебмастере есть отчёт «Скорость сайта» с рекомендациями по серверу. Google использует TTFB как диагностическую метрику в Lighthouse и PageSpeed Insights, но не как прямой фактор ранжирования — важнее LCP и INP. Однако высокий TTFB ухудшает LCP, что влияет на позиции в обоих поисковиках. Для Яндекса критичнее стабильность TTFB при пиковых нагрузках (он чаще сканирует сайты с плохим TTFB медленнее). Google больше смотрит на полевые данные CrUX. Оба поисковика любят CDN и кэширование.
4. Нормативы SLA и диагностическая матрица
| Параметр / Метрика | Эталон по SLA | Критическая ошибка |
|---|---|---|
| TTFB (статический контент, CDN) | < 200 мс | > 500 мс |
| TTFB (динамические страницы, бэкенд) | < 500 мс | > 1 с |
| Время ответа сервера (Server Response Time) в PageSpeed | < 200 мс | > 600 мс |
5. Пошаговый инженерный протокол внедрения
- Включите кэширование на уровне сервера: Nginx fastcgi_cache или proxy_cache для динамики, а также OPcache для PHP. Для WordPress — плагины кэша (WP Super Cache, W3 Total Cache) с настройкой TTL не менее 10 минут.
- Настройте keepalive и сжатие: в Nginx добавьте keepalive_timeout 65; gzip on; gzip_types text/css application/javascript; brotli on; для уменьшения времени повторных соединений.
- Оптимизируйте базу данных: добавьте индексы для медленных запросов (EXPLAIN ANALYZE), настройте query_cache (для MySQL 5.7) или используйте Redis/Memcached для горячих данных. Уменьшите количество запросов на страницу.
- Подключите CDN с поддержкой HTTP/2 или HTTP/3 и кэшированием на границе. Для динамических страниц используйте stale-while-revalidate и раннее подсказывание (Early Hints).
# Nginx: включение кэширования и keepalive для снижения TTFB
http {
fastcgi_cache_path /tmp/cache levels=1:2 keys_zone=phpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
location ~ \.php$ {
fastcgi_cache phpcache;
fastcgi_cache_valid 200 10m;
fastcgi_cache_use_stale error timeout updating http_500 http_503;
add_header X-FastCGI-Cache $upstream_cache_status;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
keepalive_timeout 65;
gzip on;
gzip_types text/css application/javascript image/svg+xml;
}
}
6. Типичные ошибки при оптимизации
- Игнорирование TLS-рукопожатия: использование устаревших протоколов (TLS 1.0/1.1) и отсутствие OCSP stapling увеличивает TTFB на 100–200 мс. Переходите на TLS 1.3 и включайте session resumption.
- Отсутствие мониторинга TTFB по регионам: замер только с одного сервера не отражает реальную картину. Пользователи из других стран могут получать TTFB в 2–3 раза выше. Используйте RUM (Real User Monitoring) и синтетические тесты из разных локаций.
- Чрезмерное использование тяжёлых плагинов или middleware на каждый запрос: например, PHP-скрипты, которые подключают десятки библиотек до отдачи контента. Каждый лишний слой увеличивает TTFB. Проверяйте профилировщиком (Xdebug, Blackfire).
