Релиз nginx 1.12.0

2 месяца ago admin 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%).

Релиз nginx 1.12.0

В соответствии с мартовским отчетом компании 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:0x00ff;
      • $ssl_curves — возвращает список кривых, поддерживаемых клиентом. Известные кривые указаны по имени, неизвестные указаны в шестнадцатеричном виде, например: 0x001d: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.

  • Source: pirates.in.ua