Релиз HTTP-сервера nginx 1.12.0

После года разработки представлена новая стабильная ветка высокопроизводительного HTTP-сервера nginx 1.12.0, которая вобрала в себя изменения, накопленные в рамках основной ветки 1.11.x. В дальнейшем все изменения в стабильной ветке 1.12 будут связаны с устранением серьёзных ошибок и уязвимостей. В скором времени будет сформирована основная ветка nginx 1.13, в рамках которой будет продолжено развитие новых возможностей. Для обычных пользователей, у которых нет задачи обеспечить совместимость со сторонними модулями, рекомендуется использовать основную ветку, на базе которой раз в три месяца формируются выпуски коммерческого продукта Nginx Plus.

По данным W3Techs 33.3% из миллиона самых посещаемых сайтов в мире используют nginx, в апреле прошлого года этот показатель составлял 29.8%, позапрошлого — 23.8%. Доля Apache впервые опустилась ниже 50%, а доля Microsoft IIS составила 11.3%. Если рассматривать только 10 тысяч наиболее крупных сайтов, то доля nginx составляет 39.7%, а Apache — 42.8%. В России nginx используется на 76.9% самых посещаемых сайтов (год назад — 75.2%).

0_1492012210.png

В соответствии с мартовским отчетом компании Netcraft nginx используется на 19.55% (год назад 16.81%, два года назад 14.24%) всех активных сайтов, что соответствует третьему месту по популярности в данной категории (доля Apache соответствует 41.06%, а Microsoft IIS — 24.46% (доля IIS выросла за счёт парковки неиспользуемых доменов)). Доля nginx среди всех сайтов составляет 19.91% (год назад 13.23%, два года назад 14.87%), среди миллиона самых посещаемых сайтов в мире — 25.64% (год назад 25.64%, два года назад 21.43%). В настоящее время под управлением nginx работает около 350 млн сайтов (год назад 143 млн).

Из улучшений, добавленных в процессе формирования основной ветки 1.11.x, можно отметить:

  • Обеспечена возможность указания нескольких SSL-сертификатов разных типов. Для загрузки сертификатов разных типов (RSA, ECDSA) директивы «ssl_certificate» и «ssl_certificate_key» можно указывать несколько раз;
  • Добавлена возможность ограничения максимального числа соединений для директивы server в блоке upstream, через указание параметра max_conns;
  • Добавлена новая директива absolute_redirect, которая отвечает за абсолютное или относительное перенаправление в nginx;
  • Добавлена директива «worker_shutdown_timeout», позволяющая задать время ожидания корректного завершения работы рабочих процессов. Если за указанное время рабочие процессы не успеют довести до конца обработку имеющихся запросов, то связанные с ними соединения будут закрыты принудительно;
  • Новые модули:
  • ngx_stream_map_module, позволяющий создавать переменные, значения которых зависят от значений других переменных;
  • ngx_stream_return_module, который даёт возможность отправить заданное значение клиенту и после этого закрыть соединение;
  • ngx_stream_geo_module, позволяющий создавать переменные, значения которых зависят от IP-адреса клиента;
  • ngx_stream_geoip_module, позволяющий создавать переменные, значения которых зависят от IP-адреса клиента, используя готовые базы MaxMind для привязки диапазонов адресов к регионам;
  • ngx_stream_split_clients_module, позволяющий создавать переменные для A/B тестирования (также известного как «split-тестирование»);
  • ngx_stream_log_module, позволяющий записывать логи сессий в указанном формате;
  • ngx_stream_realip_module, позволяющий менять адрес и порт клиента на переданные в заголовке протокола PROXY;
  • ngx_stream_ssl_preread_module, позволяющий извлекать информацию из сообщения ClientHello без терминирования SSL/TLS, например можно получить имя сервера, запрошенное через SNI;
Новые переменные: $request_id, в которой содержится уникальный идентификатор запроса; $proxy_protocol_port, содержащая номер клиентского сетевого порта, указанного в заголовке протокола PROXY; $upstream_bytes_received, позволяющая получить число байт, полученных от сервера группы. Значения нескольких соединений разделяются запятыми и двоеточиями подобно адресам в переменной $upstream_addr; Формат переменных '$ssl_client_s_dn' и '$ssl_client_i_dn' приведён в соответствие с RFC 2253 (RFC 4514). Значения в старом формате доступны через переменные '$ssl_client_s_dn_legacy' и '$ssl_client_i_dn_legacy'; Изменения в модулях: В модуле ngx_http_image_filter_module добавлена поддержка формата WebP; В модуле stream добавлена возможность использования переменных и добавлена проверка клиентских SSL-сертификатов. Если сервер, описанный в блоке upstream, был признан неработающим, то после истечения fail_timeout он признавался работающим только после завершения тестового соединения, теперь достаточно чтобы соединение было успешно установлено; В модуле ngx_http_v2_module появилась директива «http2_max_requests», определяющая максимальное число запросов, которые можно сделать по одному соединению при использовании протокола HTTP/2; В модуле ngx_http_realip_module добавлена переменная $realip_remote_port, содержащая номер сетевого порта клиента, с которого было инициировано соединение; В модулях stream и ngx_stream_upstream_module добавлены новые переменные: $bytes_received — число байт, полученных от клиента; $session_time — длительность сессии в секундах с точностью до миллисекунд; $protocol — протокол, используемый для работы с клиентом: TCP или UDP; $status — статус сессии; $upstream_addr — хранит IP-адрес и порт или путь к UNIX-сокету сервера группы. Если при проксировании были сделаны обращения к нескольким серверам, то их адреса разделяются запятой, например »192.168.1.1:12345, 192.168.1.2:12345, unix:/tmp/sock»; $upstream_bytes_sent — число байт, переданных на сервер группы. Значения нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr; $upstream_bytes_received — число байт, полученных от сервера группы. Значения нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr; $upstream_connect_time — время установки соединения с сервером группы, время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr; $upstream_first_byte_time — время получения первого байта данных, время хранится в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr; $upstream_session_time — длительность сессии в секундах с точностью до миллисекунд. Времена нескольких соединений разделяются запятыми подобно адресам в переменной $upstream_addr. В модуле ngx_http_ssl_module добавлены новые переменные '$ssl_ciphers', '$ssl_curves',' $ssl_client_v_start', '$ssl_client_v_end' и '$ssl_client_v_remain': $ssl_ciphers — возвращает список шифров, поддерживаемых клиентом. Известные шифры указаны по имени, неизвестные указаны в шестнадцатеричном виде, например: AES128-SHA: AES256-SHA:0×00ff; $ssl_curves — возвращает список кривых, поддерживаемых клиентом. Известные кривые указаны по имени, неизвестные указаны в шестнадцатеричном виде, например: 0×001d: prime256v1: secp521r1: secp384r1; $ssl_client_v_start — возвращает дату начала срока действия клиентского сертификата; $ssl_client_v_end — возвращает дату окончания срока действия клиентского сертификата; $ssl_client_v_remain — возвращает число дней, оставшихся до истечения срока действия клиентского сертификата. Изменения в директивах: В директиве «map» обеспечена возможность формирования результирующего значения, комбинируя несколько ременных. В map также добавлен новый параметр 'volatile', который создает некэшируемые переменные (по умолчанию директива map создает кэшируемые переменные); В директиву log_format добавлен новый параметр 'escape', который позволяет настроить экранирование символов json; Добавлены новые директивы 'proxy_cache_background_update', 'fastcgi_cache_background_update', 'scgi_cache_background_update' и 'uwsgi_cache_background_update', которые позволяют обновлять кэш в подзапросах; В директиву server_tokens, добавлен новый параметр build, отвечающий за отображение версии сборки nginx; В директивы «proxy_bind», «fastcgi_bind», «memcached_bind», «scgi_bind» и «uwsgi_bind» добавлен новый параметр «transparent», который позволяет указать нелокальный IP-адрес для использования в исходящих соединениях. Например, можно указать реальный IP клиента — «proxy_bind $remote_addr transparent» и перенаправить запрос к прокси от адреса данного клиента. Для работы рабочие процессы nginx должны выполняться с правами root, а в системе нужно специальным образом настроить маршрутизацию для прозрачного проброса; В директивах proxy_bind, fastcgi_bind, memcached_bind, scgi_bind и uwsgi_bind теперь можно указывать номер сетевого порта. По умолчанию выключена директива accept_mutex, определяющая метод уведомления рабочих процессов о поступлении новых соединений («on» — по очереди, «off» — все разом); В директивы «proxy_cache_path», «fastcgi_cache_path», «scgi_cache_path» и «uwsgi_cache_path» добавлены параметры manager_files, manager_threshold и manager_sleep; В директиве 'proxy_method' добавлена поддержка переменных; Добавлены директивы 'proxy_cache_max_range_offset', 'fastcgi_cache_max_range_offset', 'scgi_cache_max_range_offset' и 'uwsgi_cache_max_range_offset'; В директиве ssl_session_ticket_key добавлена поддержка шифрования TLS session tickets с помощью AES256 при использовании с 80-байтными ключами; В директивы proxy_next_upstream, fastcgi_next_upstream, scgi_next_upstream и uwsgi_next_upstream добавлен новый параметр http_429, определяющий HTTP-код ответа 429 при котором запрос будет передан следующему серверу; Разное: При использовании OpenSSL 1.0.2 и новее через директиву «ssl_ecdh_curve» теперь можно указать список эллиптических кривых; Для использования шифров DHE отныне необходимо указать параметры DHE при помощи директивы «ssl_dhparam»; Добавлена проверка поддержки ядром событий EPOLLRDHUP, и при использовании механизма «epoll» включения соответствующих оптимизаций обработки соединений; Клиенты HTTP/2 теперь могут сразу отправлять тело запроса, не дожидаясь готовности сервера принять данные. Размер используемого при этом буфера можно установить через директиву «http2_body_preread_size». Упразднены параметры сборки »--with-md5» и »--with-sha1». Внутренние реализации MD5 и SHA1 теперь используются всегда; В заголовке ответа бэкенда, в строке «Cache-Control» добавлена поддержка расширений stale-while-revalidate и stale-if-error; При поддержке в системе опции сокета IP_BIND_ADDRESS_NO_PORT, она теперь применяется по умолчанию; На Linux-системах при вызове epoll задействован флаг EPOLLEXCLUSIVE; Временные файлы в каталоге кэша теперь располагаются не в отдельном подкаталоге, а в том же подкаталоге, что и остальные файлы; Добавлена поддержка кэширования ответов c заголовком Vary, длиной до 128 символов (вместо 42 символов в предыдущих версиях); В почтовом прокси-сервере добавлена поддержка метода аутентификации EXTERNAL.

© OpenNet