GNU/Linux >> Znalost Linux >  >> Linux

Jak přinutit nginx, aby přeložil DNS (dynamického názvu hostitele) pokaždé, když děláte proxy_pass?

Ř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.


Linux
  1. Jak zakázat ETag v NGINX

  2. Jak povolit HTTP2 v NGINX

  3. Odstraňování problémů:Nelze vyřešit název hostitele

  1. Jak přeložit název hostitele na IP adresu v Bash skriptu?

  2. Jak zjistit zatížení spustitelných souborů dynamických knihoven při spuštění?

  3. Odstraňování problémů s DNS. Campus Domain se při používání Campus Network nevyřeší?

  1. Jak používat Nginx k přesměrování

  2. nginx - 413 entita požadavku je příliš velká

  3. Jak změnit název hostitele v Debianu