След една година разработка, публикувана е новата стабилна версия на високопроизводителния HTTP сървър и многопротоколния прокси сървър nginx 1.30.0, която включва промените, натрупани в основната версия 1.29.x. В бъдеще всички промени в стабилната версия 1.30 ще бъдат насочени към отстраняване на сериозни грешки и уязвимости. Скоро ще бъде създадена основната версия nginx 1.31, в която ще продължи развитието на нови възможности. За обикновените потребители, които нямат задача да осигурят съвместимост с външни модули, се препоръчва да използват основната версия, на базата на която на всеки три месеца се издават версии на търговския продукт Nginx Plus. Кодът на nginx е написан на езика C и се разпространява под лиценз BSD.
Според февруарския доклад на компанията Netcraft, около 321 млн. сайта (преди година 245 млн., преди две години - 243 млн., преди три години 289 млн.) функционират под nginx. Nginx се използва на 16.08% от всички активни сайтове (преди година 17.89%, преди две години 18.15%, преди три години 18.94%), което му осигурява второ място по популярност в тази категория (дял на Apache 13.27% (преди година 16.03%, преди две години 20.09%, преди три години 20.52%), Cloudflare - 20.62% (17.81%, 14.12%, 11.32%), Google - 10.65% (9.89%, 10.41%, 9.89%).
При разглеждане на всички сайтове nginx запазва лидерството си и заема 22.65% от пазара (преди година 20.48%, преди две години - 22.31%, преди три години - 25.94%), докато дялът на Apache е 12.19% (16.03%, 20.17%, 20.58%), Cloudflare - 15.27% (12.87%, 11.24%, 10.17%), OpenResty (платформа на базата на nginx и LuaJIT) - 8.01% (9.36%, 7.93%, 7.94%).
Сред милиона най-посещавани сайтове в света, nginx заема второ място с дял от 19.85% (преди година 20.37%, преди две години 20.63%, преди три години 21.37%). Първото място заема Cloudflare - 26.84% (22.32%, 22.59%, 21.62%). Дялът на Apache httpd е 15.84% (17.95%, 20.09%, 21.18%). 
Според данните на W3Techs, nginx се използва на 32.8% от сайтовете сред милиона най-посещавани (през април миналата година този показател беше 33.8%, а преди две години - 34.3%). Дялът на Apache за годината спадна от 26.3% до 23.9%, дялът на Microsoft IIS спадна от 4% до 3.4%, а дялът на Caddy от 0.3% до 0.2%. Дялът на Node.js нарасна от 4.4% до 6.0%, а дялът на LiteSpeed от 14.6% до 15.2%.
Най-забележимите подобрения, добавени в процеса на формирането на основната версия 1.29.x:
- Добавена е поддръжка на TLS-разширението ECH (Encrypted ClientHello), продължаващо развитието на разширението ESNI (Encrypted Server Name Indication) и използвано за криптиране на информация за параметрите на TLS-сесиите, такива като изисканото домейн име. Ключовата разлика между ECH и ESNI е, че в ECH цялото TLS-съобщение ClientHello се криптира, вместо да се криптират отделни полета, което позволява блокиране на изтичането на данни чрез полета, които не обхваща ESNI, например полето PSK (Pre-Shared Key). Използването на ECH се активира чрез указване в директивата "ssl_ech_file" файла с конфигурация ECHConfig в формат PEM. Поддръжката е налична при използване на сборки на OpenSSL с ECH.
- Добавлена поддержка протокола Multipath TCP (MPTCP), позволяющего передавать пакеты одновременно через несколько маршрутов по различным сетевым интерфейсам. Для активации добавлен параметр «multipath» в директиву «listen».
- Добавена възможност за свързване на клиентските сесии към едни и същи сървъри в група. Достъпни са три метода: «cookie» — предаване на данни за избраното сървър чрез зададената Cookie; «route» — прокси сървърът задава маршрут на клиента при получаване на първото запитване; «learn» — nginx анализира отговорите от upstream сървъра и запомня започнатите от сървъра сесии. За настройка на свързването в блока «upstream» на модула «http» е добавена директива «sticky», а в директивата «server» са добавени параметрите «route» и «drain».
- Добавена е директива «early_hints» и е реализирана поддръжка на HTTP код 103 в отговорите от proxy и gRPC бекенди. Код 103 позволява информиране на клиента за съдържанието на някои HTTP заглавия веднага след запитването, без да се чака сървърът да изпълни всички операции, свързани с запитването и да започне предаването на съдържанието. По подобен начин могат да се съобщават подсказки за елементите, свързани с предаваната страница, които могат да бъдат предварително заредени (например, могат да се предоставят линкове към използваните на страницата css и javascript). Получавайки информация за подобни ресурси, браузърът започва да ги зарежда, без да чака завършването на предаването на основната страница, което позволява да се намали общото време за обработка на запитването.
- Добавени са директивите add_header_inherit и add_trailer_inherit, които позволяват промяна на правилата за наследяване на стойностите, посочени в директивите add_header и add_trailer. Параметърът „off“ отменя наследяването на стойности, а параметърът „merge“ включва добавянето на стойности от предишното ниво към стойностите на текущото ниво.
- Добавена е директива «ssl_certificate_compression» за управление на компресията TLS-сертификати.
- Добавена е директива max_headers, която ограничава максималния брой HTTP заглавия в запитването. При превишаване на лимита се връща грешка 400 (Bad Request). Възможността е пренесена от FreeNginx.
- Добавени са променливите $request_port и $is_request_port. Първата променлива съдържа номера на порта от компонента URI или от заглавката „Host“, а втората съдържа „:“, ако променливата $request_port не е празна.
- Добавени са променливите $ssl_sigalg и $ssl_client_sigalg, които съдържат наименованието на алгоритъма за генериране на цифров подпис за TLS-свързване.
- В директивата «geo» е добавен параметър «volatile», който изключва кеширането на променливата. Разрешено е използването на маски в директивата «include», посочена в блока «geo».
- В блока «upstream» е активирана по подразбиране директивата «keepalive». В директивата «keepalive», използвана в блока «upstream», е добавен параметър «local». При задаване на този параметър, вместо общо използване на едно свързване към общия upstream сървър, споменат в различни блокове location и server, за всеки блок се поддържа отделно свързване към upstream.
- При използване в прокси режим по подразбиране е зададена версия на протокола HTTP/1.1 с включен режим keep-alive (в модула ngx_http_proxy_module по подразбиране е активирана поддръжката на keep-alive и е зададена стойността «1.1» в директивата «proxy_http_version» и спирането на изпращането по подразбиране на заглавието «Connection».)
- В модула ngx_http_proxy е добавена поддръжка на протокола HTTP/2, което позволява използването на HTTP/2 при достъп до бекендите.
- Предоставена възможност за качване на криптографски ключове от хардуерни токени, използвайки библиотеката OpenSSL като доставчик.
- В реализацията на протокола QUIC е добавена поддръжка на режима 0-RTT, наличен в системи с OpenSSL 3.5.1 и по-нови версии.
- Добавена е възможността за компилиране с криптографската библиотека AWS-LC, развивана от компания Amazon.
- По подразбиране е деактивирано компресирането на сертификатите TLSv1.3.
- Обезпечена е съвместимост с библиотеката OpenSSL 4.0.
Допълнително може да се отбележи публикуването на версия на проекта FreeNginx 1.30.0, развиващ форк на Nginx. Разработката на форка се води от Максим Дунин, един от ключовите разработчици на Nginx. FreeNginx се позиционира като некомерсиален проект, осигуряващ разработката на кодовата база на Nginx без корпоративна намеса. Кодът на FreeNginx продължава да се предоставя под лицензия BSD. Сред промените в клона FreeNginx 1.30: добавена е поддръжка на TLS разширението ECH (Encrypted Client Hello); подобрена е обработката на директивата limit_rate; добавени са директивите send_min_rate и client_body_min_rate; реализирана е възможност за ограничаване на броя на съединенията и интензивността на заявките в пощенския прокси; добавена е поддръжка на GeoIP2 база данни в GeoIP модула; засилена е защитата на XSLT модула.
Източник: opennet.ru
