действительно Dockerfile обновился, но docker оказывается сам его не отслеживает и не перекачивает обновление с той же версией можно обновить — docker pull nginx:1.18.0
и тогда пришёл новый докерфайл/image — иначе всё из кэша бралось ENV NJS_VERSION 0.4.2 бэст-практика для прода фиксировать версию, а не использовать latest тут не сработала: кто бы мог предположить, что возможны правки в том, чего вроде как и не ожидаешь (в Dockerfile привязанном тегом к конкретной версии), что может тихо измениться (то что вроде бы должно намертво фиксироваться) docker history было: IMAGE CREATED CREATED BY SIZE COMMENT … <missing> 3 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B <missing> 3 months ago /bin/sh -c #(nop) ENV NJS_VERSION=0.4.0 0B <missing> 3 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.18.0 0B <missing> 3 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 3 months ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 3 months ago /bin/sh -c #(nop) ADD file:7780c81c33e6cc5b6… 69.2MB стало после docker pull nginx:1.18.0 IMAGE CREATED CREATED BY SIZE COMMENT … <missing> 3 months ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B <missing> 3 weeks ago /bin/sh -c #(nop) ENV NJS_VERSION=0.4.2 0B <missing> 3 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.18.0 0B <missing> 3 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 4 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 4 weeks ago /bin/sh -c #(nop) ADD file:3af3091e7d2bb40bc… 69.2MB и это ведь неочевидно, интуитивно отбрасывается и не учитывается при поиске проблем… > On 1 Sep 2020, at 21:07, Alexey Galygin <m...@me.com> wrote: > > да, спасибо за внимание и поддержку! > > удивительно, но на старом сервере действительно NJS младше: 0.4.0 > хотя ставятся из одного докерфайла (и сегодня я даже пересобирал контейнер) > > мы также пришли к выводу, что пара переменных точно будет похожа (к тому же > править частично — это странная практика) > в итоге нашлось решение без NJS > > использовать $uri как unescaped-форму > и вот такую конструкцию для получения исходной формы: > > map $request_uri $escaped_uri { > "~^(?P<path>[^?]*)(\?.*)?$" $path; > } > > в итоге… мы поизучали свои данные и вообще это всё выкинули, оставив $uri — > нечего баловать пользователей ;-) > > > > >> On 1 Sep 2020, at 20:51, Dmitry Volyntsev <xei...@nginx.com> wrote: >> >> >> On 01.09.2020 08:59, Alexey Galygin wrote: >>> nginx из официального докер образа 1.18.0 >>> njs шла в комплекте и отдельно не ставилась — 0.4.2 >>> вообще никак не вмешивались… >>> >>> за альтернативу кода спасибо! >>> сейчас думаем, как бы аккуратно выпилить эти артефакты совсем >>> >>> >> Спасибо за баг-репорт. Могу подтвердить что проблема в NJS и появилась в >> версии 0.4.2 (вероятно обновилась вместе деплоем нового образа?). >> >> Удалось воспроизвести проблему самостоятельно. Она действительно оказалась >> связана с регулярными выражениями, а точнее с глобальным реплейсом >> replace(/_/g, "%5F"). При определенных условиях код мог уходить в >> endless-loop при этом поглощая всю доступную память. Исправленная версия >> приедет в 0.4.4. >> >> Уточнее касательно исходных сниппетов: >> >> function unescapeURI(r) { return r.uri.replace(/%20/g, ' '); } >> >> r.uri уже возвращает unescaped версию URI, и replace(/%20/g, ' ') вернет >> исходный URI. >> Как результат $uri $unescaped_uri должны быть идентичными. >> >>>> On 1 Sep 2020, at 07:56, Dmitry Volyntsev <xei...@nginx.com> wrote: >>>> >>>> >>>> On 01.09.2020 00:42, Alexey Galygin wrote: >>>>> но на всякий случай, может есть версия как-то это нативно переписать для >>>>> конфига без всяких языков и модулей? >>>>> какие есть рекомендации? (совсем выкидывать всё же стрёмно…) >>>> А подскажите свою версию njs (Если njs ставился из официальных пакетов, >>>> будет доступен бинарник njs, и тогда версию можно узнать так `njs -v`). >>>> >>>>> оказалось проблема в NJS части, какой-то баг там именно в связке 1.18.0 + >>>>> Ubuntu 20.04 >>>> менялась ли версия njs при апгрейде? Если нет, единственное что пока >>>> приходит на ум это изменения в версии libpcre между дистрибутивами. >>>> >>>> Как воркараунд можно попробовать переписать эти функции без использования >>>> глобальных регулярок (наиболее вероятное место проблемы). >>>> >>>> function unescapeURI(r) { >>>> return r.uri.replace(/%20/g, " "); >>>> } >>>> >>>> -> >>>> >>>> 1) >>>> // идентична по поведению исходной функции >>>> function unescapeURI(r) { >>>> return r.uri.split(/%20/).join(" "); >>>> } >>>> >>>> 2) >>>> // более стандартный метод, но заменит все %-encoded комбинации >>>> https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/decodeURI >>>> function unescapeURI(r) { >>>> return decodeURI(r.uri); >>>> } >>>> >>>> >>>> function escapeURI(r) { >>>> return r.uri.replace(/\s/g, "%20").replace(/_/g, "%5F"); >>>> } >>>> >>>> -> >>>> >>>> 1) >>>> // идентична по поведению исходной функции >>>> function escapeURI(r) { >>>> return r.uri.split(" ").join("%20").split("_").join("%5F"); >>>> } >>>> >>>> 2) >>>> // более стандартный метод, но заменит все %-encoded комбинации >>>> https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/encodeURI >>>> function escapeURI(r) { >>>> return encodeURI(r.uri); >>>> } >>>> > _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru