После года разработки представлена новая стабильная ветка высокопроизводительного 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%).
В соответствии с мартовским отчетом компании 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" можно указывать несколько раз;
- Добавлена возможность ограничения максимального числа соединений к upstream-серверам. Для задания лимита для директивы server в блоке upstream представлен параметр max_conns;
- С движка nginScript (ngx_http_js_module), предоставляющего средства для выполнения скриптов, написанных на языке JavaScript, снят флаг экспериментальной разработки. nginScript теперь позиционируется как штатная возможность для обработки запросов на стороне сервера;
- Добавлена новая директива absolute_redirect, которая отвечает за абсолютное или относительное перенаправление в nginx;
- Добавлена директива "worker_shutdown_timeout", позволяющая задать время ожидания корректного завершения работы рабочих процессов. Если за указанное время рабочие процессы не успеют довести до конца обработку имеющихся запросов, то связанные с ними соединения будут закрыты принудительно;
- В скрипт configure добавлен сборочный параметр "--with-compat", предоставляющий средства для компиляции и динамической загрузки любых модулей в работающий экземпляр nginx, той же версии, без пересборки самого nginx;
- Новые модули:
- 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';
Изменения в директивах:
- В директивы "proxy_bind", "fastcgi_bind", "memcached_bind", "scgi_bind" и "uwsgi_bind" добавлен новый параметр "transparent", который позволяет указать нелокальный IP-адрес для использования в исходящих соединениях (IP Transparency, т.е. можно использовать IP клиента в исходящих соединениях). Например, можно указать реальный IP клиента - "proxy_bind $remote_addr transparent" и перенаправить запрос к прокси от адреса данного клиента. Для работы рабочие процессы nginx должны выполняться с правами root, а в системе нужно специальным образом настроить маршрутизацию для прозрачного проброса. Также поддерживается режим Direct Server Return (DSR), при котором обработчик, принявший запрос от имени клиента, возвращает ответ напрямую клиенту, минуя перенаправивший запрос nginx;
- В директиве "map" обеспечена возможность формирования результирующего значения, комбинируя несколько переменных. В map также добавлен новый параметр 'volatile', который создает некэшируемые переменные (по умолчанию директива map создает кэшируемые переменные);
- В директиву log_format добавлен новый параметр 'escape', который позволяет настроить экранирование символов json;
- Добавлены новые директивы 'proxy_cache_background_update', 'fastcgi_cache_background_update', 'scgi_cache_background_update' и 'uwsgi_cache_background_update', которые позволяют в фоновом режиме обновлять кэш. Фоновое обновление кэша позволяет продолжить отдавать клиентам из кэша просроченный, но ещё не вычищенный в процессе обновления, контент;
- В директивы "proxy_cache_path", "fastcgi_cache_path", "scgi_cache_path" и "uwsgi_cache_path" добавлены параметры manager_files, manager_threshold и manager_sleep, которые управляют поведением процесса cache manager, осуществляющего чистку кэша;
- В директиву server_tokens, добавлен новый параметр build, отвечающий за отображение версии сборки nginx;
- В директивах proxy_bind, fastcgi_bind, memcached_bind, scgi_bind и uwsgi_bind теперь можно указывать номер сетевого порта.
- По умолчанию выключена директива accept_mutex, определяющая метод уведомления рабочих процессов о поступлении новых соединений ("on" - по очереди, "off" - все разом);
- В директиве '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 при котором запрос будет передан следующему серверу;
Изменения в модулях:
- В модуле 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 - возвращает число дней, оставшихся до истечения срока действия клиентского сертификата.
Разное:
При использовании 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.
|