Ответ
Keep-Alive (или постоянное соединение, HTTP persistent connection) — это механизм на уровне HTTP/TCP, который позволяет повторно использовать одно установленное TCP-соединение для отправки и получения нескольких HTTP-запросов и ответов, вместо того чтобы открывать и закрывать новое соединение для каждого запроса.
Проблема, которую решает Keep-Alive: Без него загрузка веб-страницы с 50 ресурсами (HTML, CSS, JS, картинки) потребовала бы 50 отдельных TCP-соединений. Каждое соединение — это накладные расходы на:
- TCP three-way handshake (SYN, SYN-ACK, ACK).
- Медленный старт (slow start) алгоритма TCP.
- TLS handshake (если используется HTTPS).
- Разрыв соединения (FIN-пакеты).
Как это работает и настраивается:
-
На стороне веб-сервера (Nginx):
http { # Время, в течение которого неактивное соединение остается открытым keepalive_timeout 65s; # Максимальное количество запросов по одному соединению keepalive_requests 100; # Резервирование keepalive-соединений для рабочих процессов keepalive_disable none; # Включить для всех браузеров } -
На стороне балансировщика нагрузки/прокси (HAProxy):
backend webservers mode http option http-keep-alive # Включение keep-alive между HAProxy и бэкендом server web1 10.0.1.10:80 check -
В HTTP-заголовках:
Запрос: Connection: keep-alive Ответ: Connection: keep-alive Keep-Alive: timeout=65, max=100
Преимущества для производительности и инфраструктуры (DevOps-взгляд):
- Снижение задержки (Latency): Исключаются многократные handshake'ы, особенно критично для HTTPS.
- Снижение нагрузки на ОС и сервер: Меньше операций по открытию/закрытию сокетов, меньше используется CPU и память на управление соединениями.
- Улучшение пропускной способности: Более эффективное использование сетевых ресурсов.
- HTTP/2 и HTTP/3: Эти протоколы используют постоянные соединения и мультиплексирование запросов по умолчанию, что является эволюцией идеи Keep-Alive.
Мониторинг: В инструментах вроде netstat или ss большое количество соединений в состоянии ESTABLISHED может указывать на работу keep-alive.
ss -t state established 'sport = :80'