SlideShare a Scribd company logo
Что нового в
nginx?
Максим Дунин
Про ложь, наглую ложь и статистику
W3Techs:
0.x.x - 1.5%
1.x.x - 98.5%
https://w3techs.com/technologies/details/ws-nginx/all/all
“Nginx is used by 35.7% of all the websites whose web server we know.”
Подробнее про 1.x.x
Новое:
1.12.x - 42.0%
1.13.x - 6.1%
Старое:
1.10.x - 19.4%
1.8.x - 5.5%
1.6.x - 6.0%
1.4.x - 5.9%
42
19.4
6.1
6
5.9
5.5
1.12.x
1.10.x
1.13.x
1.6.x
1.4.x
1.8.x
1.11.x
Переменные в модуле stream, возможность "подсматривать" в SSL handshake, и множество всего ещё. Больше нет quick
recovery, но есть max_conns, а cache manager научился быть незаметным, proxy_bind теперь умеет transparent, и умеет
использовать IP_BIND_ADDRESS_NO_PORT. Мы выключили accept_mutex, научились использовать EPOLLEXCLUSIVE вместо
него, и начали полагаться на EPOLLRDHUP, map научился сложным значениям, переменная $request_id для злопамятных.
Теперь можно несколько SSL-сертификатов (наконец-то RSA и ECDSA одновременно!), умеем списки кривых для ECDH,
выключили DH, упростили сборку динамических модулей. Умеем писать логи в JSON (если пришлёте тягач), а для старых
рабочих процессов - добавили возможность задать таймаут на завершение. Кэш теперь понимает "Cache-Control: stale-while-
revalidate=300" в ответах и умеет обновляться в фоне, а перенаправления теперь не обязательно абсолютные.
Stream: балансировка соединений
stream {
upstream backend {
server 10.0.0.2:12345;
server 10.0.0.3:12345;
}
server {
listen 12345;
proxy_pass backend;
}
}
• 1.9.x
• Балансировка произвольных соединений
• SSL от клиентов, SSL к бэкендам
• Ограничения количества соединений и скорости
• PROXY protocol к бэкендам
• … и даже UDP
Stream: переменные
А также map, return, geo, geoip, split_clients, real ip, access log…
Теперь можно:
map $remote_addr $limit {
127.0.0.1 "";
default $binary_remote_addr;
}
limit_conn_zone $limit zone=addr:10m;
limit_conn addr 1;
Stream: клиентские SSL-сертификаты
Теперь проверять клиентские сертификаты умеет и stream:
ssl_verify_client on;
ssl_client_certificate /path/to/root;
Не прошедшие проверку соединения будут закрыты.
Результат проверки в $ssl_client_verify.
Stream: $ssl_preread_server_name
Если нужно посмотреть в SSL-соединение,
но нельзя снимать SSL:
map $ssl_preread_server_name $backend {
backend.example.com 192.0.2.1:12345;
default 192.0.2.2:12345;
}
server {
listen 12345;
proxy_pass $backend;
ssl_preread on;
}
Количество соединений к бэкендам
Пример:
upstream u {
server 192.0.2.1:8080 max_conns=10;
server 192.0.2.2:8080 max_conns=10;
server 192.0.2.3:8080 max_conns=10;
}
Исходно для NGINX Plus.
Transparent proxy
Передать адрес клиента, традиционные решения:
• X-Forwarded-For / X-Real-IP
• PROXY protocol
Если очень надо:
proxy_bind $remote_addr transparent;
SO_BINDANY (NetBSD), IP_TRANSPARENT (Linux), IP_BINDANY (FreeBSD),
нужен root
Linux и IP_BIND_ADDRESS_NO_PORT
Сколько соединений можно установить к одному бэкенду?
К двум?
А теперь пишем в конфиг:
proxy_bind 192.0.2.1;
и всё плохо. Почему?
• Bind() выбирает локальный порт
• IP_BIND_ADDRESS_NO_PORT (Linux 4.2, glibc 2.22)
Accept mutex, Linux и EPOLLEXCLUSIVE
Thundering herd problem.
Традиционный ответ – accept mutex.
Но:
• вообще-то у нас процессов мало
• часто мешает в тестах
• нельзя использовать на Windows
• не нужен с “listen … reuseport”
• на Linux появился EPOLLEXCLUSIVE (Linux 4.5, glibc 2.24)
Accept mutex, Linux и EPOLLEXCLUSIVE
Новый default:
accept_mutex off;
Ну и EPOLLEXCLUSIVE поддерживаем.
SSL и сертификаты
RSA – совместимо, но дорого
ECDSA – быстро, но не будет работать в XP (Android до 4.0, OpenSSL до 1.0.0)
rsa2048: 400 signs/s
ecdsap256: 5400 signs/s
Теперь можно так:
ssl_certificate example.com.rsa.crt;
ssl_certificate_key example.com.rsa.key;
ssl_certificate example.com.ecdsa.crt;
ssl_certificate_key example.com.ecdsa.key;
300
1000
ECDHE-RSA
ECDHE-ECDSA
SSL и переменные
• $ssl_ciphers
• “AES128-SHA:AES256-SHA:0x00ff”
• $ssl_curves
• “0x001d:prime256v1:secp521r1:secp384r1”
• $ssl_client_verify теперь содержит текст ошибки
• “FAILED:certificate has expired”
• $ssl_client_s_dn, $ssl_client_i_dn – теперь в формате RFC 4514
• $ssl_client_s_dn_legacy, $ssl_client_i_dn_legacy
• $ssl_client_v_start, $ssl_client_v_end
• “May 6 01:20:48 2017 GMT”
• $ssl_client_v_remain
• “12”
SSL и другое
• ssl_ecdh_curve умеет список кривых (OpenSSL 1.0.2+)
• “auto” по умолчанию
• OpenSSL 1.1.0: X25519:prime256v1:secp521r1:secp384r1
• ssl_dhparam по умолчанию отсутствует
• То есть DHE-шифры выключены
• Медленно
• Атаки на DHE, weakdh.org
• ssl_session_ticket_key умеет AES256
• Нужно использовать файлы размером 80 байт вместо 48
Динамические модули
Появились в 1.9.x.
Собрать:
./configure --add-dynamic-module=/path/to/module
make modules
Загрузить в nginx.conf:
load_module modules/ngx_my_cool_module.so;
Динамические модули: совместимость
Проблема:
• Cтруктуры зависят от опций сборки
• Собирать модули надо с теми же опциями
Теперь проще:
./configure --with-compat ...
./configure --with-compat --add-dynamic-module=/path/to/module
Бонус: совместимость с NGINX Plus.
Завершение старых рабочих процессов
Проблема:
• При обновлении конфигурации старые рабочие процессы
завершаются, когда все соединения будут закрыты
• WebSocket’ы, long-polling, stream – долго
Теперь можно так:
worker_shutdown_timeout 15m;
Cache: устаревшие ответы
Было:
proxy_cache_use_stale updating;
• Только из конфигурации
• Может использоваться очень старый ответ
Cache: устаревшие ответы
Теперь можно управлять заголовком Cache-Control:
HTTP/1.1 200 OK
Cache-Control: stale-while-revalidate=300
• RFC 5861
• Можно управлять с бэкенда
• Задаётся время, после которого ответ непригоден
• Для ошибок – stale-if-error
Сache: обновление в фоне
Если используется “proxy_cache_use_stale updating” или stale-
while-revalidate:
• Почти все получают ответ из кэша
• Один клиент ждёт бэкенда
proxy_cache_background_update on;
• Обновление в подзапросе
• Одновременно с возвратом ответа клиенту из кэша
• Если не успеет, то задержит следующие запросы в соединении
Cache: разное
• Поменяли “proxy_cache_path ... use_temp_path=off”
• Появилось в 1.7.10 вместе с переменными в proxy_cache,
переключаться между кэшами
• Теперь временные файлы создаются в том же каталоге, что и целевой
файл
• Иначе lock contention на Linux: rename() между каталогами берёт lock
на всю файловую систему
• Директива proxy_cache_max_range_offset
• Обычно скачиваем в кэш файл целиком, и отдаём range из него
• Запрет использования кэша для «далёких» range-запросов
Относительные перенаправления
• RFC 2616: только абсолютные URI в Location
• Location = "Location" ":" absoluteURI
• При необходимости nginx сам строит абсолютный URI
• server_name_in_redirect, port_in_redirect
• Но: относительные перенаправления обычно работают
• RFC 7231: можно относительные
• Location = URI-reference
• Директива absolute_redirect
Логгирование в JSON
log_format json_combined
'{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr”, '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": "$status", ’
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
Логгирование в JSON
log_format json_combined escape=json
'{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr”, '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": "$status", ’
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
Порт клиента
• set_real_ip_from теперь ставит не только адрес, но и порт
proxy_pass http://backend;
proxy_set_header X-Real-IP
$remote_addr:$remote_port;
• переменные $proxy_protocol_port,
$realip_remote_port
Разное
• На EPOLLRDHUP мы теперь полагаемся, если ядро новое
• HTTP/2 – исправления и улучшения
• Map научился сложным комбинациям переменных и строк
map $host $log {
~foo /var/log/$host.log;
default /var/log/default.log;
}
и обзавёлся параметром volatile
• Поддержка WebP в image_filter
• $request_id
Всё это доступно в nginx 1.12.2
1.13.x
Модуль mirror для анализа трафика, базовая поддержка TLS 1.3,
$ssl_client_escaped_cert, разрешили SSL renegotiation с бэкендами, в логах
теперь есть PID процесса, отправившего сигнал, появилась директива
add_trailer, а CPU affinity можно задавать на DragonFly BSD.
Mirror
Задача:
• Отправить запрос в дополнительное место
• Для анализа / сбора статистики / тестирования
Решение:
location / {
mirror /mirror;
proxy_pass http://real-backend;
}
location /mirror {
proxy_pass http://mirror-backend;
proxy_set_header X-Original-URI $request_uri;
}
Mirror: детали
• Работает с помощью background-подзапросов, как и обновление
кэша
• Переписали background-подзапросы
• Можно не читать тело
• mirror_request_body off;
• Заодно образовалась precontent-фаза
• Там try_files и mirror
• Можно встраивать свои модули
• Вычистили проблему с ранним освобождением тела в proxy_pass
• Вообще это оптимизация – зачем нам тело, если оно уже у бэкенда?
• Можно было наступить в SSI
SSL: основы TLS 1.3
• Full handshake – 1 RTT
• Не всегда, но обычно (если key_share клиента подходит)
• Ранее full handshake – 2 RTT, abbreviated handshake – 1 RTT
• Режим 0-RTT
• Но: без replay protection
• Стандарта ещё нет
• Middleboxes issue, 1.5% .. 3.4% error rate
• Datacenter monitoring - TEH DRAMMA
SSL: поддержка TLS 1.3
Теперь nginx понимает:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
• По умолчанию выключено
• Нужен OpenSSL 1.1.1 (not yet released), собранный с “enable-tls1_3”
• В браузерах Draft 18, в OpenSSL – Draft 21, нужна ветка "tls1.3-draft-18”
• Не будет работать session reuse с бэкендами, поправим
• Пока нет поддержки 0-RTT, в планах
SSL: разное
• теперь можно SSL renegotiation к бэкендам
• если ваш бэкенд очень хочет renegotiation
• переменная $ssl_client_escaped_cert
Разное
• В логах пишется PID процесса, отправившего сигнал
• Теперь worker_cpu_affinity работает на DragonFly BSD
• Базовая поддержка HTTP trailers и директива add_trailer
• Имена в set_real_ip_from
• В stream и mail – параметры rcvbuf и sndbuf у директивы
listen
Всё это доступно в nginx 1.13.6
Still counting
Где взять дене^Wсвежий nginx?
• Исходные коды, как обычно:
http://nginx.org/ru/download.html
• Для FreeBSD:
используйте порты nginx и nginx-devel, там всё новое
Спасибо Сергею Осокину!
• Для Linux разных версий:
системные пакеты – обычно старые, свежие пакеты доступны на
http://nginx.org/ru/linux_packages.html
(отдельные пакеты для модулей geoip, image filter, njs, perl, xslt)
Спасибо!
Вопросы?
Максим Дунин
mdounin@mdounin.ru

More Related Content

What's hot (20)

PDF
Механика DDoS (Александр Крижановский)
Ontico
 
PDF
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
Ontico
 
PPTX
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Ontico
 
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
PPTX
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Ontico
 
PDF
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Ontico
 
PPTX
Неочевидные детали при запуске HTTPS в OK.Ru / Андрей Домась (Одноклассники)
Ontico
 
PDF
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Ontico
 
PPTX
Спасение 6 млн файлов в условиях полного хецнера (Даниил Подольский, Дмитрий ...
Ontico
 
PPTX
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Ontico
 
PDF
Pconnect: граната в руках обезьяны (Сергей Аверин)
Ontico
 
PPTX
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
PDF
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Ontico
 
PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
PDF
Как превратить приложение в платформу
Vadim Kruchkov
 
PDF
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Ontico
 
PDF
05 - Web-технологии. Сетевые протоколы
Roman Brovko
 
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
PDF
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Ontico
 
PDF
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Ontico
 
Механика DDoS (Александр Крижановский)
Ontico
 
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
Ontico
 
«Секретные» технологии инвестиционных банков / Алексей Рагозин (Дойче Банк)
Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Настройка и оптимизация высоконагруженных J2EE веб-приложений / Шамим Ахмед (...
Ontico
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Ontico
 
Неочевидные детали при запуске HTTPS в OK.Ru / Андрей Домась (Одноклассники)
Ontico
 
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Ontico
 
Спасение 6 млн файлов в условиях полного хецнера (Даниил Подольский, Дмитрий ...
Ontico
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Ontico
 
Pconnect: граната в руках обезьяны (Сергей Аверин)
Ontico
 
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Ontico
 
Как и зачем создавать NginX-модуль — теория, практика, профит. Часть 2 / Васи...
Ontico
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Ontico
 
Как превратить приложение в платформу
Vadim Kruchkov
 
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Ontico
 
05 - Web-технологии. Сетевые протоколы
Roman Brovko
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
Настройка kubernetes: tips and tricks / Михаил Прокопчук (Avito)
Ontico
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Ontico
 

Viewers also liked (20)

PPTX
Искусство предсказания: как давать более точные оценки времени проекта / Андр...
Ontico
 
PDF
Database First! О распространённых ошибках использования РСУБД / Николай Само...
Ontico
 
PDF
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
Ontico
 
PDF
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Ontico
 
PDF
NoSQL Best Practices for PostgreSQL / Дмитрий Долгов (Mindojo)
Ontico
 
PDF
Развитие баз данных в Dropbox. Путь от одной глобальной базы MySQL к 6000 шар...
Ontico
 
PDF
Полнотекстовый поиск в PostgreSQL / Александр Алексеев (Postgres Professional)
Ontico
 
PDF
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Ontico
 
PPTX
Технологии хранения для больших проектов / Сергей Платонов (RAIDIX)
Ontico
 
PDF
Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtust...
Ontico
 
PDF
Как писать сервис, поддержка которого не превращается в ад / Антон Резников, ...
Ontico
 
PDF
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Ontico
 
PDF
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Ontico
 
PPTX
Как заранее соломки подстелить или путь к 99,99% uptime проекта / Игорь Мызги...
Ontico
 
PDF
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Ontico
 
PDF
Применение блокчейна в RTB. Можно ли масштабировать децентрализованную базу д...
Ontico
 
PPTX
Организации в бирюзовом цвете / Мария Груздева (НИУ ВШЭ)
Ontico
 
PPTX
Масштабирование сети VR-аттракционов CinemaVR / Андрей Татаринов (VRTech)
Ontico
 
PDF
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Ontico
 
PDF
Как мы сделали многопользовательскую браузерную игру для HL++ с воксельной гр...
Ontico
 
Искусство предсказания: как давать более точные оценки времени проекта / Андр...
Ontico
 
Database First! О распространённых ошибках использования РСУБД / Николай Само...
Ontico
 
BigMemory - работа с сотнями миллионов бизнес-объектов / Дмитрий Хмаладзе (Ag...
Ontico
 
Введение в блокчейн и алгоритмы консенсуса / Филипп Филиппак (Waves Platform)
Ontico
 
NoSQL Best Practices for PostgreSQL / Дмитрий Долгов (Mindojo)
Ontico
 
Развитие баз данных в Dropbox. Путь от одной глобальной базы MySQL к 6000 шар...
Ontico
 
Полнотекстовый поиск в PostgreSQL / Александр Алексеев (Postgres Professional)
Ontico
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Ontico
 
Технологии хранения для больших проектов / Сергей Платонов (RAIDIX)
Ontico
 
Cassandra для хранения метаданных: успехи и провалы / Андрей Смирнов (Virtust...
Ontico
 
Как писать сервис, поддержка которого не превращается в ад / Антон Резников, ...
Ontico
 
Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)
Ontico
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Ontico
 
Как заранее соломки подстелить или путь к 99,99% uptime проекта / Игорь Мызги...
Ontico
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Ontico
 
Применение блокчейна в RTB. Можно ли масштабировать децентрализованную базу д...
Ontico
 
Организации в бирюзовом цвете / Мария Груздева (НИУ ВШЭ)
Ontico
 
Масштабирование сети VR-аттракционов CinemaVR / Андрей Татаринов (VRTech)
Ontico
 
Сложности performance-тестирования / Андрей Акиньшин (JetBrains)
Ontico
 
Как мы сделали многопользовательскую браузерную игру для HL++ с воксельной гр...
Ontico
 
Ad

Similar to Что нового в nginx? / Максим Дунин (Nginx, Inc.) (20)

PDF
мои модули и патчи для Nginx. максим дунин. зал 1
rit2011
 
PPTX
Hosting for forbes.ru_
drupalconf
 
PDF
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
Ontico
 
PPS
Magento performance
aheadWorks
 
PDF
Другая виртуализация
Yandex
 
ODP
Nginx Igor Sysoev
Media Gorod
 
PPT
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
Alexander Frolov
 
PDF
Истинный DevOps. Секрет 42.
Nikita Borzykh
 
PPTX
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
ForkConf
 
PPTX
Net core and linux in production
Anatoly Popov
 
PDF
Практическое применение HTML5 в Я.Почте
Alexey Androsov
 
PPT
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
IT-Portfolio
 
PDF
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PavelKonotopov
 
PDF
Pconnect: граната в руках обезьяны
Sergey Xek
 
PPTX
SOA: Строим свой service mesh
Ivan Kruglov
 
PPTX
SOA: строим свой service mesh / Иван Круглов (Booking.com)
Ontico
 
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
PDF
08 - Web-технологии. Архитектура frontend-backend
Roman Brovko
 
PPT
Воюем за ресурсы (ZFConf2011)
Alexey Kachayev
 
мои модули и патчи для Nginx. максим дунин. зал 1
rit2011
 
Hosting for forbes.ru_
drupalconf
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
Ontico
 
Magento performance
aheadWorks
 
Другая виртуализация
Yandex
 
Nginx Igor Sysoev
Media Gorod
 
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
Alexander Frolov
 
Истинный DevOps. Секрет 42.
Nikita Borzykh
 
(1 часть) 1С-Битрикс. Как настроить двухуровневую конфигурацию веб-приложения...
ForkConf
 
Net core and linux in production
Anatoly Popov
 
Практическое применение HTML5 в Я.Почте
Alexey Androsov
 
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
IT-Portfolio
 
Building the Enterprise infrastructure with PostgreSQL as the basis for stori...
PavelKonotopov
 
Pconnect: граната в руках обезьяны
Sergey Xek
 
SOA: Строим свой service mesh
Ivan Kruglov
 
SOA: строим свой service mesh / Иван Круглов (Booking.com)
Ontico
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
08 - Web-технологии. Архитектура frontend-backend
Roman Brovko
 
Воюем за ресурсы (ZFConf2011)
Alexey Kachayev
 
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
PDF
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 

Что нового в nginx? / Максим Дунин (Nginx, Inc.)

  • 2. Про ложь, наглую ложь и статистику W3Techs: 0.x.x - 1.5% 1.x.x - 98.5% https://w3techs.com/technologies/details/ws-nginx/all/all “Nginx is used by 35.7% of all the websites whose web server we know.”
  • 3. Подробнее про 1.x.x Новое: 1.12.x - 42.0% 1.13.x - 6.1% Старое: 1.10.x - 19.4% 1.8.x - 5.5% 1.6.x - 6.0% 1.4.x - 5.9% 42 19.4 6.1 6 5.9 5.5 1.12.x 1.10.x 1.13.x 1.6.x 1.4.x 1.8.x
  • 4. 1.11.x Переменные в модуле stream, возможность "подсматривать" в SSL handshake, и множество всего ещё. Больше нет quick recovery, но есть max_conns, а cache manager научился быть незаметным, proxy_bind теперь умеет transparent, и умеет использовать IP_BIND_ADDRESS_NO_PORT. Мы выключили accept_mutex, научились использовать EPOLLEXCLUSIVE вместо него, и начали полагаться на EPOLLRDHUP, map научился сложным значениям, переменная $request_id для злопамятных. Теперь можно несколько SSL-сертификатов (наконец-то RSA и ECDSA одновременно!), умеем списки кривых для ECDH, выключили DH, упростили сборку динамических модулей. Умеем писать логи в JSON (если пришлёте тягач), а для старых рабочих процессов - добавили возможность задать таймаут на завершение. Кэш теперь понимает "Cache-Control: stale-while- revalidate=300" в ответах и умеет обновляться в фоне, а перенаправления теперь не обязательно абсолютные.
  • 5. Stream: балансировка соединений stream { upstream backend { server 10.0.0.2:12345; server 10.0.0.3:12345; } server { listen 12345; proxy_pass backend; } } • 1.9.x • Балансировка произвольных соединений • SSL от клиентов, SSL к бэкендам • Ограничения количества соединений и скорости • PROXY protocol к бэкендам • … и даже UDP
  • 6. Stream: переменные А также map, return, geo, geoip, split_clients, real ip, access log… Теперь можно: map $remote_addr $limit { 127.0.0.1 ""; default $binary_remote_addr; } limit_conn_zone $limit zone=addr:10m; limit_conn addr 1;
  • 7. Stream: клиентские SSL-сертификаты Теперь проверять клиентские сертификаты умеет и stream: ssl_verify_client on; ssl_client_certificate /path/to/root; Не прошедшие проверку соединения будут закрыты. Результат проверки в $ssl_client_verify.
  • 8. Stream: $ssl_preread_server_name Если нужно посмотреть в SSL-соединение, но нельзя снимать SSL: map $ssl_preread_server_name $backend { backend.example.com 192.0.2.1:12345; default 192.0.2.2:12345; } server { listen 12345; proxy_pass $backend; ssl_preread on; }
  • 9. Количество соединений к бэкендам Пример: upstream u { server 192.0.2.1:8080 max_conns=10; server 192.0.2.2:8080 max_conns=10; server 192.0.2.3:8080 max_conns=10; } Исходно для NGINX Plus.
  • 10. Transparent proxy Передать адрес клиента, традиционные решения: • X-Forwarded-For / X-Real-IP • PROXY protocol Если очень надо: proxy_bind $remote_addr transparent; SO_BINDANY (NetBSD), IP_TRANSPARENT (Linux), IP_BINDANY (FreeBSD), нужен root
  • 11. Linux и IP_BIND_ADDRESS_NO_PORT Сколько соединений можно установить к одному бэкенду? К двум? А теперь пишем в конфиг: proxy_bind 192.0.2.1; и всё плохо. Почему? • Bind() выбирает локальный порт • IP_BIND_ADDRESS_NO_PORT (Linux 4.2, glibc 2.22)
  • 12. Accept mutex, Linux и EPOLLEXCLUSIVE Thundering herd problem. Традиционный ответ – accept mutex. Но: • вообще-то у нас процессов мало • часто мешает в тестах • нельзя использовать на Windows • не нужен с “listen … reuseport” • на Linux появился EPOLLEXCLUSIVE (Linux 4.5, glibc 2.24)
  • 13. Accept mutex, Linux и EPOLLEXCLUSIVE Новый default: accept_mutex off; Ну и EPOLLEXCLUSIVE поддерживаем.
  • 14. SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать в XP (Android до 4.0, OpenSSL до 1.0.0) rsa2048: 400 signs/s ecdsap256: 5400 signs/s Теперь можно так: ssl_certificate example.com.rsa.crt; ssl_certificate_key example.com.rsa.key; ssl_certificate example.com.ecdsa.crt; ssl_certificate_key example.com.ecdsa.key; 300 1000 ECDHE-RSA ECDHE-ECDSA
  • 15. SSL и переменные • $ssl_ciphers • “AES128-SHA:AES256-SHA:0x00ff” • $ssl_curves • “0x001d:prime256v1:secp521r1:secp384r1” • $ssl_client_verify теперь содержит текст ошибки • “FAILED:certificate has expired” • $ssl_client_s_dn, $ssl_client_i_dn – теперь в формате RFC 4514 • $ssl_client_s_dn_legacy, $ssl_client_i_dn_legacy • $ssl_client_v_start, $ssl_client_v_end • “May 6 01:20:48 2017 GMT” • $ssl_client_v_remain • “12”
  • 16. SSL и другое • ssl_ecdh_curve умеет список кривых (OpenSSL 1.0.2+) • “auto” по умолчанию • OpenSSL 1.1.0: X25519:prime256v1:secp521r1:secp384r1 • ssl_dhparam по умолчанию отсутствует • То есть DHE-шифры выключены • Медленно • Атаки на DHE, weakdh.org • ssl_session_ticket_key умеет AES256 • Нужно использовать файлы размером 80 байт вместо 48
  • 17. Динамические модули Появились в 1.9.x. Собрать: ./configure --add-dynamic-module=/path/to/module make modules Загрузить в nginx.conf: load_module modules/ngx_my_cool_module.so;
  • 18. Динамические модули: совместимость Проблема: • Cтруктуры зависят от опций сборки • Собирать модули надо с теми же опциями Теперь проще: ./configure --with-compat ... ./configure --with-compat --add-dynamic-module=/path/to/module Бонус: совместимость с NGINX Plus.
  • 19. Завершение старых рабочих процессов Проблема: • При обновлении конфигурации старые рабочие процессы завершаются, когда все соединения будут закрыты • WebSocket’ы, long-polling, stream – долго Теперь можно так: worker_shutdown_timeout 15m;
  • 20. Cache: устаревшие ответы Было: proxy_cache_use_stale updating; • Только из конфигурации • Может использоваться очень старый ответ
  • 21. Cache: устаревшие ответы Теперь можно управлять заголовком Cache-Control: HTTP/1.1 200 OK Cache-Control: stale-while-revalidate=300 • RFC 5861 • Можно управлять с бэкенда • Задаётся время, после которого ответ непригоден • Для ошибок – stale-if-error
  • 22. Сache: обновление в фоне Если используется “proxy_cache_use_stale updating” или stale- while-revalidate: • Почти все получают ответ из кэша • Один клиент ждёт бэкенда proxy_cache_background_update on; • Обновление в подзапросе • Одновременно с возвратом ответа клиенту из кэша • Если не успеет, то задержит следующие запросы в соединении
  • 23. Cache: разное • Поменяли “proxy_cache_path ... use_temp_path=off” • Появилось в 1.7.10 вместе с переменными в proxy_cache, переключаться между кэшами • Теперь временные файлы создаются в том же каталоге, что и целевой файл • Иначе lock contention на Linux: rename() между каталогами берёт lock на всю файловую систему • Директива proxy_cache_max_range_offset • Обычно скачиваем в кэш файл целиком, и отдаём range из него • Запрет использования кэша для «далёких» range-запросов
  • 24. Относительные перенаправления • RFC 2616: только абсолютные URI в Location • Location = "Location" ":" absoluteURI • При необходимости nginx сам строит абсолютный URI • server_name_in_redirect, port_in_redirect • Но: относительные перенаправления обычно работают • RFC 7231: можно относительные • Location = URI-reference • Директива absolute_redirect
  • 25. Логгирование в JSON log_format json_combined '{ "time_local": "$time_local", ' '"remote_addr": "$remote_addr”, ' '"remote_user": "$remote_user", ' '"request": "$request", ' '"status": "$status", ’ '"body_bytes_sent": "$body_bytes_sent", ' '"request_time": "$request_time", ' '"http_referrer": "$http_referer", ' '"http_user_agent": "$http_user_agent" }';
  • 26. Логгирование в JSON log_format json_combined escape=json '{ "time_local": "$time_local", ' '"remote_addr": "$remote_addr”, ' '"remote_user": "$remote_user", ' '"request": "$request", ' '"status": "$status", ’ '"body_bytes_sent": "$body_bytes_sent", ' '"request_time": "$request_time", ' '"http_referrer": "$http_referer", ' '"http_user_agent": "$http_user_agent" }';
  • 27. Порт клиента • set_real_ip_from теперь ставит не только адрес, но и порт proxy_pass http://backend; proxy_set_header X-Real-IP $remote_addr:$remote_port; • переменные $proxy_protocol_port, $realip_remote_port
  • 28. Разное • На EPOLLRDHUP мы теперь полагаемся, если ядро новое • HTTP/2 – исправления и улучшения • Map научился сложным комбинациям переменных и строк map $host $log { ~foo /var/log/$host.log; default /var/log/default.log; } и обзавёлся параметром volatile • Поддержка WebP в image_filter • $request_id
  • 30. 1.13.x Модуль mirror для анализа трафика, базовая поддержка TLS 1.3, $ssl_client_escaped_cert, разрешили SSL renegotiation с бэкендами, в логах теперь есть PID процесса, отправившего сигнал, появилась директива add_trailer, а CPU affinity можно задавать на DragonFly BSD.
  • 31. Mirror Задача: • Отправить запрос в дополнительное место • Для анализа / сбора статистики / тестирования Решение: location / { mirror /mirror; proxy_pass http://real-backend; } location /mirror { proxy_pass http://mirror-backend; proxy_set_header X-Original-URI $request_uri; }
  • 32. Mirror: детали • Работает с помощью background-подзапросов, как и обновление кэша • Переписали background-подзапросы • Можно не читать тело • mirror_request_body off; • Заодно образовалась precontent-фаза • Там try_files и mirror • Можно встраивать свои модули • Вычистили проблему с ранним освобождением тела в proxy_pass • Вообще это оптимизация – зачем нам тело, если оно уже у бэкенда? • Можно было наступить в SSI
  • 33. SSL: основы TLS 1.3 • Full handshake – 1 RTT • Не всегда, но обычно (если key_share клиента подходит) • Ранее full handshake – 2 RTT, abbreviated handshake – 1 RTT • Режим 0-RTT • Но: без replay protection • Стандарта ещё нет • Middleboxes issue, 1.5% .. 3.4% error rate • Datacenter monitoring - TEH DRAMMA
  • 34. SSL: поддержка TLS 1.3 Теперь nginx понимает: ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; • По умолчанию выключено • Нужен OpenSSL 1.1.1 (not yet released), собранный с “enable-tls1_3” • В браузерах Draft 18, в OpenSSL – Draft 21, нужна ветка "tls1.3-draft-18” • Не будет работать session reuse с бэкендами, поправим • Пока нет поддержки 0-RTT, в планах
  • 35. SSL: разное • теперь можно SSL renegotiation к бэкендам • если ваш бэкенд очень хочет renegotiation • переменная $ssl_client_escaped_cert
  • 36. Разное • В логах пишется PID процесса, отправившего сигнал • Теперь worker_cpu_affinity работает на DragonFly BSD • Базовая поддержка HTTP trailers и директива add_trailer • Имена в set_real_ip_from • В stream и mail – параметры rcvbuf и sndbuf у директивы listen
  • 37. Всё это доступно в nginx 1.13.6 Still counting
  • 38. Где взять дене^Wсвежий nginx? • Исходные коды, как обычно: http://nginx.org/ru/download.html • Для FreeBSD: используйте порты nginx и nginx-devel, там всё новое Спасибо Сергею Осокину! • Для Linux разных версий: системные пакеты – обычно старые, свежие пакеты доступны на http://nginx.org/ru/linux_packages.html (отдельные пакеты для модулей geoip, image filter, njs, perl, xslt)

Editor's Notes

  • #2: Добрый день, меня зовут Максим Дунин, и я разработчик nginx. Сегодня я буду читать changelog в слух и с выражением.
  • #3: Для начала давайте разберёмся, с какого места начинать читать. Статистика говорит нам, что всё ещё остались люди, которые используют Debian 6 и nginx 0.7.67. Не надо так. Если вы всё ещё – прекращайте, пожалуйста, пора. Всё ещё остались люди, использующие 0.x.x. Наиболее популярная 0.x.x версия - 0.7.67. Казалось бы, при чём тут Debian 6 (Squeeze)? Хочу напомнить, что поддержка Debian 6 закончилась в феврале 2016 года. Пора обновляться!
  • #4: Подавляющее большинство всё-таки уже пользуется 1.x.x. И почти 50% (48%) - на новых версиях. Не так плохо, но могло бы быть и лучше. В прошлом году – на новых версиях было более 50%. И видно, что все уже разобрались в нашей системе нумерации версий, и знают, что чётные версии стабильные, нечётные – mainline. Сегодня мы поговорим о том, что же нового появилось в ветке 1.11.x (и соответственно доступно в стабильной ветке 1.12.x) и в 1.13.x. То есть о том, что вы получаете, если обновитесь, если ещё не сделали этого. Или что вы уже получили, но ещё не знаете об этом - если вы уже обновились.
  • #5: Для начала поговорим о ветке 1.11.x.
  • #6: В ветке 1.9.x появился модуль stream, предназначенный для балансировки произвольных соединений, а не только HTTP. Можно балансировать, убирать/добавлять SSL, ограничивать соединения и поток данных в каждом соединении. Можно даже UDP.
  • #7: В 1.11.x в этом модуле стало возможным использовать переменные. То же, что и в HTTP.
  • #8: Теперь stream умеет проверять клиентские сертификаты.
  • #9: Появилась возможность смотреть в SSL-соединение, не снимая SSL – ssl_preread. Можно посмотреть запрошенное клиентом имя сервера ($ssl_preread_server_name), и выбрать бэкенд в зависимости от него.
  • #10: Стало можно ограничивать количество соединений к конкретному серверу в блоке upstream. Пример того, как разработки из NGINX Plus попадают в nginx. Заодно убрали quick recovery - механизм, который "оживлял" все бэкенды, если они вдруг оказались признаны мёртвыми. Теперь мы в такой ситуации будем возвращать ошибки, пока не пройдёт заданное время fail_timeout.
  • #11: Научились чуть более универсально передавать адрес клиента на бэкенд. Традиционные решения этого – это либо заголовки для запросов, либо PROXY protocol для соединений. Но это требует поддержки бэкенда и потому не всегда работает. Теперь nginx умеет устанавливать соединение от имени клиента – это сложно в настройке, так как нужно обеспечить правильную маршрутизацию пакетов, требует запуска рабочих процессов под root’ом, но может выручить, если других вариантов нет.
  • #12: 64k соединений к бэкенду – адреса и destination port фиксированы, остаётся 16 бит свободы. 128k соединений к двум бэкендам, так как для разных destination адресов нам не нужно обеспечивать взаимную уникальность портов. А если мы делаем bind() до connect(), то локальный порт приходится выбирать до того, как мы знаем адрес назначения, и в результате мы ограничены 64k портов даже если используется много бэкендов. Решение – либо не использовать bind() вообще, либо не пытаться выбрать порт. В свежих версиях Linux появилась специальная опция IP_BIND_ADDRESS_NO_PORT, и nginx научился её использовать.
  • #13: Следующее, о чём хотелось бы сказать, это accept_mutex. Accept mutex – это традиционное решение так называемой проблемы thundering herd: когда приходит одно новое соединение, и в результате просыпаются все процессы, тратя ресурсы впустую. Accept mutex позволяет процессам договорится, кто из них будет принимать новые соединения в данный момент времени, и одно новое соединение в результате разбудит только один процесс. Есть, однако, нюансы. У нас процессов мало – то есть проблема thundering herd, на самом деле, минимальна. Accept mutex часто мешает в тестах, так как обработкой новых соединений занимается фактически только один процесс (и люди, пытающиеся тестировать скорость установление SSL-соединений на многопроцессорных серверах со включённым accept mutex’ом – слегка утомили). Accept mutex нельзя использовать на Windows или если используется reuseport, а в Linux появилась опция EPOLLEXCLUSIVE.
  • #14: Так что accept_mutex мы по умолчанию выключили. Ну и EPOLLEXCLUSIVE поддерживаем, если он есть.
  • #15: Следующий кусок изменений – улучшения в SSL. Один из наиболее ресурсозатратных аспектов SSL – это handshake, установление соединения. Сейчас, помимо классического и всеми поддерживаемого RSA, можно использовать ECDSA-сертификаты. Эллиптические кривые позволяют достичь заметно лучшей производительности при сохранении той же криптостойкости – больше чем порядок разницы между RSA 2048 и ECDSA P-256, если говорить о подписях. При тестировании собственно handshake’ов цифры несколько скромнее, так как обмен ключами осуществляется отдельно в рамках ECDHE, но ECDSA, тем не менее, выигрывает в три раза. Единственный недостаток ECDSA – cовместимость, ECDSA-сертификат не будет работать с клиентами под Windows XP, Android до 4.0 и OpenSSL до 1.0.0. Это не очень много, но такие клиенты по прежнему есть, и отказываться от них ради большей производительности ECDSA – не всегда хорошая идея. Теперь можно не отказываться, а загрузить одновременно RSA- и ECDSA- сертификаты. OpenSSL 1.0.1f: rsa2048 400 sings/s, ecdsap256 5400 signs/s OpenSSL 1.0.2j: 600, 12000 Requests: rsa2048 295.40 handshakes/s, ecdsap256 890.35/1009.17/1003.70 handshakes/s (cached 4000 handshakes/s) ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384
  • #16: В SSL добавилось немного полезных переменных: $ssl_ciphers и $ssl_curves показывают поддерживаемые клиентом шифры и кривые, в переменной $ssl_client_verify теперь есть текст, описывающий проблему, если проверка клиентского сертификата закончилась неудачей, subject и issuer клиентского сертификата теперь представлены в формате RFC 4514 (значения в прежнем формате доступны в переменных с суффиксом legacy), добавились переменные, показывающие начало и конец срока действия сертификата, и количество дней до окончания срока действия. 0x00ff – это TLS_EMPTY_RENEGOTIATION_INFO_SCSV, rfc5746 0x001d – это x25519
  • #17: В директиве ssl_ecdh_curve теперь можно указывать список кривых, аналогично списку шифров. Значения по умолчанию – auto, что означает список наиболее распространённых кривых, поддерживаемых данной версией библиотеки OpenSSL. Обычным Диффи-Хеллманом мы теперь по умолчанию не пользуемся, если вы хотите его использовать – надо явно задать ssl_dhparam. Для шифрования session tickets теперь можно использовать AES256.
  • #18: Динамические модули появились в nginx 1.9.x. Собираются с помощью штатного configure, без каких-либо внешних инструментов. Потом загружаются из конфига при помощи директивы load_module.
  • #19: Однако с ними есть проблема: поскольку структуры зависят от опций сборки, хотя модули и можно собирать отдельно от nginx’а, их нужно собирать с теми же опциями. Теперь мы добавили опцию сборки –with-compat, которая обеспечивает совместимость структур вне зависимости от опций сборки. Это упрощает сборку модулей отдельно, и заодно позволяет собирать модули для nginx plus.
  • #20: Ещё одна проблема, с которой часто сталкиваются, особенно при использовании проксирования websocket’ов – это очень долгое завершение рабочих процессов. Теперь появилась директива worker_shutdown_timeout, которая позволяет форсировать закрытие оставшихся соединений по истечении заданного таймаута и соответственно завершение рабочих процессов. Отмечу, что срабатывание такого таймаута – это оборванные соединения и необслуженные запросы, и таймаут не следует задавать слишком малым.
  • #21: Кэш мы научили лучше работать с устаревшими ответами. Раньше можно было написать в конфиге “proxy_cache_use_stale updating”, и nginx в процессе обновления ответа – всем дополнительным клиентам возвращал устаревший ответ из кэша. У такого подхода есть два недостатка – во-первых, это можно задать только из конфигурации, а во-вторых – может использоваться очень старый ответ.
  • #22: Теперь можно управлять использованием устаревших ответов с помощью заголовка Cache-Control, параметры stale-while-revalidate и stale-if-error. Это стандартный механизм, можно управлять с бэкенда, и можно задать время, в течении которого разрешено использовать старый ответ.
  • #23: Кроме того, кэш теперь может обновляться в фоне. Если мы разрешили использовать устаревшие ответы, то почти все получают ответ из кэша, и им хорошо. Однако один клиент отправляется непосредственно на бэкенд за обновлением, и ждёт ответа. Иногда это проблема. Теперь можно включить обновление кэша в подзапросе одновременно с возвратом ответа клиенту.
  • #24: Поменялось поведение параметра use_temp_path=off в кэше. Если раньше его использование приводило к тому, что временные файлы создавались в отдельном подкаталоге в кэше, то теперь временные файлы создаются в том же каталоге, где будет файл кэша. Иначе наблюдался lock contention на Linux, так как rename() между каталогами берёт лок на всю файловую систему. Добавилась директива proxy_cache_max_range_offset, позволяющая отключить кэш, если клиент запрашивает «далёкий» range.
  • #25: Мы научились возвращать относительные перенаправления – это часто удобно, если nginx общается не непосредственно с клиентом, а стоит за proxy, и не знает своего адреса и/или порта. RFC долгое время требовал, чтобы перенаправления были абсолютными, и именно такие пренаправления по умолчанию возвращает nginx. Для контроля того, что именно будет в этих перенаправлениях, существуют такие директивы, как server_name_in_redirect и port_in_redirect. Однако обычно относительные перенаправления работают, и новый RFC 7231 это узаконил. Так что теперь у нас есть директива absolute_redirect, которую при необходимости можно выключить.
  • #26: Часто, когда люди хотят писать логи в JSON, они делают как-то так. К сожалению, так не работает.
  • #27: А вот так – теперь работает. Теперь можно обеспечить правильный для JSON’а эскейпинг произвольных данных.
  • #28: Научились лучше работать с портом клиента в различных местах. Так, директива set_real_ip_from теперь умеет ставить не только адрес, но и порт. Добавились переменные $proxy_protocol_port, и $realip_remote_port.
  • #29: Ну и по мелочи: на EPOLLRDHUP мы теперь полагаемся, если ядро новое, в HTTP/2 много всяких исправлений и улучшений, map научился сложным комбинациям из переменных и строк, обазвёлся параметром volatile, делающим результат некешируемым, в image-фильтре появилась поддержка WebP, добавилась переменная $request_id.
  • #30: Всё это было сделано в рамках ветки 1.11.x и доступно в последней стабильной версии 1.12.2.
  • #31: Ветка 1.13.x – это основная ветка, над которой мы сейчас работаем. Последняя версия – 1.13.6.
  • #32: Появился модуль mirror, который призван решить довольно распространённую задачу отправки запроса в дополнительное место для анализа и/или сбора статистики.
  • #33: Работает с помощью background-подзапросов, как и фоновое обновление кэша. Если тело не нужно для анализа, его можно не читать. Заодно образовалась precontent-фаза обработки запроса, там теперь try_files и mirror, и туда можно встраивать свои модули. Вычистили проблему с ранним освобождением сохранённого на диск тела запроса в proxy_pass.
  • #34: Работаем над поддержкой TLS 1.3. Вообще что такое TLS 1.3? Там достаточно много изменений по сравнению с TLS 1.2, выкинуто масса всего ненужного, остались только шифры с forward secrecy. Основные плюсы с практической точки зрения – это 1 RTT на полный handshake вместо 2. И режим 0-RTT для известных серверов, который фактически позволяет вообще избавится от latency overhead’а. Но стандарта всё ещё нет, и основная оставшаяся проблема – это проблема middleboxes, то есть фильтров, из-за которых наблюдается достаточно большой error rate. Сейчас пытаются как-то уменьшить количество ошибок незначительными модификациями протокола, возможно – получится. Кроме того, вокруг TLS 1.3 разворачивается драма про так называемый datacenter monitoring – из-за того, что все шифры теперь с perfect forward secrecy, и сканировать SSL-поток теперь нельзя, даже имея секретный ключ сервера.
  • #35: Теперь nginx понимает параметр TLSv1.3 в директиве ssl_protocols. По умолчанию TLS 1.3 выключен. Если хочется потестировать – то нужен OpenSSL 1.1.1, который ещё не выпущен, собранный с опцией enable-tls1_3. При этом надо понимать, что просто так с браузерами TLS 1.3 не заработает, даже если разрешить в браузерах – в браузерах draft 18, а в openssl - draft 21. Из того, чего пока нет: при использовании TLS 1.3 не будет работать повторное использование сессий с бэкендами, поправим. Пока нет поддержки режима 0-RTT, в планах.
  • #36: И ещё немного про SSL. Теперь SSL renegotiation к бэкендам разрешён – это может помочь, если ваш бэкенд по какой-то причине очень хочет renegotiation. Добавилась переменная $ssl_client_escaped_cert – сертификат клиента, который можно использовать в заголовках или даже URI запроса.
  • #37: И разное. В логи теперь пишется PID процесса, отправившего сигнал. Что заметно упрощает разбирательства в случаях, когда сигнал присылает непонятно кто – а практика показывает, что такое бывает часто. Теперь worker_cpu_affinity можно использовать на DragonFly BSD. Добавилась базовая поддержка HTTP trailers и директива add_trailer – вообще это часть работы по добавлению возможности проксирования GRPC, который эти трейлеры использует, однако может быть полезно и само по себе, например для передачи клиенту какой-то дополнительной информации об обработке запроса. Директива set_real_ip_from теперь понимает имена. А в stream и mail добавилась поддержка параметров sndbuf и rcvbuf у директивы listen.
  • #38: Всё это было сделано в рамках ветки 1.13.x и доступно в версии 1.13.6.
  • #39: Где всё это взять? Как обычно – исходные коды на nginx.org. Для FreeBSD – используйте стандартные порты, там всё хорошо. Для Linux разных версий на nginx.org есть свежие пакеты.