https upstream server и локальный backup http upstream

Fedor Dikarev fe на hamilton.rinet.ru
Сб Дек 16 09:50:15 UTC 2017


Привет!

Я тут пытаюсь навести красоту в одном конфиге Nginx-а и что-то пока
совсем беда :-(

Формулировка, правда, изначально довольно извращенная:
есть Nginx, по-умолчанию проксирует запрос в локально работающую node.
Но если в запросе есть заголовок X-Some-Header, то запрос
нужно спроксировать на другой сервер по https.
Второе но: если этот прокси недоступен/не ответил/просто 500-тит, то
сделать fallback опять на локальную node.

первая мысль была:
map $http_x_some_header $use_backend {
  "" http://localhost:7070;
  default https://remote_upstream;
}
upstream remote_upstream {
  server remote:443;
  server localhost:7070 backup;
}

но локальный сервер не https, и все не очень красиво :-(
думал тут еще поднять на этом же nginx локальный https на порту 7073,
проксировать в него как backup, но тут начинаются сложности с
сертификатами.

Опять же думал о другом варианте:
proxy_pass $use_backend;
error_page 500 502 504 = @fallback_local_node;

location @fallback_local_node {
  internal;
  proxy_pass http://localhost:7070;
}

но тут получается что если заголовка не было, node ответил 502, то мы
пойдем в node еще раз. Не то, чтобы прям ужас, но некрасиво
получается...

Может кто подскажет тут красивое решение?

Ну и как feature request: может можно добавить к опции backup для
директивы server в upstream еще какой-нибудь параметр backup_proto=http
или другую опцию backup_http, чтобы при переключении на backup сервер
менялся и протокол обращения.
-- 
Fedor Dikarev


Подробная информация о списке рассылки nginx-ru