Последнее время достаточно часто можно слышать про протокол HTTP/2. Что это такое и зачем нам нужен данный протокол?
Современные сайты состоящие из большого количества статических элементов, при загрузке инициируют на каждый элемент статики отдельное TCP-соединение. Это создает определенную задержку при загрузке сайта. Мультиплексирование позволяет браузеру выполнять множество запросов в рамках одного TCP-соединения — это самое главное преимущество HTTP/2. Также важным требованием протокола HTTP/2 является обязательное шифрование (HTTPS).
Если вы используете HTTP/2 на базе Nginx, то с 31 мая 2016 года он перестал работать в Chrome и остальных браузерах.
Для использования HTTP/2 протокола требуется поддержка переключения с обычного TLS на HTTP/2. Существует две реализации переключения: NPN (Next Protocol Negotiation) и ALPN (Application-Layer Protocol Negotiation). При этом первая реализация устарела и заменёна второй. При этом для работы второй реализации — ALPN, нужен OpenSSL версии (1.0.2+), более старые поддерживают только NPN.
Operating System | OpenSSL Version | ALPN and NPN Support |
---|---|---|
CentOS/Oracle Linux/RHEL 5.10+ | 0.9.8e | Neither |
CentOS/Oracle Linux/RHEL 6.5+, 7.0+ | 1.0.1e | NPN |
Ubuntu 12.04 LTS | 1.0.1 | NPN |
Ubuntu 14.04 LTS | 1.0.1f | NPN |
Ubuntu 16.04 LTS | 1.0.2g | ALPN and NPN |
Debian 7.0 | 1.0.1e | NPN |
Debian 8.0 | 1.0.1k | NPN |
Пока в репозитариях нет нужной версии OpenSSL. Решения довольно простое собрать Nginx на базе свежего OpenSSL и сделать свой репозитарий. По сути мы делаем пакет по аналогии с тем как мы ранее делали rpm для Tomcat 8.
1. Ставим необходимые для сборки пакеты:
yum -y groupinstall 'Development Tools' yum -y install wget openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel pcre-devel yum -y install rpmdevtools && rpmdev-setuptree |
2. Заходим на сайт исходников и находим последние версии пакетов:
https://www.openssl.org/source/
http://nginx.org/packages/mainline/centos/6/SRPMS/
3. Найденные версии заносим в переменные:
OPENSSL="openssl-1.1.0e" NGINX="nginx-1.11.10-1" |
4. Скачиваем исходники и компилим пакет:
mkdir -p /opt/lib wget https://www.openssl.org/source/$OPENSSL.tar.gz -O /opt/lib/$OPENSSL.tar.gz tar -zxvf /opt/lib/$OPENSSL.tar.gz -C /opt/lib rpm -ivh http://nginx.org/packages/mainline/centos/6/SRPMS/$NGINX.el6.ngx.src.rpm sed -i "s|--with-http_ssl_module|--with-http_ssl_module --with-openssl=/opt/lib/$OPENSSL|g" /root/rpmbuild/SPECS/nginx.spec # rpmbuild -ba /root/rpmbuild/SPECS/nginx.spec # Если необходима 32 битная версия пакета rpmbuild -ba --target=i686 /root/rpmbuild/SPECS/nginx.spec |
5. Устанавливаем, вновь полученный пакет:
rpm -ivh /root/rpmbuild/RPMS/x86_64/$NGINX.el6.ngx.x86_64.rpm |
6. При необходимости создаем свой репозитарий
Результат, можно проверить в консоли разработчика Chrome.
Было:
Стало: