TTFB долгий — сервер отвечает медленно
Time to First Byte > 600ms. БД, медленный PHP, без кеша — где искать тормоза.
Симптом
- Time to First Byte (TTFB) > 600 мс при запросе к сайту.
- В браузере в панели «Network» видно, что первый байт приходит только через 0.6 с и более.
- В логах веб‑сервера (nginx, Apache) виден большой интервал между получением запроса и отправкой ответа.
- При проверке через сервисы вроде Pingdom, GTmetrix, WebPageTest TTFB отмечается как «slow».
- На страницах с динамическим контентом (PHP, Node.js, Django) TTFB растёт при больших объёмах данных в БД.
Причина
TTFB измеряет время от момента отправки HTTP‑запроса клиентом до получения первого байта ответа сервером.
Долгий TTFB обычно вызван:
-
Медленной обработкой PHP‑скриптов
- неэффективные запросы к БД, отсутствие индексов, сложные JOIN‑ы.
- отсутствие OPCache, каждый запрос компилирует PHP заново. -
БД‑тормоза
- большие таблицы без индексов, сканирование всей таблицы.
- блокировки, deadlock‑ы, высокая нагрузка на дисковую подсистему. -
Сетевой/конфигурационным накладным весом
- медленный сетевой путь, высокая RTT, ограничение пропускной способности.
- неправильные настройки keep‑alive, слишком короткие таймауты. -
Отсутствие кеширования
- каждый запрос генерирует страницу заново.
- отсутствие HTTP‑кешей, ETag, Last‑Modified. -
Проблемы в веб‑сервере
- неправильные worker‑пулы, слишком мало процессов/потоков.
- избыточные модули, которые тормозят старт скрипта.
Как проверить
| Шаг | Что проверить | Инструменты / команды |
|---|---|---|
| 1 | Показать TTFB в браузере | Вкладка «Network» → выбрать запрос → поле «TTFB». |
| 2 | Логи веб‑сервера | grep -i "ttfb" /var/log/nginx/access.log (если включено). |
| 3 | Профилирование PHP | php -d opcache.enable=0 -d opcache.enable_cli=0 -d xdebug.profiler_enable=1 script.php → cachegrind.out.*. |
| 4 | Анализ запросов к БД | SHOW PROCESSLIST; в MySQL, EXPLAIN SELECT …; для подозрительных запросов. |
| 5 | Проверка индексов | SHOW INDEX FROM table_name; |
| 6 | Проверка кеша OPCache | php -i | grep opcache → opcache.memory_consumption, opcache.interned_strings_buffer. |
| 7 | Сетевые задержки | ping -c 5 example.com, traceroute example.com. |
| 8 | Проверка worker‑пулов | ps aux | grep nginx (для nginx) или systemctl status apache2 (для Apache). |
| 9 | Проверка HTTP‑кешей | curl -I https://example.com → заголовки Cache-Control, ETag, Last-Modified. |
Решение
1. Оптимизировать PHP‑код
- Включить OPCache:
ini ; php.ini opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.validate_timestamps=0 - Минимизировать количество запросов к БД, использовать
JOINтолько там, где нужно. - Кэшировать частые запросы в Redis/Memcached.
2. Оптимизировать БД
- Добавить индексы по часто используемым полям:
sql CREATE INDEX idx_user_email ON users(email); - Пересмотреть сложные запросы, использовать
EXPLAINдля анализа плана. - Если таблица растёт до сотен мегабайт, рассмотреть партиционирование.
3. Включить HTTP‑кеширование
- В nginx добавить заголовки:
nginx location / { add_header Cache-Control "public, max-age=3600"; add_header Vary "Accept-Encoding"; } - Для динамических страниц использовать
fastcgi_cache(PHP‑FPM).
4. Настроить worker‑пулы
- Для nginx:
nginx worker_processes auto; events { worker_connections 1024; } - Для Apache:
apache <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule>
5. Проверить сетевую инфраструктуру
- Убедиться, что сервер находится в зоне с низкой RTT.
- Если используется CDN, включить его кеширование и проверить TTFB через CDN.
6. Мониторинг и алерты
- Настроить Prometheus + Grafana для отслеживания TTFB, CPU, памяти, дисковой I/O.
- Создать алерт:
avg_over_time(http_response_time_seconds[1m]) > 0.6.
Связанные
Не хотите разбираться сами?
Запустите технический аудит сайта за 5 минут — получите PDF-отчёт с разбором всех 64 параметров и конкретными точками роста. Или закажите комплексное SEO-продвижение сайта — починим всё это и возьмём на себя дальнейшую оптимизацию.