Назад | Перейти на главную страницу

Соединение Apache против запроса

Заранее прошу прощения, если это базовый вопрос, но я сильно сбит с толку после прочтения документации Apache и других руководств.

Обслуживает ли один предварительный форк Apache все HTTP-запросы для данного клиента? Я так и думал, но когда я уменьшаю maxclients до небольшого числа, время загрузки моей страницы падает. И это несмотря на то, что я единственный клиент на данном сервере. Это предполагает, что каждый процесс обслуживает один HTTP-запрос за раз, а не обслуживает все запросы в окне TimeOut.

Итак, если для полной загрузки одной веб-страницы требуется 15 HTTP-запросов, нужно ли мне 15 предварительных процессов Apache для ее оптимального обслуживания?

Как мы обычно думаем о протоколе HTTP, это не должно быть проблемой.

Современные браузеры используют сохранить жизнь соединения, которые могут передавать только один запрос за раз; в этом смысле, используя MaxClients 1 не должно иметь никакого влияния, поскольку каждый запрос в этих соединениях завершается до следующего запуска.

Однако это другое дело в современных браузерах; они используют несколько соединений. В наши дни вы можете получить html-страницу, требующую загрузки 40 других ресурсов; изображения, javascript, css. С точки зрения эффективности не имеет большого смысла складывать их все в один файл для отправки через одно соединение; вместо этого они разбиваются на несколько соединений (каждое из которых по-прежнему однофайловое) для одновременной загрузки.

Я не могу найти надежный авторитетный источник информации о поведении каждого браузера, но что я могу найти предполагает, что 6 подключений - это нормально. Здесь вступает в игру параллелизм вашего сервера; каждое из этих 6 соединений может одновременно запрашивать ресурс, действуя как 6 разных клиентов с точки зрения сервера.

mpm_prefork ответит только на одно соединение. Если вы хотите, чтобы apache обслуживал более одного соединения для каждого процесса, вам нужно будет использовать многопоточный MPM, например mpm_worker.

Современный браузер использует конвейерную обработку (несколько одновременных подключений) и keep-alive (сериализованные запросы в одном и том же подключении) для увеличения пропускной способности и эффективности сети, а также для уменьшения задержки. Например, Mozilla Firefox можно настроить, изменив network.http.pipelining и network.http.pipelining.maxrequests в about:config