При тестировании изображения, обслуживаемого с apache
, Я заметил, что при создании нового сеанса:
Waiting (TTFB)
: 1.09s
Initial connection + SSL handshake
: 370ms
DNS Lookup
: 165ms
Но тогда при постоянном подключении следующее:
Waiting (TTFB)
: 187ms
Content Download
: 4ms
Итак, в среднем мы нашли TTFB
в 5 раз дольше при новых подключениях, непостоянно. Это нормально?
Дополнительный вопрос: почему он выполняет новый поиск DNS только при новом подключении?
Да, это нормально, что для непостоянных подключений требуется больше времени для отправки первого байта данных.
Это связано с тем, что IP-адрес должен быть определен из DNS, должно быть установлено TCP-соединение, затем должен быть инициализирован уровень SSL / TLS, и только после этого фактические данные могут быть отправлены.
Поиск DNS не выполняется при постоянном соединении, потому что уже существует активное TCP-соединение между IP-адресами клиента и сервера. Следовательно, нет необходимости преобразовывать доменное имя в IP-адрес.
Что касается Apache KeepAlive
и KeepAliveTimeout
директивы. KeepAlive
указывает, должен ли Apache поддерживать клиентские соединения открытыми для последующих запросов других ресурсов на том же сайте. Это постоянные соединения, позволяющие избежать упомянутых ранее задержек.
Однако для поддержания активности соединений используются ресурсы на сервере, поскольку каждое TCP-соединение требует памяти для поддержания состояния. Поэтому с KeepAliveTimeout
директиву можно указать, как долго простаивающее соединение остается открытым, прежде чем веб-сервер его закроет. Это также усложняет злоумышленникам возможность исчерпать ресурсы сервера, открывая HTTP-соединения и оставляя их открытыми на неопределенный срок.
MaxKeepaliveRequests
означает, сколько запросов разрешено на одно соединение KeepAlive. Я не могу представить себе ситуацию, когда можно было бы ограничить количество запросов. Для лучшей производительности я бы использовал 0
, то есть неограниченное количество запросов.
Эти директивы относятся к сеансам HTTP (S) между посетителем и веб-сервером. PHP-FPM не имеет отношения к этому интерфейсу. Однако аналогичный механизм поддержки активности доступен в nginx для интерфейса FastCGI. Я не знаю, доступен ли аналогичный механизм в Apache.