Включаем HTTP/2 (ALPN) на Nginx


Последнее время достаточно часто можно слышать про протокол 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.
Было:

Стало:

 

Вы можете оставить комментарий ниже.