Переменные сервера Nginx

Я пытался найти пример проблемы, с которой столкнулся, но пока безуспешно, поэтому прошу прощения, если на нее уже был дан ответ.

В конфигурации nginx (может включать lua, я пробовал оба) я хочу иметь доступ к переменной в нескольких местах на одном сервере. Тем не менее, я хочу иметь возможность также изменить его. Например, если я сделаю это:

server {
  set $asleep = 0;

  location /go_to_sleep {
    set $asleep = 1;
    echo "sleepy";
  }

  location /status {
    echo "are we asleep? $asleep";
  }
}

По сути, я не могу использовать параметры, мне нужен способ иметь локальную переменную, которую я могу изменить. моя проблема заключается в том, что независимо от того, сколько раз я попадаю в конечную точку /go_to_sleep, /status всегда сообщает $asleep как 0. Я думаю, это потому, что $asleep только локально модифицируется в конечную точку местоположения /go_to_sleep. Я тоже пробовал использовать блоки lua, но получаю тот же результат.

Просто интересно, если это просто невозможно или кто-нибудь может помочь мне понять, как заставить такие вещи работать?

Спасибо


person godspeed20    schedule 08.11.2017    source источник


Ответы (2)


Общий доступ к данным в Nginx Worker будет работать (как ясно сказано) в nginx worker. Если это то, что вы хотите - посмотрите ответ Павла Кульченко.

Но если вам нужны глобальные флаги для всех воркеров, вы можете использовать ngx.shared.DICT API

http {
    lua_shared_dict my_global_flags 10m;

    server {
        listen 80;

        location = /go_to_sleep {
            content_by_lua_block {
                local my_global_flags = ngx.shared.my_global_flags
                my_gobal_flags:set("asleep" , true)
                ngx.say("sleepy")
            }
        }

        location /status {
            content_by_lua_block {
                local my_global_flags = ngx.shared.my_global_flags
                ngx.say("are we asleep ", my_gobal_flags:get("asleep"))
            }
        }
    }
}
person Alexander Altshuler    schedule 10.11.2017
comment
это идеально и именно то, что мне нужно. Пол, я попробовал ваше предложение, и оно сработало, но это избавило меня от необходимости иметь какие-либо файлы lua, так что это моя победа. Спасибо вам обоим - person godspeed20; 15.11.2017
comment
Существует большая разница в использовании общего словаря и состояния каждого модуля: если у вас более одного воркера nginx, последний метод не будет работать, потому что каждый воркер nginx имеет свою собственную копию на всех загруженных модулях. Запрос /go_to_sleepy может обрабатываться одним воркером, а запрос /status может обрабатываться другими воркерами. Для меня это выглядит как причина выбора общего словаря, а не потому, что он не требует модуля lua. - person Alexander Altshuler; 16.11.2017

Учитывая рекомендацию в Общий доступ к данным в Nginx Worker, я думаю, вам может понадобиться переключиться на использование модулей для обмена значениями данных, как показано и объяснено в этом примере. Этот SO вопрос/ответ и пример в нем также могут быть актуальны .

person Paul Kulchenko    schedule 08.11.2017