Динамический восходящий поток Nginx на основе ngx.var, установленного в access_by_lua_block

Упрощенный образец конфигурации NGINX:

http {
  set $foo default;
  access_by_lua_block {
    ngx.var.foo = "bar"
  }

  server {
    listen 8080 default_server;
    server_name localhost;

    location / {
      set $proxy one;
      if ($foo = "bar") {
        set $proxy two;
      }
      proxy_pass http://$proxy;
    }
  }
}

Проблема, которую я вижу, заключается в том, что $foo, похоже, не установлен в блоке местоположения. Если я добавлю журнал доступа, который регистрирует $foo под http, значение будет bar. Если я помещу журнал доступа в блок местоположения, то это будет default.

Как я могу динамически переключать восходящие потоки на основе значения набора ngx.var в access_by_lua_block?


person Mike Robinet    schedule 13.05.2021    source источник


Ответы (1)


Операторы if в блоке местоположения выполняются на этапе NGINX, который происходит до access_by_lua_block. Исправление, которое я придумал, заключалось в перемещении чека в access_by_lua_block. proxy_pass выполняется на этапе содержимого и может читать переменные, установленные на этапе доступа.

http {
  set $proxy one;
  access_by_lua_block {
    ngx.var.foo = "bar"
    if ngx.var.foo == "bar" then
      ngx.var.proxy = "two"
    end
  }

  server {
    listen 8080 default_server;
    server_name localhost;

    location / {
      proxy_pass http://$proxy;
    }
  }
}

Это действительно надуманный пример, который не имеет особого смысла, но в реальной проблеме я не просто устанавливал ngx.var.foo = "bar", но вместо этого foo был установлен на основе результата ответа, полученного от запроса, сделанного в блоке доступа, поэтому он был гораздо более динамичным по своей природе.

person Mike Robinet    schedule 14.05.2021