nginx и HTTP/2
От версия 1.9.5 nginx има експериментална поддръжка за HTTP/2. Време е за проба.
HTTP/2
Без да навлизам в детайли (защото HTTP/2 in a nutshell си е отделен дълъг блог пост), на високо ниво, HTTP/2 се различава от HTTP/1.x по:
- това, че е двоичен, вместо текстов
- предоставя мултиплексиране, вместо доставяне на данните под ред и с блокиране
- може да използва една(!) TCP връзка за паралелизъм (заради мултиплексирането)
- използва компресия на хедърите
- позволява на сървърите да изпращат (push) проактивно отговори в кешовете на клиентите (тази функционалност все още не е имплементирана в nginx)
Повече информация може да бъде открита тук: 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";