Настройте обратный прокси-сервер Apache с HTTP/2

В этом руководстве мы увидим, как включить Apache Server в качестве системы обратного прокси для внутреннего сервера, который включен с протоколом HTTP/2 в Windows.

Что такое HTTP/2?

HTTP/2 — это первое обновление протокола передачи гипертекста с 1999 года. Его цель — повысить производительность веб-сайта за счет оптимизации того, как HTTP выражается «по сети». Это не меняет семантику HTTP, что означает, что поля заголовков, коды состояния и файлы cookie работают точно так же, как в HTTP/1.1.

HTTP/2 начал свою жизнь как протокол Google SPDY, который они разработали для решения многих проблем с производительностью, присущих HTTP/1.1. Основные преимущества SPDY перешли в HTTP/2, улучшены глобальным интернет-сообществом и формализованы в интернет-стандарте.

Преимущества HTTP/2

HTTP/2 представляет несколько новых функций, и все они предназначены для сокращения времени загрузки страниц посетителями вашего сайта.

Мультиплексирование:

HTTP/1.1 требует, чтобы каждый запрос использовал собственное TCP-соединение. Мультиплексирование, напротив, позволяет браузеру включать несколько запросов в одно TCP-соединение.

Сжатие заголовка:

Современные веб-сайты полагаются на множество внешних ресурсов: изображения, CSS, JavaScript и шрифты, и это лишь некоторые из них. Каждый раз, когда браузер запрашивает один из этих ресурсов, он включает заголовок HTTP с запросом. Когда сервер отправляет актив обратно в браузер, он также включает заголовок ответа HTTP. Это много накладных расходов для типичной веб-страницы. HTTP/2 заставляет все заголовки HTTP отправляться в сжатом формате, что уменьшает объем информации, которой необходимо обмениваться между браузером и сервером.

Пуш сервера:

HTTP/2 Server Push позволяет нашей пограничной сети отправлять веб-ресурсы обратно в ваш браузер еще до того, как он узнает, что они ему нужны. Это ускоряет загрузку страниц, устраняя ненужные обращения туда и обратно. Например, когда браузер запрашивает HTML-страницу, вы можете «протолкнуть» все таблицы стилей CSS, ресурсы изображений и другие ресурсы внутрь этой веб-страницы.

Приоритет потока:

Приоритет потока — это механизм, с помощью которого браузеры указывают, какие активы они хотели бы получить первыми. Например, браузер с поддержкой HTTP/2 может использовать приоритет потока, чтобы сначала загрузить HTML для страницы, затем CSS, затем JavaScript и, наконец, ресурсы изображения. Такой порядок позволяет браузеру отображать страницу как можно быстрее.

Включить HTTP/2 для Apache

Apache поддерживает HTTP/2, начиная с версии 2.4.17. Модуль mod_http2 включает необходимую поддержку протокола h2 на сервере Apache.

Большинство браузеров в настоящее время поддерживают только HTTP/2 через зашифрованное соединение. Для практических целей это означает, что ваш веб-сайт должен обслуживаться через HTTPS, чтобы использовать преимущества HTTP/2.

В качестве первого шага включите SSL для сервера Apache. Обратитесь к этой статье, чтобы создать самоподписанный сертификат для разработки.

Загрузите модуль mod_ssl в файл httpd.conf:

LoadModule ssl_module modules/mod_ssl.so

Включите настройку SSL на глобальном уровне или специфично для виртуального хоста:

<VirtualHost *:443>
    ServerAdmin [email protected]
    DocumentRoot "C:\Albin\blogData\htdocs"
    ServerName myexample.com
    ErrorLog "logs/myexample.com-error.log"
    CustomLog "logs/myexample.com-access.log" common
 
 RewriteEngine  on 
 SSLEngine on
 
 SSLCertificateFile C://Albin/blogData/cors/medium/ssl/server.crt
    SSLCertificateKeyFile C://Albin/blogData/cors/medium/ssl/server.key
</VirtualHost>

Теперь сайт доступен по SSL и протоколу HTTP/1.1. Чтобы включить HTTP/2 на веб-сервере Apache, загрузите модуль http2 в файл httpd.conf:

LoadModule http2_module modules/mod_http2.so

Включите приведенную ниже конфигурацию внутри виртуального хоста:

Protocols h2 h2c http/1.1
  • h2 — указывает Apache поддерживать протокол HTTP/2 через SSL/TLS.
  • h2c — указывает Apache поддерживать HTTP/2 через TCP.
  • http/1.1 — если клиент не принимает HTTP/2, обслуживайте запрос по HTTP/1.1.
<VirtualHost *:443>
    ServerAdmin [email protected]
    DocumentRoot "C:\Albin\blogData\htdocs"
    ServerName myexample.com
    ErrorLog "logs/myexample.com-error.log"
    CustomLog "logs/myexample.com-access.log" common
 
 RewriteEngine  on 
 
 SSLEngine on
 
 SSLCertificateFile C://Albin/blogData/cors/medium/ssl/server.crt
    SSLCertificateKeyFile C://Albin/blogData/cors/medium/ssl/server.key 
 
 Protocols h2 h2c http/1.1
</VirtualHost>

Теперь сайт доступен по SSL и протоколу h2.

Обратный прокси с HTTP2

Давайте теперь разрешим обратному прокси-серверу интегрироваться с внутренним сервером через протокол h2. В качестве предварительного условия убедитесь, что на внутреннем сервере включен протокол h2.

В качестве первого шага включите необходимые прокси-модули:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http2_module modules/mod_proxy_http2.so

Включите эти дополнительные конфигурации прокси в виртуальный хост:

<VirtualHost *:443>
    ServerAdmin [email protected]
    DocumentRoot "C:\Albin\blogData\htdocs"
    ServerName myexample.com
    ErrorLog "logs/myexample.com-error.log"
    CustomLog "logs/myexample.com-access.log" common
 
 SSLProxyEngine on  
 RewriteEngine  on 
 SSLEngine on
 
 ProxyPass / h2://localhost:8443/
 ProxyPassReverse / http://localhost:8443/
 
 SSLCertificateFile C://Albin/blogData/cors/medium/ssl/server.crt
    SSLCertificateKeyFile C://Albin/blogData/cors/medium/ssl/server.key 
 
 Protocols h2 h2c http/1.1
</VirtualHost>

Apache проксирует запросы на внутренние серверы по протоколу h2. Теперь сквозной поток (браузер → Apache → серверная часть) включен с протоколом h2.

Здесь внутренний сервер включен с протоколом h2 вместе с SSL на порту 8443. Если вам нужно подключиться к внутреннему серверу, который включен с помощью h2 через HTTP (без SSL), используйте протокол h2c вместо h2 для подключения к внутреннему серверу.

ProxyPass / h2c://localhost:8081/
ProxyPassReverse / http://localhost:8081/

Для демонстрации я использовал сервер Tomcat в качестве серверной части. Сервер Tomcat версии 9+ обеспечивает поддержку протокола h2 (модуль Apache mod_jk можно напрямую использовать для подключения к Tomcat через h2, но я использовал mod_proxy_http2, чтобы показать общий сценарий).

Чтобы включить протокол h2 в Tomcat, добавьте приведенную ниже конфигурацию в conf/server.xml и настройте пути server.crt и server.key. Я использую те же файлы сертификатов и ключей, что и на сервере Apache:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/server.key"
                         certificateFile="conf/server.crt"                        
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

Загрузите переносимую среду выполнения Apache (APR). APR — это вспомогательная библиотека для веб-сервера Apache. Он предоставляет набор API, которые сопоставляются с базовой операционной системой. Если ОС не поддерживает определенную функцию, APR обеспечит эмуляцию. Модуль APR tcnative-1.dll можно скачать из следующего места. Скопируйте tcnative-1.dll в папку bin сервера Tomcat в соответствии с архитектурой вашей системы.

Включите приведенную ниже конфигурацию в catalina.bat, чтобы включить tcnative-1.dll как часть пути к классам (измените существующую конфигурацию JAVA_OPTS и включите Djava.library.path в качестве дополнительного параметра):

set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Djava.library.path=C:\Albin\SW\Reverse-Proxy-Tomcat\8080\apache-tomcat-9.0.30\bin"

После перезагрузки сервер Tomcat теперь доступен по протоколу h2 через порт 8443 с SSL.

Протокол HTTP2 поможет нам повысить производительность веб-сайтов. Это сокращает общее время загрузки страницы за счет использования расширенных функций, таких как мультиплексирование, сжатие заголовков, приоритет потока и отправка на сервер. В следующем уроке мы увидим, как использовать протокол h2 для сокращения времени загрузки страницы.

Использованная литература:

https://www.cloudflare.com/website-optimization/http2/what-is-http2/