Блогът на Петко
False Hopes

nginx и HTTP/2

Петко Борджуков

От версия 1.9.5 nginx има експериментална поддръжка за HTTP/2. Време е за проба.

HTTP/2

Без да навлизам в детайли (защото HTTP/2 in a nutshell си е отделен дълъг блог пост), на високо ниво, HTTP/2 се различава от HTTP/1.x по:

Повече информация може да бъде открита тук: https://http2.github.io/faq/#general-questions

Поддръжката от страна на браузърите е изненадващо добра, както може да бъде видяно тук: http://caniuse.com/#feat=http2.

Дългото очакване

HTTP/2 беше окончателно стандартизиран през май тази година, но имплементацията в nginx отне доста време.

Изненадващо, през август се появи алфа версия на patch, който да въведе HTTP/2 функционалнст. Този patch напълно премахва SPDY и го замества с новата версия на HTTP. Това дойде изневиделица за някои, но същата политика налага и Chromium, месеци по-рано. Честно казано бързото пенсиониране на протоколи доста ми харесва.

Mainline версия на nginx с HTTP/2 поддръжка се появява през октомври, като в блог пост авторите описват особеностите около имплементацията.

Конфигурация на nginx

Конфигурацията на HTTP/2 на пръв поглед по нищо не се различава от тази на SPDY – просто се добавя http2 в listen директивата в даден server блок.

server {
    listen 443 ssl http2 default_server;

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

НО

Има една основна разлика – HTTP/2 дефинира черен списък от комплекти от шифри, които не могат да бъдат използвани. Този списък е доста обширен, за да го обобщя – може да се използват само AEAD шифри с ефимерна обмяна на ключове. В противен случай Firefox и Chromium отказват да отворят сайта. Chromium с грешка INADEQUATE_SECURITY, а Firefox – без грешка – дори в конзолата.

Може би би било добра идея nginx да изписва грешка или предупреждение, че се използват непозволени шифри, но това е друг въпрос.

Низът от шифри, който използвам за https://petko.me е следният:

ssl_ciphers "ECDH+aRSA+AESGCM:EDH+aRSA+AESGCM";