действительно

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

Ответить