Řešení 1:
Přijatá odpověď pro mě na nginx/1.4.2 nefungovala.
Použití proměnné v proxy_pass
vynutí opětovné rozlišení názvů DNS, protože NGINX zachází s proměnnými jinak než se statickou konfigurací. Z NGINX proxy_pass
dokumentace:
Hodnota parametru může obsahovat proměnné. V tomto případě, pokud je jako název domény uvedena adresa, je název prohledán mezi popsanými skupinami serverů, a pokud není nalezen, je určen pomocí resolveru.
Například:
server {
...
resolver 127.0.0.1;
set $backend "http://dynamic.example.com:80";
proxy_pass $backend;
...
}
Poznámka:Aby to fungovalo, MUSÍ být k dispozici a nakonfigurován překladač (tj. jmenný server, který se má použít) (a položky v /etc/hosts
soubor nebude použit při vyhledávání).
Ve výchozím nastavení verze 1.1.9 nebo novější verze NGINX mezipaměti odpovědi používající hodnotu TTL odpovědi a volitelný valid
parametr umožňuje přepsat čas mezipaměti:
resolver 127.0.0.1 [::1]:5353 valid=30s;
Před verzí 1.1.9 nebylo ladění času ukládání do mezipaměti možné a nginx vždy ukládal odpovědi do mezipaměti po dobu 5 minut. .
Řešení 2:
V komentáři gansbrest a odpovědi ohaal jsou cenné informace.
Ale myslím, že je důležité zmínit tento oficiální článek nginx, zveřejněný v roce 2016, jasně vysvětluje chování nginx v této záležitosti a možná řešení:https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Opravdu musíme "Nastavit název domény v proměnné" a použít direktivu resolveru.
použití proměnné však změní chování při přepisování. Možná budete muset použít direktivu rewrite, záleží na vaší poloze a nastavení proxy_pass.
PS:napsal bych komentář, ale zatím není dost bodů...
Řešení 3:
Je to zajímavá otázka a AFAIK, která nebude fungovat dobře. Můžete zkusit použít upstream modul a použít direktivy pro převzetí služeb při selhání, abyste zjistili, zda to funguje jako hack.
2018 edit:hodně věcí se změnilo. Zkontrolujte odpověď @ohaal a získejte o tom skutečné informace.
Řešení 4:
Ohaalova odpověď tam zavede většinu z nás, ale existuje případ, kdy DNS resolver nežije na 127.0.0.1 (např. když jste ve speciálním kontejnerovém prostředí)
V takovém případě možná budete chtít změnit nginx conf na resolver ${DNS_SERVER};
. Poté, než spustíte nginx, spusťte
export DNS_SERVER=$(cat /etc/resolv.conf |grep -i '^nameserver'|head -n1|cut -d ' ' -f2)
envsubst '${DNS_SERVER}' < your_nginx.conf.template > your_nginx.conf
Všimněte si, že potřebujete gettext
balíček nainstalován, protože poskytuje envsubst
příkaz.