Выпуск nginx 1.30.0 и форка FreeNginx 1.30.0

После года разработки опубликована новая стабильная ветка высокопроизводительного HTTP-сервера и многопротокольного прокси-сервера nginx 1.30.0, которая вобрала в себя изменения, накопленные в основной ветке 1.29.x. В дальнейшем все изменения в стабильной ветке 1.30 будут связаны с устранением серьёзных ошибок и уязвимостей. В скором времени будет сформирована основная ветка nginx 1.31, в которой будет продолжено развитие новых возможностей. Для обычных пользователей, у которых нет задачи обеспечить совместимость со сторонними модулями, рекомендуется использовать основную ветку, на базе которой раз в три месяца формируются выпуски коммерческого продукта Nginx Plus. Код nginx написан на языке Си и распространяется под лицензией BSD.

В соответствии с февральским отчётом компании Netcraft под управлением nginx работает около 321 млн сайтов (год назад 245 млн, два года назад — 243 млн, три года назад 289 млн). 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), позволяющего доставлять пакеты одновременно по нескольким маршрутам через разные сетевые интерфейсы. Для включения в директиву «listen» добавлен параметр «multipath«.
  • Добавлена возможность привязки сеансов клиентов к одним и тем же серверам в группе. Доступно три метода: «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.

Источник: http://www.opennet.ru/opennews/art.shtml?num=65207