Что нового в nginx? - mdounin.ru · ssl и сертификаты rsa –...

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

Upload: others

Post on 23-Mar-2021

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

Page 2: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

W3Techs:0.x.x - 2.5% 1.x.x - 97.5% Жизньналадилась!h9ps://w3techs.com/technologies/details/ws-nginx/all/all“Nginxisusedby31.4%ofallthewebsiteswhosewebserverweknow.”

Page 3: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Подробнее про 1.x.x

Новое:1.10.x - 48.3% 1.11.x - 5.3% Старое:1.8.x - 10.3% 1.6.x - 9.5% 1.4.x - 8.3% 1.2.x - 5.6%

48.3

5.3

10.3

9.5

8.3

5.6

1.10.x

1.11.x

1.8.x

1.6.x

1.4.x

1.2.x

Page 4: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

1.9.x Научилиnginxпоказыватьпортклиентавразличныхместах,добавилизнаниеонеидемпотентныхзапросахвproxy_next_upstream,вкештеперьможнописатьасинхронно,аcachemanagerумеетследитьзасобой.Появилисьдинамическиемодули,worker_cpu_affinityобзавёлсяручкойautoдляленивых,модульsliceпозволяетзагружатьикешироватьбольшиефайлыпочастям,resolverнаучилсяделатьзапросыпоTCP,HTTP/2пришёлнасменуSPDY,sub_filterтеперьумеетдвараза,nginx-Tпоказываетконфиг,аnginx-V–версиюOpenSSL,“listen...reuseport”длябыстройобработкиновыхсоединений,имодульstreamдлятех,комуицелогоHTTPмало.

Page 5: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Порт клиента

• 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 6: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Идемпотентность

Идемпоте́нтность—свойствообъектаилиоперацииприповторномпримененииоперациикобъектудаватьтотжерезультат,чтоиприодинарном.GET,HEAD,PUT,DELETE,…–даPOST,LOCK,PATCH–нет•  Неповторяемнеидемпотентныезапросы•  Вернутьстароеповедение:proxy_next_upstream error timeout non_idempotent;

Page 7: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Запись в кеш

Запись–этобыстроНоможетизаблокироватьсяРешение:aio threads; aio_write on;

Page 8: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Cache: боремся за память

Ошибки“couldnotallocatenode”?• Cacheумеетудалятьстарыезаписи• Нодругойпроцессможетуспетьраньше

Теперьcachemanagerследитзаколичествомзаписей.

Page 9: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

• Упроститьсборкупакетов•  внешниезависимостиумодулей!

• Упроститьотладку•  3rdpartyмодулидолжнобытьпростовыключить

Page 10: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

Собрать:./configure --with-http_image_filter_module=dynamic ./configure --add-dynamic-module=/path/to/module

nginx.conf:load_module modules/ngx_http_image_filter_module.so;

Page 11: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Динамическая загрузка своего модуля

• Меняемconfig-скриптнаauto/module • Длясложныхмодулей:

•  ngx_count_modules() •  ngx_modulesменяемнаcycle->modules

Page 12: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Динамическая загрузка своего модуля

Было:ngx_addon_name="ngx_http_delay_module" HTTP_MODULES="$HTTP_MODULES ngx_http_delay_module" NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_delay_module.c" Стало:ngx_addon_name="ngx_http_delay_module" ngx_module_type=HTTP ngx_module_name=ngx_http_delay_module ngx_module_incs= ngx_module_deps= ngx_module_srcs=$ngx_addon_dir/ngx_http_delay_module.c ngx_module_libs= . auto/module

Page 13: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

CPU affinity

Примериздокументации: worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;

Чтоделать,еслиунасмногопроцессоров? worker_cpu_affinity auto; worker_cpu_affinity auto 0101010101010101;

Page 14: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Кешируем большие файлы

Проблемы:• Сбекендаскачиваетсяфайлцеликом• Range-запросыждутначалафайла• ЧастонужнотольконачалоРешение:• Качатьикешироватькусками

Page 15: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Модуль slice

location / { slice 1m; proxy_cache cache; proxy_cache_key $uri$is_args$args$slice_range; proxy_set_header Range $slice_range; proxy_cache_valid 200 206 1h; proxy_pass http://upstream; }

•  Подзапросынаотдельныечасти•  Кешируемотдельныечасти

Page 16: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

SPDY умер, HTTP/2 за него

server { listen 443 ssl http2; ... }

• Мультиплексированиезапросовводномсоединении•  Теперьработаетproxy_request_buffering • Недоделанностьреализацийвсётамже,осторожнее

Page 17: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Несколько sub_filter за раз

Пример:

sub_filter http://one.example.com https://one.example.com;

sub_filter http://two.example.com https://two.example.com;

sub_filter_once off;

Заоднооннаучилсяделатьэтобыстрее.

Page 18: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Быстрая обработка новых соединений

•  Тестируем•  accept_mutex!

• Одинlisten-сокет–conten�onвядре

listen 80 reuseport;

0

50

100

150

200

0 6 12 18 24

kr/s,E5645(6ядер/12потоков)x2

Page 19: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Stream: для тех, кому HTTP мало

stream { upstream backend { server 10.0.0.2:12345; server 10.0.0.3:12345; } server { listen 12345; proxy_pass backend; } } •  Балансировкапроизвольныхсоединений•  SSLотклиентов,SSLкбекендам•  Ограниченияколичествасоединенийискорости•  PROXYprotocolкбекендам•  …идажеUDP

Page 20: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Разное

•  ResolverнаучилсяTCP•  Блокиupstream{}вразделяемойпамяти•  РазделяемаяпамятьнаWindowsсASLR(Vistaиновее)•  SSLv3поумолчаниюзапрещён•  $upstream_connect_�me•  Полныйконфигпо“nginx-T”•  ВерсияOpenSSLв“nginx-V”nginx version: nginx/1.11.2 built by gcc 4.9.2 (Debian 4.9.2-10) built with OpenSSL 1.0.1k 8 Jan 2015 (running with OpenSSL 1.0.1t 3 May 2016) ...

Page 21: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

Page 22: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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,упростилисборкудинамическихмодулей.

Page 23: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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 24: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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 25: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

Пример: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 26: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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 27: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Linux и IP_BIND_ADDRESS_NO_PORT

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

Page 28: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Accept mutex, Linux и EPOLLEXCLUSIVE

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

Page 29: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Accept mutex, Linux и EPOLLEXCLUSIVE

Новыйdefault:accept_mutex off;

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

Page 30: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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 31: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

SSL и другое

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

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

Page 32: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

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

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

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

Page 33: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Разное

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

•  $request_id

Page 34: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Всёэтодоступновnginx1.11.5S�llcoun�ng

Page 35: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

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

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

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

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

Page 36: Что нового в nginx? - mdounin.ru · SSL и сертификаты RSA – совместимо, но дорого ECDSA – быстро, но не будет работать

Спасибо!

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