Все більше і більше компаній починають використовувати HTTP / 2 для підвищення продуктивності своїх сайтів. Налаштувати HTTP / 2 досить просто, але що робити, якщо у вашій інфраструктурі є Varnish. Оскільки Varnish 4. * не підтримує SSL, то нам прийдеться знайти спосіб змусити всі необхідні компоненти працювати один з одним.
Як ви знаєте, Web постійно рухається вперед і ми нарешті маємо нову версію HTTP протоколу. Її основними перевагами є:
- потоки і мультиплексування (streams and multiplexing): одне HTTP / 2 з'єднання може містити безліч конкурентних відкритих потоків. Мультиплексування запитів досягається за рахунок наявності у кожного HTTP запиту / відповіді асоційованого з ним, власного потоку. Потоки не залежать одне від одного, тому очікування відповіді не впливає на роботу інших потоків.
- стиснення HTTP заголовків. в HTTP / 1.1, заголовки не стискуються і надмірно витрачають пропускну здатність, а також збільшують час передачі по мережі. У HTTP / 2 був представлений новий механізм стиснення - HPACK. Він усуває надмірні заголовки, а також знижує ступінь уразливості до відомим атакам.
- завчасна відправка даних з сервера (server pushes): HTTP / 2 дозволяє серверу передчасно відправити клієнту відповіді, асоційовані з його попередніми запитами.
Безліч сучасних браузерів вже підтримують HTTP / 2. тому за допомогою декількох простих дій ви отримаєте в них бажані результати.
Ви також можете більш детально ознайомитися з нововведеннями звернувшись до офіційної специфікації:
Навіщо потрібен HTTP / 2?
Пояснення вище хороші, проте деякі люди люблять самі побачити або відчути результат, перш ніж почати щось робити. Найкраще демо, яке я знайшов і яке здатне мотивувати інших, створено компанією Akamai. В їх демо вони порівнюють завантаження двох однаковий зображень, що складаються з безлічі маленьких сегментів, через HTTP / 1.1 і HTTP / 2. Якщо ваш браузер підтримує HTTP / 2, то я рекомендую перейти і подивитися їх HTTP / 2 демо. Більш того, браузери вимагають SSL для роботи HTTP / 2, а це зробить ваш сайт більш безпечним.
Класична схема з Varnish
Зазвичай Varnish ставлять між клієнтами і веб сервером. Схема виглядає наступним чином:
Тут у нас є клієнт, який запитує сторінку. Його запит йде до Varnish'у, який слухає 80 порт. Далі Varnish перевіряє чи є у нього в кеші об'єкт для відповіді клієнтові:
- при наявності, він вирощує відповідь клієнту, при цьому не звертаючись до веб сервера взагалі;
- при відсутності такого об'єкта, Varnish передає запит веб сервера, отримує від нього відповідь і тільки потім повертає клієнту (відповідь від веб сервера також може бути закешируваний).
Проблема в тому, що Varnish 4. * не підтримує SSL, який вимагають браузери для роботи з HTTP / 2, тому ми не можемо просто сказати Varnish'у слухати 443 порт.
Рішення з Nginx
Одним з можливих рішень є додавання Nginx перед Varnish'ем. Він буде відповідати за роботу HTTP / 2, підтримувати SSL і перенаправляти такі запити через HTTP / 1.1 Varnish'у. Наша нова схема тепер виглядає наступним чином:
установка Nginx
Мінімальна версія Nginx повинна бути не менше 1.9.5 (тільки починаючи з цієї версії в Nginx доступний необхідний нам модуль - ngx_http_v2_module). Я використовую Mac OSX, тому напишу про встановлення за допомогою brew.
Нам буде потрібно два модуля, один для HTTP / 2 і один для виявлення реальних IP після проксінг запитів. Назви необхідних нам опцій можна подивитися за допомогою ,:
Для установки Nginx виконаємо:
Також можна додати Nginx в автозавантаження:
SSL сертифікат
Додатково, нам знадобиться SSL сертифікат. Існує безліч способів його отримання, але зараз ми зупинимося на генерації за допомогою openssl:
Зверніть увагу, що при генеруванні сертифіката необхідно буде вказати ваш домен на кроці Common Name. При використанні такого сертифіката браузер повідомить, що сертифікат ненадійний, однак для наших демо цілей це цілком нормально.
Налаштування Nginx (HTTP / 2, SSL)
Тепер у нас є все, щоб налаштувати Nginx:
Налаштування Varnish
Мінімальний * .vcl файл для Varnish'а:
Далі необхідно запустити Varnish на 80 порту:
В якості альтернативи на даному етапі можна вказати прапор -b (замість * .vcl файлу, за прикладом -a).
Налаштування веб сервера
Як веб сервера я використовую Nginx (так, в нашій схемі буде 2 Nginx'а :)). В налаштуваннях Varnish'а ми вказали, що бекенд слухає порт 8080, тому необхідно налаштувати Nginx відповідним чином. Додамо в налаштування Nginx ще один сервер:
Тестування за допомогою Chrome
Щоб наочно перевірити працездатність схеми, встановіть розширення для Chrome - HTTP / 2 and SPDY indicator.
розвиток Varnish
Виходячи з одного з недавніх інтерв'ю з Varnish Software CTO Per Buer. вони проводять серйозну роботу в напрямку HTTP / 2:
H / 2 зараз перший в нашому списку. Ми витратили роки працюючи над різними змінами в Varnish, щоб підготуватися до H / 2. Два останніх релізу Varnish'а були підготовкою до нього.
Я сподіваюся, що в новій версії Varnish Cache буде додана підтримка HTTP / 2 і ми зможемо прибрати з нашого інфраструктури такі компоненти, як додатковий Nginx.
Абсолютно неважливо, чи використовуєте ви Varnish для кешування або ж модулі Nginx, ви напевне повинні працювати з HTTP / 2 вже сьогодні, тому що це дає відчутні результати і вимагає мінімум часу для настройки. Більш того, в нашому спрощеному прикладі всі ресурси будуть доступні через 443, 80 і 8080 порти. Якщо вам необхідно обмежити доступ, то прийдеться додати редирект з зовнішніх IP на рівні Varnish'а або Nginx'а.