Что нового в nginx? -...

39
Что нового в nginx? Максим Дунин

Transcript of Что нового в nginx? -...

Page 1: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Что нового в nginx? Максим Дунин

Page 2: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Про ложь, наглую ложь и статистику

W3Techs:0.x.x - 1.5%

1.x.x - 98.5%

https://w3techs.com/technologies/details/ws-nginx/all/all“Nginxisusedby35.7%ofallthewebsiteswhosewebserverweknow.”

Page 3: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Подробнее про 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

Page 4: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

1.11.x Переменныевмодулеstream,возможность"подсматривать"вSSLhandshake,имножествовсегоещё.Большенетquickrecovery,ноестьmax_conns,аcachemanagerнаучилсябытьнезаметным,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"вответахиумеетобновлятьсявфоне,аперенаправлениятеперьнеобязательноабсолютные.

Page 5: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

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кбэкендам•  Ограниченияколичествасоединенийискорости•  PROXYprotocolкбэкендам•  …идажеUDP

Page 6: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Stream: переменные

Атакжеmap,return,geo,geoip,split_clients,realip,accesslog…Теперьможно:map $remote_addr $limit { 127.0.0.1 ""; default $binary_remote_addr; } limit_conn_zone $limit zone=addr:10m; limit_conn addr 1;

Page 7: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Stream: клиентские SSL-сертификаты

Теперьпроверятьклиентскиесертификатыумеетиstream:ssl_verify_client on;

ssl_client_certificate /path/to/root;

Непрошедшиепроверкусоединениябудутзакрыты.Результатпроверкив$ssl_client_verify.

Page 8: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

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; }

Page 9: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Количество соединений к бэкендам

Пример: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; }

ИсходнодляNGINXPlus.

Page 10: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Transparent proxy

Передатьадресклиента,традиционныерешения:•  X-Forwarded-For/X-Real-IP•  PROXYprotocolЕслиоченьнадо:proxy_bind $remote_addr transparent; SO_BINDANY(NetBSD),IP_TRANSPARENT(Linux),IP_BINDANY(FreeBSD),нуженroot

Page 11: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Linux и IP_BIND_ADDRESS_NO_PORT

Сколькосоединенийможноустановитькодномубэкенду?Кдвум?Атеперьпишемвконфиг:proxy_bind 192.0.2.1; ивсёплохо.Почему?•  Bind()выбираетлокальныйпорт•  IP_BIND_ADDRESS_NO_PORT(Linux4.2,glibc2.22)

Page 12: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Accept mutex, Linux и EPOLLEXCLUSIVE

Thunderingherdproblem.Традиционныйответ–acceptmutex.Но:•  вообще-тоунаспроцессовмало•  частомешаетвтестах• нельзяиспользоватьнаWindows• ненуженс“listen…reuseport”• наLinuxпоявилсяEPOLLEXCLUSIVE(Linux4.5,glibc2.24)

Page 13: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Accept mutex, Linux и EPOLLEXCLUSIVE

Новыйdefault:accept_mutex off;

НуиEPOLLEXCLUSIVEподдерживаем.

Page 14: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

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

Page 15: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

SSL и переменные

•  $ssl_ciphers •  “AES128-SHA:AES256-SHA:0x00ff”

•  $ssl_curves•  “0x001d:prime256v1:secp521r1:secp384r1”

•  $ssl_client_verifyтеперьсодержиттекстошибки•  “FAILED:certificatehasexpired”

•  $ssl_client_s_dn,$ssl_client_i_dn–теперьвформатеRFC4514•  $ssl_client_s_dn_legacy,$ssl_client_i_dn_legacy

•  $ssl_client_v_start,$ssl_client_v_end •  “May601:20:482017GMT”

•  $ssl_client_v_remain •  “12”

Page 16: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

SSL и другое

• ssl_ecdh_curveумеетсписоккривых(OpenSSL1.0.2+)•  “auto”поумолчанию•  OpenSSL1.1.0:X25519:prime256v1:secp521r1:secp384r1

• ssl_dhparamпоумолчаниюотсутствует•  ТоестьDHE-шифрывыключены•  Медленно•  АтакинаDHE,weakdh.org

• ssl_session_ticket_keyумеетAES256•  Нужноиспользоватьфайлыразмером80байтвместо48

Page 17: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Динамические модули

Появилисьв1.9.x.Собрать:./configure --add-dynamic-module=/path/to/module make modules

Загрузитьвnginx.conf:load_module modules/ngx_my_cool_module.so;

Page 18: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Динамические модули: совместимость

Проблема:•  Cтруктурызависятотопцийсборки•  Собиратьмодулинадостемижеопциями

Теперьпроще:./configure --with-compat ... ./configure --with-compat --add-dynamic-module=/path/to/module

Бонус:совместимостьсNGINXPlus.

Page 19: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Завершение старых рабочих процессов

Проблема:• Приобновленииконфигурациистарыерабочиепроцессызавершаются,когдавсесоединениябудутзакрыты

• WebSocket’ы,long-polling,stream– долго

Теперьможнотак:worker_shutdown_timeout 15m;

Page 20: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Cache: устаревшие ответы

Было:proxy_cache_use_stale updating;

•  Толькоизконфигурации• Можетиспользоватьсяоченьстарыйответ

Page 21: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Cache: устаревшие ответы

ТеперьможноуправлятьзаголовкомCache-Control:HTTP/1.1 200 OK Cache-Control: stale-while-revalidate=300

• RFC5861• Можноуправлятьсбэкенда•  Задаётсявремя,послекоторогоответнепригоден• Дляошибок– stale-if-error

Page 22: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Сache: обновление в фоне

Еслииспользуется“proxy_cache_use_stale updating”илиstale-while-revalidate:•  Почтивсеполучаютответизкэша•  Одинклиентждётбэкенда

proxy_cache_background_update on; •  Обновлениевподзапросе•  Одновременносвозвратомответаклиентуизкэша•  Еслинеуспеет,тозадержитследующиезапросывсоединении

Page 23: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Cache: разное

• Поменяли“proxy_cache_path ... use_temp_path=off”•  Появилосьв1.7.10вместеспеременнымивproxy_cache,переключатьсямеждукэшами

•  Теперьвременныефайлысоздаютсявтомжекаталоге,чтоицелевойфайл

•  ИначеlockcontentionнаLinux:rename()междукаталогамиберётlockнавсюфайловуюсистему

• Директиваproxy_cache_max_range_offset•  Обычноскачиваемвкэшфайлцеликом,иотдаёмrangeизнего•  Запретиспользованиякэшадля«далёких»range-запросов

Page 24: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Относительные перенаправления

• RFC2616:толькоабсолютныеURIвLocation•  Location = "Location" ":" absoluteURI•  ПринеобходимостиnginxсамстроитабсолютныйURI

•  server_name_in_redirect,port_in_redirect •  Но:относительныеперенаправленияобычноработают

• RFC7231:можноотносительные•  Location = URI-reference

• Директиваabsolute_redirect

Page 25: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Логгирование в 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" }';

Page 26: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Логгирование в 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" }';

Page 27: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Порт клиента

• set_real_ip_fromтеперьставитнетолькоадрес,ноипортproxy_pass http://backend; proxy_set_header X-Real-IP $remote_addr:$remote_port;

• переменные$proxy_protocol_port,$realip_remote_port

Page 28: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Разное

•  НаEPOLLRDHUPмытеперьполагаемся,еслиядроновое•  HTTP/2–исправленияиулучшения• Mapнаучилсясложнымкомбинациямпеременныхистрокmap $host $log { ~foo /var/log/$host.log; default /var/log/default.log; } иобзавёлсяпараметромvolatile

•  ПоддержкаWebPвimage_filter •  $request_id

Page 29: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Всёэтодоступновnginx1.12.2

Page 30: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

1.13.x Модульmirrorдляанализатрафика,базоваяподдержкаTLS1.3,$ssl_client_escaped_cert,разрешилиSSLrenegotiationсбэкендами,влогахтеперьестьPIDпроцесса,отправившегосигнал,появиласьдирективаadd_trailer,аCPUaffinityможнозадаватьнаDragonFlyBSD.

Page 31: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Mirror

Задача:•  Отправитьзапросвдополнительноеместо•  Дляанализа/сборастатистики/тестирования

Решение:location / { mirror /mirror; proxy_pass http://real-backend; } location /mirror { proxy_pass http://mirror-backend; proxy_set_header X-Original-URI $request_uri; }

Page 32: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Mirror: детали

• Работаетспомощьюbackground-подзапросов,какиобновлениекэша

•  Переписалиbackground-подзапросы• Можнонечитатьтело

•  mirror_request_body off;•  Заоднообразоваласьprecontent-фаза

•  Тамtry_filesиmirror•  Можновстраиватьсвоимодули

• Вычистилипроблемусраннимосвобождениемтелавproxy_pass•  Вообщеэтооптимизация–зачемнамтело,еслионоужеубэкенда?•  МожнобылонаступитьвSSI

Page 33: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

SSL: основы TLS 1.3

•  Fullhandshake–1RTT•  Невсегда,нообычно(еслиkey_shareклиентаподходит)•  Ранееfullhandshake–2RTT,abbreviatedhandshake– 1RTT

• Режим0-RTT•  Но:безreplayprotection

• Стандартаещёнет• Middleboxesissue,1.5%..3.4%errorrate• Datacentermonitoring-TEHDRAMMA

Page 34: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

SSL: поддержка TLS 1.3

Теперьnginxпонимает:ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

•  Поумолчаниювыключено•  НуженOpenSSL1.1.1(notyetreleased),собранныйс“enable-tls1_3”•  ВбраузерахDraft18,вOpenSSL–Draft21,нужнаветка"tls1.3-draft-18”•  Небудетработатьsessionreuseсбэкендами,поправим•  Поканетподдержки0-RTT,впланах

Page 35: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

SSL: разное

•  теперьможноSSLrenegotiationкбэкендам•  есливашбэкендоченьхочетrenegotiation

• переменная$ssl_client_escaped_cert

Page 36: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Разное

• ВлогахпишетсяPIDпроцесса,отправившегосигнал•  Теперьworker_cpu_affinityработаетнаDragonFlyBSD• БазоваяподдержкаHTTPtrailersидирективаadd_trailer • Именавset_real_ip_from • Вstreamиmail– параметрыrcvbufиsndbufудирективыlisten

Page 37: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Всёэтодоступновnginx1.13.6Stillcounting

Page 38: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Где взять дене^Wсвежий nginx?

•  Исходныекоды,какобычно:http://nginx.org/ru/download.html

•  ДляFreeBSD:используйтепортыnginxиnginx-devel,тамвсёновоеСпасибоСергеюОсокину!

•  ДляLinuxразныхверсий:системныепакеты–обычностарые,свежиепакетыдоступнынаhttp://nginx.org/ru/linux_packages.html(отдельныепакетыдлямодулейgeoip,imagefilter,njs,perl,xslt)

Page 39: Что нового в nginx? - mdounin.rumdounin.ru/files/mdounin-nginx-whatsnew-highload2017.pdf · 1.11.x Переменные в модуле stream, возможность "подсматривать"

Спасибо!

Вопросы?МаксимДунин[email protected]