Налаштування підтримки HTTP/2 Nginx в Ubuntu 18.04

Nginx – спритний веб-сервер з відкритим початковим кодом, який заслужив довіру. Йому надають перевагу за незначне споживання пам’яті, легкість налаштування і підтримку великої кількості протоколів.
HTTP/2 – бінарна вдосконалена версія протоколу для швидкої передачі даних від сервера до користувача.
Оскільки HTTP 1.1 – це протокол з обмеженою кількістю одночасних підключень, який збільшував затримку завантаження важких сторінок через послідовність завантаження, ось через майже 20 років, було прийнято рішення позбутися елементів, які перешкоджали підвищенню продуктивності.
HTTP/2 вирішує проблему шляхом паралельного завантаження даних (а не послідовного, як було раніше), стисненням полів заголовків HTTP.
В основу оновленого протоколу покладено мультиплексування потоків, що являє собою розстановку пріоритетів між важчими потоками – це важливо в умовах обмеження ресурсів.

Крім прискорення завантаження сторінок сайту, перехід на протокол HTTP/2 також підвищить безпеку передачі даних між сервером і відвідувачами, оскільки у всіх сучасних браузерах обов’язковою умовою підтримки протоколу HTTP/2 є шифрування з’єднання між клієнтом і сервером (сайт повинен працювати по HTTPS, тобто мати встановлений SSL сертифікат).

Далі розглянемо процес переходу на HTTP/2

У вас є сервер Ubuntu 18.04 з root-доступом і встановленим Nginx.
Доменне ім’я, для якого налаштовуємо роботу по HTTP/2, має бути спрямоване на ваш сервер. У нас ви маєте можливість зареєструвати новий домен, перевести існуючий до нас на обслуговування або направити домен у вашого реєстратора по А-запису на ваш сервер.
Також для цього домену на сервер необхідно встановити SSL сертифікат: це може бути як безкоштовний Let’s Encrypt, так і один з платних сертифікатів, які ви можете придбати на нашому сайті (роботу production’a на самопідписному сертифікаті не розглядаємо).

Для коректної роботи сайту по HTTP/2 необхідно налаштувати перенаправлення трафіку з 80 на 443 порт (автоматичне перенаправлення запитів з HTTP на HTTPS протокол).

Підключення підтримки HTTP/2

У разі, якщо під час встановлення Nginx ви виконали налаштування блоку server, то задаємо наступні параметри для використання HTTP/2 вашим доменом.

Насамперед, внесемо в конфігураційний файл налаштування, що безпосередньо відповідають за HTTP/2:

Відкриваємо конфігураційний файл домену користувача

vim /etc/nginx/sites-available/ваш_домен

Далі підключимо HTTP/2 для IPv6 з’єднань і IPv4 підключень в секції listen для порту 443:

listen [::]:443 ssl http2 ipv6only=on;

listen 443 ssl http2;

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

nginx -t

Якщо помилки допущені не були, ми отримаємо наступний висновок:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Обмежимо використання небезпечних шифрів на сервері

Шифр (Cipher Suites) – алгоритми виконання криптографічних функцій для шифрування передачі даних.

На наступному кроці проведемо очищення неактуальних і небезпечних шифрів, наприклад, виключимо використання шифрування MD5, яке вважається небезпечним.

Відкриваємо необхідний конфігураційний файл:

vim /etc/nginx/sites-available/ваш_домен

Приводимо опцію ssl_ciphers до наступного вигляду:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Зберігаємо внесені зміни і виходимо.

І ще раз перевіряємо чи не допустили синтаксичних помилок:

nginx -t

Перезавантажуємо веб-сервер після внесених налаштувань.

systemctl restart nginx.service

Переконуємося, що протокол HTTP/2 коректно працює

Почнемо з найпростішого методу перевірки в консолі за допомогою curl. Виконуємо запит:

curl -I -L https://ваш_домен

і отримуємо приблизно наступний результат:

HTTP/2 200 

server: nginx/1.14.0 (Ubuntu)

date: Mon, 15 Jun 2020 20:28:01 GMT

content-type: text/html

content-length: 240

last-modified: Fri, 12 Jun 2020 10:50:34 GMT

etag: "5ee35dfa-f0"

accept-ranges: bytes 

Також, можна виконати перевірку за допомогою Google Chrome: Інші інструменти – Інструменти розробника (або натискаємо F12), переходимо на вкладку Network, правою кнопкою натискаємо по заголовку Таблиці і вибираємо опцію Protocol. У випадку, якщо все налаштовано правильно, в новому стовпчику відобразиться значення h2 (скорочення від HTTP/2)

У підсумку, контент буде обслуговуватися сервером по захищеному протоколу HTTP/2.

Ми вже маємо налаштований редирект з HTTP на HTTPS. Додамо також заголовок HTTP Strict Transport Security, щоб виключити пріоритет цих перенаправлень. Таким чином, якщо браузер виявить HSTS-заголовок, він не стане підключатися через HTTP. Обмін даними відбуватиметься виключно по захищеному з’єднанню HTTPS.

Відкриємо конфігураційний файл:

style="font-weight: 400;">vim /etc/nginx/nginx.conf 

У файлі конфігурації Nginx в текстовому редакторі прописуємо:

http {

...

##

# Virtual Host Configs

##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...

Значення max age встановлюємо в секундах.

Дане правило застосовується для основних доменів, у разі, якщо необхідно розширити заголовок для субдоменів додаємо includeSubDomains, як в нашому випадку:

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Ви вже знаєте, що після збереження і виходу з текстового редактора, ми обов’язково перевіряємо синтаксис:

nginx -t

і перезапускаємо веб-сервер.

systemctl restart nginx.service

Висновок

Після підключення ви зможете на собі перевірити надійність, швидкість і безпеку HTTP/2 протоколу.