Установка Nginx с поддержкой APLN

В данной записи речь пойдет о настройке поддержки протокола APLN в Nginx. Чтобы понять для чего это все нужно, немного углубимся в тонкости работы HTTP/2. Для переключения с TLS на HTTP/2, браузер и веб-сервер должны выполнить процедуру проверки поддержки соответствующего протокола. До недавнего времени браузер Chrome мог использовать два существующих для этих целей протокола: NPN и APLN. Но связи с тем, что NPN устарел, в Google решили полностью выпилить поддержку этого протокола из Chrome.

Как это касается вас? На данный момент в репозиториях Debian и Ubuntu (и многих других дистрибутивов) находится старая версия OpenSSL. Для работы APLN вам необходим собрать Nginx используя OpenSSL версии 1.0.2 и выше. В противном случае начиная с 31 мая Chrome не сможет использовать HTTP/2 для ваших сайтов.

Проверить поддержку APLN можно на этом сайте. Для поддержки APLN вам понадобится собрать Nginx из исходников. Предварительно нужно указать каталог с исходниками OpenSSL в параметрах сборки Nginx. На момент написания статьи доступна последняя версия OpenSSL 1.0.2h.

Качаем и распаковываем исходники OpenSSL:

cd /usr/src
wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
tar -xvzf openssl-1.0.2h.tar.gz

Для Debian замените codename на кодовое имя дистрибутива, и добавьте в конец файла /etc/apt/sources.list следующие строки:

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

Информацию о том как добавить репозиторий для других дистрибутивов вы можете взять с этой страницы.

Для проверки подлинности подписи репозитория Nginx, скачиваем PGP-ключ и устанавливаем его в связку ключей программы apt:

cd /tmp/ && wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key

Для сборки deb-пакета скачиваем с официального репозитория исходники Nginx:

cd /usr/src
apt-get source nginx

Для того что бы изменить параметры сборки откройте файл:

nano /tmp/nginx-1.11.1/debian/rules

Нас интересует содержимое секции COMMON_CONFIGURE_ARGS. Приведите ее содержимое к следующему виду:

COMMON_CONFIGURE_ARGS := \
        --prefix=/etc/nginx \
        --sbin-path=/usr/sbin/nginx \
        --modules-path=/usr/lib/nginx/modules \
        --conf-path=/etc/nginx/nginx.conf \
        --error-log-path=/var/log/nginx/error.log \
        --http-log-path=/var/log/nginx/access.log \
        --pid-path=/var/run/nginx.pid \
        --lock-path=/var/run/nginx.lock \
        --http-client-body-temp-path=/var/cache/nginx/client_temp \
        --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
        --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
        --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
        --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
        --user=nginx \
        --group=nginx \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_addition_module \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_random_index_module \
        --with-http_secure_link_module \
        --with-http_stub_status_module \
        --with-http_auth_request_module \
        --with-http_xslt_module=dynamic \
        --with-http_image_filter_module=dynamic \
        --with-http_geoip_module=dynamic \
        --with-http_perl_module=dynamic \
        --add-dynamic-module=debian/extra/njs-1c50334fbea6/nginx \
        --with-threads \
        --with-stream \
        --with-stream_ssl_module \
        --with-http_slice_module \
        --with-mail \
        --with-mail_ssl_module \
        --with-file-aio \
        --with-ipv6 \
        $(WITH_HTTP2) \
        --with-openssl=/usr/src/openssl-1.0.2h \
        --with-cc-opt="$(CFLAGS)" \
        --with-ld-opt="$(LDFLAGS)"

После того как все необходимые изменения сделаны, можно начинать компиляцию и сборку пакета:

cd /tmp/nginx-1.11.1
dpkg-buildpackage -rfakeroot -uc -b

Если в процессе не было ошибок, в каталоге /usr/src мы увидим собранный из исходников deb-пакет nginx_1.11.1-1~jessie_amd64.deb. Для его установки необходимо выполнить команду:

dpkg -i nginx_1.11.1-1~jessie_amd64.deb