[Перевод] Опубликована тестовая версия модуля 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
- Устанавливаем OpenSSL версии 1.0.2 или новее, необходимый для поддержки ALPN.
- Скачиваем и распаковываем 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
- Скачиваем патч:
$ wget http://nginx.org/patches/http2/patch.http2.txt
- Проверяем возможность принимения патча:
$ patch -p1 --dry-run < patch.http2.txt
- Если ошибок нет — применяем:
$ patch -p1 < patch.http2.txt
- Конфигурируем 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" \ ...
- если OpenSSL установлен в конкретную папку:
- Собираем и устанавливаем 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 модуля и мы надеемся, что у вас в свою очередь будет возможность поддержать их.