Включение HTTP/2 в Nginx на Debian или Ubuntu

HTTP/2 — современный протокол, который пришел на смену HTTP/1.1. Вот что он дает:

  • Мультиплексирование — параллельная передача нескольких запросов по одному соединению
  • Приоритизация — важные ресурсы загружаются первыми
  • Сжатие заголовков — уменьшение объема передаваемых данных
  • Server Push — отправка ресурсов до того, как клиент их запросит

Для поддержки HTTP/2 нужен Nginx версии 1.9.5 или выше. Проверить текущую версию можно, набрав в консоли:

nginx -v

На момент написание этого текста текущая стабильная версия была 1.28. 

HTTP/2 требует обязательного использования HTTPS. У вас должен быть SSL-сертификат:

  • От Let's Encrypt (бесплатный)
  • Коммерческий сертификат
  • Самоподписанный (только для тестов)

Наиболее простой способ получение SSL-сертификата - использование сервиса  Let's Encrypt. Для этого, устанавливаем Certbot и получаем сертификат:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.tld -d www.your-domain.tld

Настройка Nginx для HTTP/2

Открывем конфигурационный файл сайта:

sudo nano /etc/nginx/sites-available/your_site.conf

Редактируем блок server для порта 443. Неробходимо добавить директиву http2, имеющую значние on.

БЫЛО:

server {
    listen 443 ssl;
    listen [::]:443 ssl;  # для IPv6
    server_name your-domain.tld;

    ssl_certificate /etc/ssl/certs/ваш-сертификат.crt;
    ssl_certificate_key /etc/ssl/private/ваш-ключ.key;

    # ... остальные настройки
}

СТАЛО:

server {
    # Добавляем директиву http2
    http2 on;
    listen 443 ssl;
    listen [::]:443 ssl http2;  # для IPv6

    server_name ваш-домен.ru;

    # ... остальные настройки сайта
}

Директива http2 была добавлена в Nginx, начиная с версии 1.25.1. Для более старых версий, необходимо использовать парметр 'http2' в директиве listen. В настоящее время нижеследующий вариант включение HTTP/2 в конфигурационных файлах Nginx считается устаревшим.

БЫЛО:

server {
    listen 443 ssl;
    listen [::]:443 ssl;  # для IPv6
    server_name your-domain.tld;

    ssl_certificate /etc/ssl/certs/ваш-сертификат.crt;
    ssl_certificate_key /etc/ssl/private/ваш-ключ.key;

    # ... остальные настройки
}

СТАЛО:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;  # для IPv6
    server_name your-domain.tld;

    ssl_certificate /etc/ssl/certs/ваш-сертификат.crt;
    ssl_certificate_key /etc/ssl/private/ваш-ключ.key;

    # ... остальные настройки
}

При тестировании конфигурации (запуском nginx -t в консоли) на момент написания данного текста, использование данного варианта настройки HTTP/2  в Nginx выдавало следующе предупреждение:

[warn] 628938#628938: the "listen ... http2" directive is deprecated, use the "http2" directive instead in /etc/ng
inx/sites-enabled/your_server.conf:xy

Проверяем, есть ли редирект с HTTP на HTTPS (обязательно, обычно автоматически добавляется Certbot-ом при получении сертификата)

server {
    listen 80;
    listen [::]:80;
    server_name ваш-домен.ru www.ваш-домен.ru;

    return 301 https://$server_name$request_uri;
}
 
Проверяем синтаксис конфигурации
sudo nginx -t

# Если все ок, перезагружаем Nginx
sudo systemctl reload nginx
# или
sudo service nginx reload

Проверка работы HTTP/2

Способ 1: Через браузер

  1. Откройте Developer Tools (F12)
  2. Перейдите на вкладку "Сеть"
  3. Обновите страницу выберите любой запрос.
  4. В строке "Версия" должно быть - HTTP/2.

HTTP2

Способ 2: Через командную строку

# Используя curl
curl -I --http2 https://your-domain.tld

# Или с подробным выводом
curl -v --http2 https://your-domain.tld 2>&1 | grep -i "HTTP/"

# Альтернативный способ
nginx -V 2>&1 | grep -o http_v2_module
# Если видим http_v2_module — поддержка есть
-домен.ru/chain.pem;

Итог

Включение HTTP/2 в Nginx — простая процедура, которая дает:

  • Ускорение загрузки на 15-50%
  • Уменьшение нагрузки на сервер
  • Лучший пользовательский опыт

Основные шаги:

  1. Убедиться, что Nginx ≥ 1.9.5
  2. Настроить SSL
  3. Добавить http2 в директиву listen
  4. Проверить и перезагрузить конфигурацию

Важно: Если вы используете Cloudflare или другой CDN, убедитесь, что он поддерживает HTTP/2, так как соединение между пользователем и CDN также должно использовать этот протокол для максимальной эффективности.