NGINX и HTTP/2: Настройка ALPN в Debian Jessie

Совсем недавно Google бросили поддержку NPN. Теперь можно использовать только ALPN. Увы, браузер Chrome очень популярен и имеет множество сборок, вроде Яндекс.Браузера. Поэтому просто кинуть их мы не можем. Придется заводить ALPN, чтобы HTTP/2 работал везде.

Несмотря на то, что Google дал отсрочку полгода, пока из серверных ОС далеко не все смогли завести его поддержку "из коробки". На данный момент этим похвастаться может, например, Ubuntu Server.

В контексте Debian всё не так радужно. Для поддержки ALPN нужен NGINX 1.9.5+, собранный с библиотекой OpenSSL 1.0.2h. Сам OpenSSL 1.0.2h завезли в jessie-backports буквально в конце июля. Однако NGINX пересобирать не стали. Его всё также собирают с 1.0.1t.

Я же постараюсь описать наиболее безопасный способ установки NGINX с поддержкой ALPN без пересборки исходников и затаскивания кучи зависимостей.

Приступим. Первым делом рекомендую удалить текущий NGINX из системы (разумеется конфиги остануться):

1
sudo apt-get remove nginx nginx-common

Теперь нам нужно отредактировать файл sources.list и указать новые репозитории:

1
sudo nano /etc/apt/sources.list

Нам понадобится официальный репозиторий jessie-backports, а также официальный репозиторий от разработчиков NGINX:

1
2
3
4
5
6
7
8
9
# Проверьте, возможно первый репозиторий у вас уже прописан!
# jessie-backports official repo
deb http://ftp.ru.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://ftp.ru.debian.org/debian/ jessie-backports main contrib non-free
# nginx official repo
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Думаю многие уже заметили, что мы используем репозиторий NGINX для Ubuntu 16.04 Xenial Xerus. В нем лежит нужный нам пакет, скомпилированный с поддержкой OpenSSL 1.0.2h. Так как репозиторий официальный, пакет не тянет никаких завимостей. Будет установлен только NGINX.

1
2
3
4
5
6
7
8
# Скачиваем ключ
wget http://nginx.org/keys/nginx_signing.key
# Добавляем ключ
sudo apt-key add nginx_signing.key
# Обновляем репозитории и устанавливаем nginx
sudo apt-get update && sudo apt-get install nginx

Вполне возможно, что вы ещё не используете HTTP/2 вовсе. Благо включить его очень просто:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 80;
# for IPv6 support
#listen [::]:80;
server_name domain.xyz;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
# for IPv6 support
#listen [::]:443 ssl http2;
server_name domain.xyz;
# some config ...
}

Не забывайте, что для HTTP/2 трабуется рабочий SSL. Настройку SSL я описывал в прошлой статье.

Вероятно после обновления служба nginx в systemd будет замаскирована:

1
2
3
4
5
# Размаскируем
sudo systemctl unmask nginx
# Перезапускаем
sudo systemctl restart nginx

После этого не забудьте проверить поддержку ALPN и HTTP/2. Сделать это можно, например, здесь.