Как изменить параметры запроса перед передачей запроса обратному прокси-серверу nginx

Я использую Nginx для прокси-запроса на какой-то внутренний сервер. Для этого я использую модуль proxy_pass для перенаправления. Файл конфигурации: location = /hello { proxy_pass: abc.com }

Я хочу выполнить следующий рабочий процесс. Запрос к серверу nginx --> изменить параметры запроса --> передать запрос на abc.com --> изменить параметры ответа --> отправить ответ обратно клиенту.

Возможно ли это с nginx? Буду признателен за любую помощь/указатели на эту проблему.


person Aarti    schedule 13.12.2015    source источник


Ответы (1)


Вы должны иметь возможность изменять/устанавливать новые параметры с помощью этого

location /hello {
  proxy_pass: abc.com 
  if ($args ~* paramToChange=(.+)) {
    set $args newParamName=$1;
  }
  set $args otherParam=value;
}

Обновлять:

В nginx нет готового способа сделать запрос на динамическое получение параметров, а затем применить их к другому запросу перед отправкой ответа клиента.

Вы можете сделать это, добавив в nginx модуль с именем lua.

Этот модуль можно перекомпилировать в nginx, скачав его и добавив в параметры .configure во время установки. Также мне нравится поставляемый с ним пакет openresty и другие уже доступные полезные модули, такие как echo.

Если у вас есть модуль lua, этот серверный код будет работать:

server {
    listen 8083;

    location /proxy/one {
        proxy_set_header testheader test1;
        proxy_pass http://localhost:8081;
    }

    location /proxy/two {
       proxy_pass http://localhost:8082;
    }

    location / {
        default_type text/html; 

        content_by_lua '
            local first = ngx.location.capture("/proxy/one",
               { args = { test = "test" } }
            )

            local testArg = first.body

            local second = ngx.location.capture("/proxy/two",
               { args = { test = testArg } }
            )

            ngx.print(second.body)
        ';

    }
}

Я протестировал эту конфигурацию с парой js-серверов node, например:

var koa = require('koa');
var http = require('http');

startServerOne();
startServerTwo();

function startServerOne() {
  var app = koa();


  app.use(function *(next){
    console.log('\n------ Server One ------');
    console.log('this.request.headers.testheader: ' + JSON.stringify(this.request.headers.testheader));
    console.log('this.request.query: ' + JSON.stringify(this.request.query));

    if (this.request.query.test == 'test') {
      this.body = 'First query worked!';
    }else{
      this.body = 'this.request.query: ' + JSON.stringify(this.request.query);
    }  
  });

  http.createServer(app.callback()).listen(8081);

  console.log('Server 1 - 8081');
}

function startServerTwo(){
  var app = koa();
  app.use(function *(next){

    console.log('\n------ Server Two ------');
    console.log('this.request.query: ' + JSON.stringify(this.request.query));

    if (this.request.query.test == 'First query worked!') {
      this.body = 'It Worked!';
    }else{
      this.body = 'this.request.query: ' + JSON.stringify(this.request.query);
    }
  });

  http.createServer(app.callback()).listen(8082);

  console.log('Server 2 - 8082');
}

Это был вывод из журналов консоли узла:

Server 1 - 8081
Server 2 - 8082

------ Server One ------
this.request.headers.testheader: "test1"
this.request.query: {"test":"test"}

------ Server Two ------
this.request.query: {"test":"First query worked!"}

Вот что происходит:

  1. Nginx отправляет первому серверу запрос запроса с набором тестовых параметров.

  2. Сервер узла 1 видит тестовый параметр и отвечает «Первый запрос сработал!».

  3. Nginx обновляет параметры запроса телом от сервера одним ответом. Nginx отправляет серверу два запрос с новыми параметрами запроса.

  4. Сервер узла 2 видит, что параметр запроса «тест» равен «Первый запрос сработал!» и отвечает на запрос телом ответа «Это сработало!».

И ответ curl или посещение localhost: 8083 в браузере показывает «Это сработало»:

curl -i 'http://localhost:8083'
HTTP/1.1 200 OK
Server: openresty/1.9.3.2
Date: Thu, 17 Dec 2015 16:57:45 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive

It Worked!
person curtwphillips    schedule 13.12.2015
comment
Новые параметры носят динамический характер. Мне нужно вызвать какой-то сетевой вызов или сервисный вызов, чтобы заполнить этот параметр. Также я хочу установить некоторые параметры перед вызовом прокси-сервера. - person Aarti; 14.12.2015
comment
Я добавил обновление выше. Первый вызов сервера можно заменить вызовом сети или службы, который вам нужен. Ответ первого сервера используется для установки параметров перед вызовом второго сервера. - person curtwphillips; 17.12.2015