NGINX: выполнение двух асинхронных вызовов на внутренний сервер

Я хочу сделать следующее с помощью модуля NGINX: Nginx получает запрос, проверяет, есть ли у него ключ для декодирования запроса в кеше (пользовательский)

  • если ДА, то декодировать запрос, получить из него идентификатор и проверить, есть ли значение против этого идентификатора в хранилище ключ-значение (асинхронно) и вернуть его в ответе
  • если НЕТ, то получить новый ключ из хранилища ключ-значение (асинхронно), а затем сохранить этот ключ в кеше и использовать его для декодирования запроса. Получите идентификатор и проверьте, есть ли значение для этого идентификатора в хранилище значений ключа (асинхронно), и отправьте его в ответе.

Я смог понять, как выполнить шаг 1, я написал основной модуль, сославшись на модуль openresty nginx из гитхаб. Для достижения функциональности шага 2 я попытался создать новый восходящий запрос в функции process_header() первого восходящего вызова (т.е. получить ключ из хранилища), но это не сработало. Как этого добиться?

Заранее спасибо.


person melwin_jose    schedule 10.08.2015    source источник


Ответы (1)


Я вижу 2 подхода:

  1. Вы можете сделать все это на Lua, используя lua-nginx-module и lua-resty-redis. Здесь вы можете найти некоторую информацию Настроить-nginx-для-получения-url-от-redis-с-ключом-и-прокси-адреса-на-другой-сервер

  2. Напишите модуль nginx C, используйте redis2-nginx-module в качестве восходящего модуля, отправьте подзапрос. Взгляните на мой ответ на Подзапросы не отправляются или запрос зависает Это показывает, как отправлять подзапросы.

person Alexander Altshuler    schedule 11.08.2015
comment
эй, спасибо за ответ. Я попробовал второй подход, который вы упомянули, но он не сработал для меня. Можно ли отправить неHTTP-запрос как подзапрос? Я хочу отправить запрос redis в качестве подзапроса. - person melwin_jose; 12.08.2015
comment
и еще одна вещь: URI, который отправляется в качестве параметра для ngx_http_subrequest(), добавляется к рабочему каталогу nginx. - person melwin_jose; 13.08.2015
comment
Да, можно отправить не-HTTP подзапрос. Укажите URL-адрес, который должен соответствовать вашему местоположению, которое использует модуль redis2 в качестве восходящего потока. - person Alexander Altshuler; 13.08.2015
comment
Не уверен в добавлении рабочего каталога nginx. Можете ли вы использовать подзапрос из конфигурации nginx? openresty.org/download/ - person Alexander Altshuler; 13.08.2015
comment
у вас есть код, который отправляет только один подзапрос, простой пример, на который я могу ссылаться, чтобы проверить любые ошибки с моей стороны? - person melwin_jose; 13.08.2015
comment
Я уже публиковал примеры того, как отправлять подзапросы как для кода C, так и для конфигурации nginx. - person Alexander Altshuler; 13.08.2015
comment
Давайте продолжим обсуждение в чате. - person melwin_jose; 13.08.2015