После года разработки опубликована новая стабильная ветка высокопроизводительного HTTP-сервера и многопротокольного прокси-сервера nginx 1.28.0, которая вобрала в себя изменения, накопленные в основной ветке 1.27.x. В дальнейшем все изменения в стабильной ветке 1.28 будут связаны с устранением серьёзных ошибок и уязвимостей. В скором времени будет сформирована основная ветка nginx 1.29, в которой будет продолжено развитие новых возможностей. Для обычных пользователей, у которых нет задачи обеспечить совместимость со сторонними модулями, рекомендуется использовать основную ветку, на базе которой раз в три месяца формируются выпуски коммерческого продукта Nginx Plus.
В соответствии с мартовским отчётом компании Netcraft под управлением nginx работает около 245 млн сайтов (год назад 243 млн, два года назад 289 млн). Nginx используется на 17.89% всех активных сайтов (год назад 18.15%, два года назад 18.94%), что соответствует первому месту по популярности в данной категории (доля Apache соответствует 16.03% (год назад 20.09%, два года назад 20.52%), Cloudflare – 17.81% (14.12%, 11.32%), Google – 9.89% (10.41%, 9.89%).
При рассмотрении всех сайтов nginx сохраняет лидерство и занимает 20.48% рынка (год назад 22.31%, два года назад – 25.94%), в то время как доля Apache соответствует 16.03% (20.17%, 20.58%), Cloudflare – 12.87% (11.24%, 10.17%), OpenResty (платформа на базе nginx и LuaJIT) – 9.36% (7.93%, 7.94%).
Среди миллиона самых посещаемых сайтов в мире nginx занимает второе место с долей 20.37% (год назад 20.63%, два года назад 21.37%). Первое место удерживает Cloudflare – 22.32% (год назад 22.59%, два года назад 21.62%). Доля Apache httpd – 17.95% (20.09%, 21.18%).
По данным W3Techs nginx используется на 33.8% сайтов из миллиона самых посещаемых (в апреле прошлого года этот показатель составлял 34.3%, позапрошлого – 34.5%). Доля Apache за год снизилась с 30.1% до 26.3%, а доля Microsoft IIS снизилась с 5% до 4%. Доля Node.js увеличилась с 3.2% до 4.4%, а доля LiteSpeed с 12.9% до 14.6%.
Наиболее заметные улучшения, добавленные в процессе формирования основной ветки 1.27.x:
- Для соединений, использующих протокол QUIC, добавлена поддержка алгоритма управления сетевой перегрузкой CUBIC (RFC 9438), работа которого сводится к постепенному увеличению размера окна перегрузки до появления потери пакетов, после чего размер окна откатывается на значение до начала потери. В проведённых тестах использование CUBIC позволило сократить время передачи файла размером 500МБ на 24% при задержках 40ms и BDP 750K (Bandwidth Delay Product) и на 73% при задержках 100ms и BDP 9M.
- В модуль stream добавлена поддержка проверки отзыва сертификатов клиентов, используя протокол OCSP (Online Certificate Status Protocol).
- В модуле stream реализована поддержка техники проверки отзыва сертификатов OCSP Stapling, суть которой в том, что при согласовании TLS-соединения заверенный удостоверяющим центром ответ OCSP передаётся сервером, обслуживающим сайт, без необходимости прямого обращения к удостоверяющему центру).
- При запуске и обновлении конфигурации реализовано кэширование SSL-сертификатов, ключей и CRL (Certificate Revocation List).
- Добавлены возможности для снижения потребления ресурсов и уменьшения нагрузки на CPU при использовании TLS в конфигурациях с большим числом блоков server и location. Добавленные изменения позволяют вместо создания для каждого блока конфигурации отдельного контекста SSL (SSL_CTX в OpenSSL), использовать уже имеющийся контекст SSL из родительского блока.
- В директиве “ssl_client_certificate” обеспечена поддержка сертификатов с дополнительной информацией.
- Для проверки клиентских SSL-сертификатов директива “ssl_client_certificate” теперь не является обязательной.
- В модуль ngx_mail_proxy_module добавлена поддержка специфичного для SmarterMail режима IMAP LOGIN с нетегированным ответом CAPABILITY.
- В модуль ngx_http_proxy_module добавлена директива “proxy_pass_trailers“, разрешающая передачу полей заголовков в конце ответа от проксируемого сервера к клиенту.
- В директиву “server“, используемую в блоке “upstream“, добавлена поддержка параметра “resolve”, включающего отслеживание изменения IP-адреса для используемого доменного имени и автоматическое обновление конфигурации блока “upstream” без необходимости перезапуска nginx в случае изменения адреса.
- Добавлена возможность использования переменных в директивах “proxy_limit_rate”, “fastcgi_limit_rate”, “scgi_limit_rate” и “uwsgi_limit_rate”.
- В директивах “proxy_bind”, “fastcgi_bind”, “grpc_bind”, “memcached_bind”, “scgi_bind” и “uwsgi_bind”, а также в качестве адреса клиента в модуле ngx_http_realip_module разрешено указание IPv6-адресов в квадратных скобках без номера порта.
- Добавлена директива “keepalive_min_timeout“, определяющая таймаут, в течение которого nginx не будет закрывать keep-alive соединение с клиентом.
- По умолчанию отключены протоколы TLSv1 и TLSv1.1.
- Решены проблемы с долгой загрузкой файлов конфигурации из-за повторного разбора одного и того же набора TLS-сертификатов, ключей и списков удостоверяющих центров. Ускорена перезагрузка конфигурации за счёт повторного использования не изменившихся TLS-объектов, таких как сертификаты, ключи и CRL. Для отключения наследования объектов при обновлении конфигурации добавлена директива “ssl_object_cache_inheritable“.
- Добавлен кэш для сертификатов и ключей, загруженных с использованием переменных в директивах (например, “ssl_certificate /etc/ssl/$ssl_server_name.crt”). Для управления кэшем добавлены директивы “ssl_certificate_cache“, “proxy_ssl_certificate_cache“, “grpc_ssl_certificate_cache” и “uwsgi_ssl_certificate_cache“. Через указанные директивы можно настроить максимальный размер кэша, время действия записей и время очистки невостребованных записей. Например: “ssl_certificate_cache max=1000 inactive=20s valid=1m;”.
- Снижено потребление памяти при обработке долгоживущих запросов в конфигурациях, в которых используются директивы “gzip”, “gunzip”, “ssi”, “sub_filter” или “grpc_pass”.
- Максимальный размер кэшируемых в разделяемой памяти сеансов SSL увеличен до 8192.
- Налажена сборка с Си-библиотекой Musl.
- Проведена работа по оптимизации производительности и устранению ошибок в реализации HTTP/3.
Дополнительно можно отметить публикацию релиза проекта FreeNginx 1.28.0, развивающего форк Nginx. Разработку форка ведёт Максим Дунин, один из ключевых разработчиков Nginx. FreeNginx позиционируется как некоммерческий проект, обеспечивающий разработку кодовой базы Nginx без корпоративного вмешательства. Среди специфичных изменений в ветке FreeNginx 1.28:
- Параметр “off” в директиве “pid”, отключающий создание PID-файла.
- Ограничение интенсивности записи сообщений в лог ошибок для защиты от заполнения лога типовыми сообщениями.
- Реализация параметра multipath в директиве listen для поддержки Multipath TCP.
- Поддержка HTTP-заголовка “Age” для определения времени жизни записей к кэше.
- Добавление методов аутентификации XOAUTH2 и OAUTHBEARER в модуль mail_proxy.