Pull to refresh

Опубликована тестовая версия модуля HTTP/2 для NGINX

Reading time 4 min
Views 20K
Original author: Faisal Memon
Представлена альфа версия патча, обеспечивающего поддержку HTTP/2 для NGINX. Для данного патча необходим NGINX версии 1.9.0 или новее. Полная поддержка протокола HTTP/2 для коммерческой и некоммерческой версий NGINX планируется к концу этого года. Отзывы можно отправить в рассылку nginx-devel.

Так как патч является альфа версией, не рекомендуется его использовать в рабочих проектах. Если есть желание использовать особенности HTTP/2 для рабочих сайтов, следует обратить внимание на NGINX версии 1.5.10 и более новых, в которых реализована полная поддержка протокола SPDY/3.1. Как предшественник HTTP/2, SPDY обладает такими же приемуществами как и HTTP/2, но в то же время имеет более широкую поддержку среди актуальных версий браузеров.

О поддержке HTTP/2 в NGINX


HTTP/2 является новым протоколом, поэтому существуют некоторые опасения и непонимания связанные с ним. Одним из основных опасений является то, что для внедрения поддержки HTTP/2 требуется изменение архитектуры всего приложения. Это опасение и многие другие, связанные с HTTP/2, беспочвенны. На самом деле, для приложений, использующих NGINX, поддержка HTTP/2 реализуется с помощью незначительных изменений архитектуры.

Для облегчения перехода к новому протоколу NGINX действует как “HTTP/2 шлюз”. На стороне клиента NGINX общается с браузерами через HTTP/2 (если для браузера реализована поддержка HTTP/2), а на стороне сервера через HTTP/1.x (или FastCGI, uwsgi, SCGI) как раньше. В промежутке между клиентом и бекендом NGINX преобразует HTTP/2 в HTTP/1.x (или FastCGI, и т.д.). Иными словами, сервера и приложения, проксируемые через NGINX, не требуют изменений для перехода на HTTP/2. Единственным необходимым изменением существующих HTTPS конфигураций будет добавление параметра http2 к директивам listen (ssl параметр также необходим):

listen 443 ssl http2 default_server;

На июнь 2015 года более 50% пользователей используют браузеры с поддержкой HTTP/2. Другими словами, реализация HTTP/2 браузерами довольно высокая и будет увеличиваться с течением времени. Для одновременной работы HTTP/1.x и HTTP/2 в NGINX используется Application Layer Protocol Negotiation (ALPN), являющийся расширением TLS. При подключении браузера к серверу посылается список поддерживаемых протоколов. Если в списке есть h2, то NGINX использует HTTP/2 для соединения. Если в браузере не реализована поддержка ALPN или в списке поддерживаемых протоколов нет h2, то NGINX будет использовать HTTP/1.x.

Как вы могли догадаться, часть оптимизаций для HTTP/1.x теперь являются антипаттернами для HTTP/2. Такие оптимизации как использование спрайтов, объединение или инлайнинг картинок, а также разделение ресурсов между доменами, которые помогали при использовании HTTP/1.x, больше не нужны с HTTP/2. Вы, конечно, можете внедрить HTTP/2 используя эти оптимизации, но мы настоятельно рекомендуем избавиться от них для увеличения производительности.

Сборка NGINX c HTTP/2


  1. Устанавливаем OpenSSL версии 1.0.2 или новее, необходимый для поддержки ALPN.
  2. Скачиваем и распаковываем NGINX версии 1.9.0 или новее:
    $ wget http://nginx.org/download/nginx-1.9.3.tar.gz
    $ tar zxvf nginx-1.9.3.tar.gz
    $ cd nginx-1.9.3

  3. Скачиваем патч:
    $ wget http://nginx.org/patches/http2/patch.http2.txt

  4. Проверяем возможность применения патча:
    $ patch -p1 --dry-run < patch.http2.txt

  5. Если ошибок нет – применяем:
    $ patch -p1 < patch.http2.txt

  6. Конфигурируем NGINX с необходимыми опциями:
    • для сборки NGINX вместе с OpenSSL из исходников и статической линковки:
      $ ./configure --with-http_ssl_module \
                    --with-http_v2_module \
                    --with-debug \
                    --with-openssl=/path/to/openssl-1.0.2 \
                    ...
    • если OpenSSL установлен как сторонняя библиотека (например в Mac OS X):
      $ ./configure --with-http_ssl_module \
                    --with-http_v2_module \
                    --with-debug \
                    --with-cc-opt="-I/opt/local/include" \
                    --with-ld-opt="-L/opt/local/lib" \
                    ...

  7. После этого собираем NGINX:
    $ make

Настройка NGINX


Для включения поддержки HTTP/2 добавьте параметры ssl и http2 к директивам listen:
server {
    listen 443 ssl http2 default_server;

    ssl_certificate     server.crt;
    ssl_certificate_key server.key;
    ...
}

Замечание: параметр ssl является обязательным. На момент написания статьи в браузерах не реализована поддержка HTTP/2 без SSL шифрования.

Для проверки работоспособности HTTP/2 есть неплохие плагины для Google Chrome и Firefox.

Замечания


Как это бывает с ранними релизами, есть некоторое количество проблем:

  • Патч находится в состоянии ранней альфы и может использоваться только для тестирования. В данное время над модулем ведется активная работа и мы будем благодарны всем, кто примет участие в тестировании (результаты можно прислать в nginx-devel).
  • 'Server Push' не реализован в этой версии патча и не будет поддержан в первой рабочей реализации HTTP/2. Возможно, данный функционал появиться в следующих версиях NGINX.
  • Патч удаляет модуль SPDY и заменяет его модулем HTTP/2. То есть после применения данного патча настроить NGINX с использованием SPDY не удастся. Это также будет сделано в первой рабочей версии HTTP/2 для коммерческой и некоммерческой версий. SPDY объявят устаревшим в начале 2016 г., поэтому нет необходимости поддерживать обе директивы.

Особые благодарности


NGINX, Inc. выражает благодарность компаниям Dropbox и Automattic, которые являются активными пользователями NGINX и участвуют в спонсировании разработки. Их вклад ускорил создание HTTP/2 модуля и мы надеемся, что у вас в свою очередь будет возможность поддержать их.

UPD: Поддержка HTTP2 уже добавлена в open-source версию NGINX. Все желающие могут скачать исходники.
Tags:
Hubs:
+30
Comments 25
Comments Comments 25

Articles