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

Представлена альфа версия патча, обеспечивающего поддержку 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 gateway». На стороне клиента 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 используя эти оптимизации, но мы настоятельно рекомендуем избавиться он них для увеличения производительности 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 с необходимыми опциями:
    • если 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
    $ make install
    


Настройка 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 шифрования.

После добавления директив перезапустите NGINX, выполнив:

$ service nginx reload


Для проверки работоспособности 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 модуля и мы надеемся, что у вас в свою очередь будет возможность поддержать их.

© Habrahabr.ru