Возможно ли в nginx при настройке обратного прокси-сервера иметь параметр сервера в качестве переменной на основе куки-файла браузера в вышестоящем модуле? - PullRequest
1 голос
/ 25 мая 2019

Я устанавливаю обратный прокси-сервер nginx для распределения маршрутизации / загрузки с использованием модулей апстрима и сервера, где один и тот же URL-адрес должен прокси-сервер на 5 различных серверах под управлением Apache, без изменения URL-адреса в браузере, в зависимости от значения файла cookie. Как мне выполнить параметр сервера в восходящем потоке, чтобы передать переменную, основанную на значении cookie?

Я попытался отобразить значение cookie на сервер, к которому мне нужно подключиться, и затем использовал ip сервера в качестве переменной в параметре "имя_сервера". Я пытаюсь использовать то же самое в параметре "server" в апстриме, однако nginx не поддерживает это. Я не хочу помещать все 5 серверов в апстрим, так как тогда nginx пытается балансировать нагрузку между ними, это не является целью. Цель состоит в том, чтобы распределить нагрузку на определенные серверы на основе значения cookie.

файл nginx.conf

http {
include /etc/nginx/conf.d/*.conf;

upstream su.la.com {
  server 100.0.8.2:443; 
}
}

    #The above works, making this $suhost, does not work.Any alternative 
    for this will be helpful.

    suhosts.conf file under /etc/nginx/conf.d

map $cookie_su_ID $suhost {
    default 100.0.8.2;
    1     100.0.8.2;
    3     100.0.8.6;
}

server {

  set $bypass 0;
  if ($remote_addr ~ "^(127.0.0.1)$") {
    set $bypass $http_secret_header;
  }

  listen 80;
  server_name su.la.com;

  return 301 https://$host$request_uri;
}

  server {

  set $bypass 0;
  if ($remote_addr ~ "^(127.0.0.1)$") {
    set $bypass $http_secret_header;
  }

  listen 443 ssl;
  server_name $suhost;
      ssl_certificate /etc/nginx/certs/client.crt;
      ssl_certificate_key /etc/nginx/certs/client.private.key;

    location / {
            proxy_pass https://su.la.com;
            proxy_cache_bypass $bypass;
      }
 }

Ожидаемые результаты: Основываясь на функции карты, описанной выше, если su_id = 1, параметр сервера в вышестоящем $ suhost должен быть выбран как 100.0.8.2, а https://su.la.com должен быть направлен на 100.0.8.2, без изменений в браузере.

Фактические результаты: nginx не допускает переменную для параметра сервера, поэтому для этого нужны другие альтернативы или подходы. Если параметру сервера присвоено значение для одного сервера, это работает. Нам нужно заставить его работать для маршрутизации на несколько серверов, по одному серверу за раз, основываясь на значении cookie.

...