2026-09-18
Настройка NGINX для HTTP/2 по шагам

Настройка NGINX для HTTP/2 по шагам

HTTP/2 работает в браузерах только по HTTPS — популярные браузеры не используют его без шифрования. Разберём настройку по шагам: от установки NGINX до проверки протокола.

Инструкция подойдёт для Ubuntu/Debian (замена yum на apt) и RPM-систем.


Шаг 1. Установка или обновление NGINX

HTTP/2 поддерживается начиная с NGINX 1.9.5 (модуль ngx_http_v2_module).

Обновление:

nginx -v
apt update && apt install --only-upgrade nginx    # DEB
dnf update nginx                                  # RPM

Установка из официального репозитория (RPM):

vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
yum update
yum install nginx

В Ubuntu/Debian современный NGINX (1.25+) из репозитория уже собран с HTTP/2.


Шаг 2. Проверка OpenSSL

Смотрим, с какой OpenSSL собран NGINX:

nginx -V
built with OpenSSL 3.x ...

Версия OpenSSL должна быть не ниже 1.0.2 — для современного TLS обычно уже 3.x.

Если версия старая, пересобираем NGINX:

wget http://nginx.org/download/nginx-1.31.6.tar.gz
tar -xvf nginx-*.tar.gz
cd nginx-*
apt install build-essential libpcre3-dev zlib1g-dev libssl-dev libxml2-dev libxslt1-dev libgd-dev libgeoip-dev libperl-dev   # DEB

Копируем аргументы configure из вывода nginx -V и выполняем конфигурирование, убедившись в наличии --with-http_v2_module:

./configure <аргументы из nginx -V> --with-http_v2_module
make
make install

Начиная с NGINX 1.25.1 директива listen 443 ssl http2 устарела — используется отдельная http2 on;.


Шаг 3. Создание сертификата

HTTP/2 в браузере требует HTTPS. Для теста — самоподписанный сертификат; для прода — Let’s Encrypt или коммерческий CA.

mkdir /etc/nginx/ssl
openssl req -new -x509 -days 1461 -nodes -out /etc/nginx/ssl/cert.pem -keyout /etc/nginx/ssl/cert.key 
  -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=test.dmosk.local/CN=test"

Сертификат на 4 года (1461 день) для test.dmosk.local/test.


Шаг 4. Настройка NGINX

vi /etc/nginx/conf.d/test.dmosk.local.conf
server {
    listen 80;
    server_name test-http2.dmosk.local;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    location / {
        root /usr/share/nginx/html;
    }
}

Первые 4 строки перенаправляют HTTP на HTTPS; /etc/nginx/ssl/ — каталог сертификатов; /usr/share/nginx/html — корень сайта.

Современный синтаксис: http2 on; отдельной директивой вместо устаревшего listen 443 ssl http2;.

nginx -t && nginx -s reload

Шаг 5. Проверка HTTP/2

  • Внешний ресурс: онлайн-сервис geekflare.com/tools/http2-test.
  • Локально: расширение браузера (например, для Chrome — HTTP/2 indicator) или:
curl -I --http2 -k https://test-http2.dmosk.local
HTTP/2 200

Строка HTTP/2 200 подтверждает работу протокола.


Тонкости и подводные камни

  • HTTP/2 только по HTTPS — браузеры не используют h2c (незашифрованный HTTP/2).
  • http2 on; — в NGINX 1.25.1+ параметр http2 в директиве listen устарел.
  • --with-http_v2_module — при ручной сборке проверьте наличие этого модуля.
  • OpenSSL — старая версия не поддерживает современные шифры и ALPN (нужен для согласования HTTP/2).
  • nginx -t перед reload — проверяйте синтаксис конфигурации.
  • Сертификат — самоподписанный вызовет предупреждение браузера, но HTTP/2 при этом работает.
  • HTTP/3 — современный NGINX также поддерживает QUIC (listen 443 quic reuseport; + http3 on;), но это отдельная тема.

Шпаргалка

nginx -v          # >= 1.9.5
nginx -V          # проверить OpenSSL и --with-http_v2_module

mkdir -p /etc/nginx/ssl
openssl req -new -x509 -days 1461 -nodes -out /etc/nginx/ssl/cert.pem -keyout /etc/nginx/ssl/cert.key -subj "/CN=test.local"

# server { listen 443 ssl; http2 on; ssl_certificate ...; }
nginx -t && nginx -s reload
curl -I --http2 -k https://test.local    # HTTP/2 200

Проверено на: Ubuntu 22.04/24.04, Rocky Linux 9 + NGINX 1.31.6.
Дата: Сентябрь 2026.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *