Переключаться между proxy_pass и uwsgi_pass на основе cookie?

Переключаться между proxy_pass и uwsgi_pass на основе cookie?

Мой сервер nginx в настоящее время настроен на обслуживание всех запросов через uwsgi_pass:

location / {
  uwsgi_pass unix:///tmp/uwsgi-zerocater.sock;
  include uwsgi_params;
  uwsgi_read_timeout 7200;
  client_max_body_size 20M;
}

В коде моего приложения я установил cookie-файл с именем, new_feзначение которого может быть «True» или «False».

Когда значение равно "True", я хочу вместо этого proxy_passперейти на другой внешний сервер, но только для определенных маршрутов. Что-то вроде следующегопсевдокод:

location ~ "^/my/complicated/regex$" {
  if ($cookie_new_fe = "True") {
    # pass the request to my other server
    # at something like http://other.server.com
  } else {
    # do the usual uwsgi stuff
  }
}

Как мне это сделать? Я все еще немного новичок в nginx, поэтому, пожалуйста, извините за вопрос, если я упускаю что-то простое.

решение1

В качестве временного решения это должно сработать:

location ~ "^/my/complicated/regex$" {
  if ($cookie_new_fe = "True") {
    error_page 418 = @proxy;
    return 418;
  }

  # do the usual uwsgi stuff
}

location @proxy {
    # do proxy stuff
}

решение2

Я немного поразмыслил над картами и придумал следующее решение, которое, похоже, работает (использует предложения @womble и @alexey-ten):

map $cookie_new_fe $serve_request_from {
  default @uwsgi;
  "True" @proxy;
}

server {

  # ...

  # BEGIN Routes to switch based on value of $cookie_new_fe
  location ~ "^/my/complicated/regex$" {
    error_page 418 = $serve_request_from;
    return 418;
  }
  # END

  location / {
    error_page 418 = @uwsgi;
    return 418;
  }

  location @uwsgi {
    uwsgi_pass unix:///tmp/uwsgi-origserver.sock;
    include uwsgi_params;
    uwsgi_read_timeout 7200;
    client_max_body_size 20M;
  }

  location @proxy {
    proxy_pass https://other.server.com;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
}

Таким образом, я минимизирую дублирование во многих маршрутах, которые мне нужно будет добавить здесь в промежутке, пока эта миграция не будет завершена.

Связанный контент