Раздел 10. Модули Апача Пункты: 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 163 164 165 166 167 168 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 203 204 205 206 207 208 209 210 211 212 213 RU EN Пункт 147. Модуль Apache mod_http2 Этот модуль обеспечивает поддержку HTTP/2 (RFC 7540) для HTTP-сервера Apache. Этот модуль использует libnghttp2 для обеспечения основного механизма http/2. Вы должны включить HTTP/2 через, Две полезные схемы конфигурации: HTTP/2 в контексте VirtualHost (только TLS)Протоколы h2 http/1.1 Разрешает согласование HTTP/2 (h2) через TLS ALPN в защищенном файле
HTTP/2 в контексте сервера (TLS и открытый текст)Протоколы h2 h2c http/1.1 Разрешает согласование HTTP/2 (h2) через TLS ALPN для безопасного
Обратитесь к официальному FAQ по HTTP/2, если у вас возникнут сомнения относительно протокола. Как это работаетИзмерение HTTP/2Включение HTTP/2 на вашем сервере Apache влияет на потребление ресурсов, и если у вас загруженный сайт, вам может потребоваться тщательно обдумать последствия. Первое, что бросается в глаза после включения HTTP/2, это то, что ваши серверные процессы будут запускать дополнительные потоки. Причина этого в том, что HTTP/2 передает все запросы, которые он получает, своим собственным рабочим потокам для обработки, собирает результаты и передает их клиенту.
В текущей реализации эти рабочие потоки используют отдельный пул потоков от рабочих процессов MPM, с которыми вы, возможно, знакомы. Так обстоят дела сейчас, и не должно быть так вечно. (Однако это может быть навсегда для линейки выпусков 2.4.x.) Таким образом, рабочие процессы HTTP/2 или более короткие H2Workers не будут отображаться в
Еще одна вещь, на которую следует обратить внимание, — это потребление памяти. Поскольку HTTP/2 хранит на сервере больше состояния для управления всеми открытыми запросами, их приоритетами и зависимостями между ними, для него всегда будет требоваться больше памяти, чем для обработки HTTP/1.1. Есть три директивы, которые управляют объемом памяти соединения HTTP/2:
И последнее, но не менее важное: Несколько хостов и неверные запросыМногие сайты используют один и тот же сертификат TLS для нескольких виртуальных хостов. Сертификат либо имеет подстановочное имя, например «*.example.org», либо содержит несколько альтернативных имен. Браузеры, использующие HTTP/2, распознают это и повторно используют уже открытое соединение для таких хостов. Хотя это отлично подходит для производительности, это имеет свою цену: такие виртуальные хосты требуют большей осторожности при настройке. Проблема в том, что у вас будет несколько запросов для нескольких хостов в одном и том же TLS-соединении. И это делает повторное согласование невозможным, несмотря на то, что стандарт HTTP/2 запрещает это. Итак, если у вас есть несколько виртуальных хостов, использующих один и тот же сертификат, и вы хотите использовать для них HTTP/2, вам необходимо убедиться, что все виртуальные хосты имеют одинаковую конфигурацию SSL. Вам нужен тот же протокол, шифры и настройки для проверки клиента. Если вы что-то смешаете, Apache httpd обнаружит это и вернет клиенту специальный код ответа 421 Misdirected Request. Переменные среды
Этот модуль можно настроить для предоставления информации, связанной с HTTP/2, в качестве дополнительных переменных среды для пространства имен SSI и CGI, а также в настраиваемых конфигурациях журнала (см. Ресурсы
Директива H2CopyFiles
Эта директива влияет на то, как содержимое файла обрабатывается в ответах. Когда
Если установлено значение
Примером такого модуля является Директива H2Direct
Эта директива переключает использование прямого режима HTTP/2. Это следует использовать внутри
Прямая связь означает, что если первые байты, полученные сервером при соединении, совпадают с преамбулой HTTP/2, протокол HTTP/2 переключается немедленно без дальнейшего согласования. Этот режим определен в RFC 7540 для случая открытого текста (h2c). Его использование в соединениях TLS не предусмотрено стандартом.
Если на сервере/виртуальном хосте не включены h2 или h2c через
Для клиентов, у которых есть дополнительные сведения о сервере, поддерживающем h2c, прямой HTTP/2 избавляет клиента от необходимости выполнять обновление HTTP/1.1, что приводит к повышению производительности и избеганию ограничений обновления для тела запроса. Это делает прямой h2c привлекательным для связи между серверами, когда соединение может быть доверенным или защищено другими средствами. ПримерH2Прямой на Директива H2EarlyHints
Этот параметр определяет, будут ли промежуточные ответы со статусом HTTP 103 пересылаться клиенту или нет. По умолчанию в настоящее время это не так, поскольку у ряда клиентов все еще возникают проблемы с неожиданными промежуточными ответами.
Если установлено значение Директива H2MaxSessionStreams
Эта директива устанавливает максимальное количество активных потоков на сеанс HTTP/2 (например, соединение), которое разрешает сервер. Поток активен, если он не активен ПримерH2MaxSessionStreams 20 Директива H2MaxWorkerIdleSeconds
Эта директива устанавливает максимальное количество секунд, в течение которых рабочий процесс h2 может бездействовать, пока не выключится. Это происходит только тогда, когда количество рабочих h2 превышает ПримерH2MaxWorkerIdleSeconds 20 Директива H2MaxWorkers
Эта директива устанавливает максимальное количество рабочих потоков, создаваемых каждым дочерним процессом для обработки HTTP/2. Если эта директива не используется,
ПримерH2MaxWorkers 20 Директива H2MinWorkers
Эта директива устанавливает минимальное количество рабочих потоков, создаваемых каждым дочерним процессом для обработки HTTP/2. Если эта директива не используется,
ПримерH2MinWorkers 10 Директива H2ModernTLSOnly
Эта директива включает проверку безопасности соединений HTTP/2 в режиме TLS (https:). Это можно использовать для всего сервера или для конкретных
Для проверки безопасности требуется, чтобы протокол TSL был как минимум TLSv1.2 и чтобы не использовался ни один из шифров, перечисленных в RFC 7540, Приложение A. Эти проверки будут расширены после вступления в силу новых требований безопасности. Название происходит от определений TLS на стороне безопасности/сервера в Mozilla, где определена «современная совместимость». Mozilla Firefox и другие браузеры требуют современной совместимости для соединений HTTP/2. Как и все в OpSec, это движущаяся цель, и можно ожидать, что в будущем она будет развиваться.
Одной из целей этих проверок
В конечном итоге безопасность TLS-соединения определяется директивами конфигурации сервера для ПримерH2ModernTLSТолько выкл. Директива H2Padding
При значении по умолчанию 0 байты заполнения не добавляются ни к каким кадрам полезной нагрузки, например HEADERS, DATA и PUSH_PROMISE. Это поведение предыдущих версий. Это означает, что при определенных условиях наблюдатель за сетевым трафиком может видеть длину этих кадров в потоке TLS. При настройке чисел от 1 до 8 к каждому кадру добавляется случайное число в диапазоне [0, 2^numbits[. Случайное значение выбирается независимо для каждого кадра, который модуль отправляет обратно клиенту. Хотя большее количество байтов заполнения обеспечивает лучшее запутывание длины сообщения, они также являются дополнительным трафиком. Таким образом, оптимальное число зависит от типа веб-трафика, который передает сервер. Значение по умолчанию 0, т. е. без заполнения, было выбрано для максимальной совместимости с предыдущими версиями. Могут быть развертывания, в которых байты заполнения нежелательны или наносят вред. Наиболее вероятной причиной может быть клиент, у которого есть реализация сбоев. Директива H2Push
Эта директива переключает использование функции push-протокола сервера HTTP/2. Протокол HTTP/2 позволяет серверу передавать клиенту другие ресурсы, когда он запрашивает определенный. Это полезно, если эти ресурсы каким-то образом связаны, и можно ожидать, что клиент все равно запросит их. Затем отправка экономит время, которое требуется клиенту, чтобы запросить ресурсы самостоятельно. С другой стороны, выталкивание ресурсов, которые клиенту никогда не нужны или которые уже есть, является пустой тратой полосы пропускания.
Отправки сервером обнаруживаются путем проверки
Заголовки ссылок в ответах либо устанавливаются приложением, либо могут быть настроены с помощью пример mod_headers<Местоположение /index.html> Заголовок добавить ссылку "</css/site.css>;rel=preload" Заголовок добавить ссылку "</images/logo.jpg>;rel=preload" </местоположение> Как показывает пример, к ответу может быть добавлено несколько заголовков ссылок, что приведет к запуску нескольких push-уведомлений. В модуле нет проверок, чтобы избежать повторной отправки одного и того же ресурса одному клиенту. Используйте с осторожностью. Отправка сервером HTTP/2 включена по умолчанию. На сервере или виртуальном хосте вы можете включить/отключить эту функцию для любого соединения с хостом. Кроме того, вы можете отключить PUSH для набора ресурсов в каталоге/местоположении. Это определяет, какие ресурсы могут вызвать PUSH, а не какие ресурсы могут быть отправлены через PUSH. ПримерH2Оттолкнуть И последнее, но не менее важное: толчки происходят только тогда, когда клиент сигнализирует о своей готовности принять их. Большинство браузеров поддерживают, некоторые, например Safari 9, — нет. Кроме того, отправка также происходит только для ресурсов из того же центра , для которого был исходный ответ. Директива H2PushDiarySize
Эта директива переключает максимальное количество отправок сервера HTTP/2, которые запоминаются для каждого соединения HTTP/2. Это можно использовать внутри
Дневник push-уведомлений записывает дайджест (в настоящее время используется 64-битное число) отправленных ресурсов (их URL), чтобы избежать повторных отправлений по одному и тому же соединению. Эти значения не сохраняются, поэтому клиенты, открывающие новое соединение, снова получат известные push-уведомления. В настоящее время ведется работа по предоставлению клиенту возможности раскрывать дайджест ресурсов, которые у него уже есть, поэтому дневник может инициализироваться клиентом при каждой установке соединения. Если достигнут максимальный размер, новые записи заменяют самые старые. Запись в дневнике занимает 8 байт, поэтому дневник по умолчанию с 256 записями занимает около 2 КБ памяти. Размер 0 эффективно отключает push-дневник. Директива H2PushPriority
Эта директива определяет приоритет обработки отправленных ответов на основе типа содержимого ответа. Обычно это определяется для конфигурации сервера, но также может отображаться в виртуальном хосте. Отправка сервером HTTP/2 всегда связана с запросом клиента. Каждая такая пара запрос/ответ или потоки имеют зависимость и вес, вместе определяющие приоритет потока. Когда поток зависит от другого, скажем, X зависит от Y, тогда Y получает всю пропускную способность до того, как X получит ее. Обратите внимание, что это не означает, что Y заблокирует X. Если у Y нет данных для отправки, вся полоса пропускания, выделенная Y, может быть использована X. Когда поток имеет более одного зависимого, скажем, X1 и X2 зависят от Y, вес определяет распределение пропускной способности. Если X1 и X2 имеют одинаковый вес, они оба получают половину доступной полосы пропускания. Если вес X1 в два раза больше веса X2, X1 получает вдвое большую пропускную способность, чем X2. В конечном счете, каждый поток зависит от корневого потока, который получает всю доступную полосу пропускания, но никогда ничего не отправляет. Таким образом, вся его пропускная способность распределяется по весу между его дочерними элементами. Которые либо имеют данные для отправки, либо распределяют пропускную способность своим детям. И так далее. Если ни у одного из дочерних элементов нет данных для отправки, эта полоса пропускания распределяется где-то еще в соответствии с теми же правилами. Цель этой системы приоритетов состоит в том, чтобы всегда использовать доступную полосу пропускания, позволяя при этом придавать приоритет и вес определенным потокам. Поскольку обычно все потоки инициируются клиентом, именно он устанавливает эти приоритеты. Только когда такой поток приводит к PUSH, сервер решает, каков первоначальный приоритет такого проталкиваемого потока. В приведенных ниже примерах X — это клиентский поток. Это зависит от Y, и сервер решает отправить потоки P1 и P2 на X. Правило приоритета по умолчанию: Правило приоритета по умолчаниюH2PushPriority * После 16 который читается как «Отправить проталкиваемый поток любого типа контента в зависимости от клиентского потока с весом 16». Таким образом, P1 и P2 будут отправляться после X и, поскольку они имеют одинаковый вес, поровну делят пропускную способность между собой. Правило чередования приоритетовH2PushPriority text/css Interleaved 256
который читается как «Отправить любой ресурс CSS с той же зависимостью и весом, что и клиентский поток». Если P1 имеет тип содержимого text/css, он будет зависеть от Y (как и X), и его эффективный вес будет рассчитываться как При Pw, указанном как 512, проталкиваемый поток с чередованием получит вдвое больший вес, чем X. При 128 только вдвое меньше. Обратите внимание, что эффективные веса всегда ограничены значением 256. До правила приоритетаПриложение H2PushPriority/json До Это говорит о том, что любой отправленный поток контента типа «application/json» должен быть отправлен до X. Это делает P1 зависимым от Y, а X зависимым от P1. Таким образом, X будет остановлен, пока у P1 есть данные для отправки. Эффективный вес наследуется от клиентского потока. Запрещено указывать вес. Имейте в виду, что действие спецификаций приоритета ограничено доступными ресурсами сервера. Если на сервере нет рабочих процессов, доступных для принудительных потоков, данные для потока могут поступать только тогда, когда другие потоки будут завершены. Наконец, что не менее важно, есть некоторые особенности синтаксиса, которые будут использоваться в этой директиве:
Более короткие правила приоритетаH2PushPriority application/json 32 # правило After H2PushPriority image/jpeg перед унаследованным весом # H2PushPriority text/css чередуется # вес 256 по умолчанию Директива H2PushResource
При добавлении в каталог/местоположение HTTP/2 PUSH будут предприняты для всех путей, добавленных с помощью этой директивы. Эту директиву можно использовать несколько раз для одного и того же местоположения.
Эта директива выталкивает ресурсы намного раньше, чем добавление
В отличие от установки
Добавляя Директива H2SerializeHeaders
Эта директива переключает, должны ли запросы HTTP/2 сериализоваться в формате HTTP/1.1 для обработки ядром Сериализация снизит производительность, но даст больше обратной совместимости на случай, если это потребуется для пользовательских фильтров/перехватчиков. ПримерH2SerializeHeaders на Директива H2StreamMaxMemSize
Эта директива устанавливает максимальное количество байтов исходящих данных, буферизуемых в памяти для активных потоков. Эта память не выделяется для каждого потока как таковая. Выделения учитываются в этом пределе, когда они вот-вот будут выполнены. Потоковая обработка останавливается при достижении предела и будет продолжаться только после того, как буферизованные данные будут отправлены клиенту. ПримерH2StreamMaxMemSize 128000 Директива H2TLSCoolDownSecs
Эта директива устанавливает количество секунд простоя соединения TLS, прежде чем размер записи TLS упадет до небольшой (~ 1300 байт) длины. Это можно использовать для всего сервера или для конкретных
См В развертываниях, где соединения можно считать надежными, этот таймер можно отключить, установив для него значение 0. В следующем примере секунды устанавливаются равными нулю, что эффективно отключает любое охлаждение. Прогретые соединения TLS остаются с максимальным размером записи. ПримерH2TLSCoolDownSecs 0 Директива H2TLSWarmUpSize
Эта директива устанавливает количество байтов, которые должны быть отправлены в небольших записях TLS (~ 1300 байт), до тех пор, пока не будут выполнены записи максимального размера (16 КБ) для соединений https: HTTP/2. Это можно использовать для всего сервера или для конкретных
Измерения, проведенные лабораториями производительности Google, показывают, что наилучшая производительность при соединениях TLS достигается, если начальные размеры записей остаются ниже уровня MTU, чтобы полная запись могла поместиться в IP-пакет. В то время как TCP настраивает управление потоком и размер окна, более длинные записи TLS могут застрять в очередях или потеряться и потребовать повторной передачи. Это, конечно, верно для всех пакетов. Однако для расшифровки TLS требуется вся запись. Любые отсутствующие байты в конце остановят использование полученных. После успешной отправки достаточного количества байтов состояние TCP соединения становится стабильным, и для оптимальной производительности можно использовать максимальный размер записи TLS (16 КБ). В развертываниях, где доступ к серверам осуществляется локально или только через надежные соединения, значение может быть уменьшено на 0, что полностью отключит любую фазу прогрева. В следующем примере размер устанавливается равным нулю, что фактически отключает любую фазу прогрева. ПримерH2TLSWarmUpSize 0 Директива H2Upgrade
Эта директива переключает использование метода обновления HTTP/1.1 для переключения на HTTP/2. Это следует использовать внутри
Этот метод переключения протоколов определен в HTTP/1.1 и использует заголовок «Upgrade» (отсюда и название), чтобы объявить о готовности использовать другой протокол. Это может произойти при любом запросе соединения HTTP/1.1. Этот метод переключения протоколов включен по умолчанию для соединений с открытым текстом (потенциально h2c) и отключен для TLS (потенциально h2) в соответствии с требованиями RFC 7540.
Имейте в виду, что обновления принимаются только для запросов, не содержащих тела. Запросы POST и PUT с содержимым никогда не вызовут обновление до HTTP/2. См
Этот режим действует только тогда, когда h2 или h2c включены через файл ПримерH2Обновить Директива H2WindowSize
Эта директива устанавливает размер окна, используемого для управления потоком от клиента к серверу, и ограничивает объем данных, которые сервер должен буферизовать. Клиент прекратит отправку потока, как только будет достигнут предел, пока сервер не объявит о большем доступном пространстве (поскольку он обработал часть данных). Это ограничение влияет только на тело запроса, но не на его метаданные, такие как заголовки. Кроме того, это не влияет на тела ответов, поскольку размер окна для них управляется клиентами. ПримерH2WindowSize 128000 Пункты: 85 86 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 163 164 165 166 167 168 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 203 204 205 206 207 208 209 210 211 212 213 |