Używam nginx / 0.7.68, działający na CentOS, w następującej konfiguracji:
server {
listen 80;
server_name ***;
index index.html index.htm index.php default.html default.htm default.php;
location / {
root /***;
proxy_pass http://***:8888;
index index.html index.htm;
}
# where *** is my variables
Jest proxy_pass
to rekord DNS, którego adres IP często się zmienia. Nginx zapisuje w pamięci podręcznej nieaktualny adres IP, w wyniku czego żądanie jest wysyłane na niewłaściwy adres IP.
Jak mogę powstrzymać nginx przed buforowaniem adresu IP, gdy jest on nieaktualny?
Odpowiedzi:
To intrygujące pytanie i AFAIK, który nie zadziała dobrze. Możesz spróbować użyć modułu nadrzędnego i skorzystać z dyrektyw w celu przełączenia awaryjnego, aby sprawdzić, czy działa on jako hack.
Edycja 2018: wiele się zmieniło. Sprawdź odpowiedź @ohaal, aby uzyskać prawdziwe informacje na ten temat.
źródło
server
flaga wysyłania,resolve
która jest dostępna tylko w wersji komercyjnej (patrz nginx.org/en/docs/http/ngx_http_upstream_module.html#server )Zaakceptowana odpowiedź nie działała dla mnie na nginx / 1.4.2.
Użycie zmiennej
proxy_pass
wymusza ponowne rozpoznawanie nazw DNS, ponieważ NGINX traktuje zmienne inaczej niż konfiguracja statyczna. Z dokumentacji NGINXproxy_pass
:Na przykład:
Uwaga: resolver (tzn.
/etc/hosts
Używany serwer nazw) MUSI być dostępny i skonfigurowany, aby działał (a wpisy w pliku nie będą używane podczas wyszukiwania).Domyślnie, wersja 1.1.9 lub nowsze wersje pamięci podręcznej NGINX odpowiadają przy użyciu wartości TTL odpowiedzi, a opcjonalny
valid
parametr pozwala na przesłonięcie czasu pamięci podręcznej:Przed wersją 1.1.9 strojenie czasu buforowania nie było możliwe, a nginx zawsze buforował odpowiedzi przez 5 minut. .
źródło
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Dodałem go do odpowiedzi dla jasności.set
wnętrzelocation
nie działa poprawnie. UwagaBy default, nginx caches answers using the TTL value of a response. An optional valid parameter allows overriding it: resolver 127.0.0.1 [::1]:5353 valid=30s;
resolver 127.0.0.11 [::1]:5353 valid=15s;
W komentarzu gansbrest i odpowiedzi na temat odpowiedzi znajduje się cenna informacja.
Ale myślę, że ważne jest, aby wspomnieć o tym oficjalnym artykule nginx, opublikowanym w 2016 roku, jasno wyjaśnia zachowanie nginx w tej sprawie i możliwe rozwiązania: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Rzeczywiście musimy „ustawić nazwę domeny w zmiennej” i zastosować dyrektywę resolvera .
jednak użycie zmiennej zmienia zachowanie przepisywania. Może być konieczne użycie dyrektywy przepisywania, zależy to od lokalizacji i konfiguracji proxy_pass.
PS: dodałby komentarz, ale za mało punktów ...
źródło
Odpowiedź firmy ohaal zabiera większość z nas, ale zdarza się, że program rozpoznawania nazw DNS nie działa w wersji 127.0.0.1 (np. gdy znajdujesz się w specjalnym środowisku kontenerowym)
W takim przypadku możesz zmienić conf nginx na
resolver ${DNS_SERVER};
. Następnie, zanim uruchomisz nginx, uruchomźródło
Zhakowałem razem skrypt, aby oglądać folder conf.d w górę w poszukiwaniu zmian dns i przeładować nginx po wykryciu. Jest to pierwszy przebieg i na pewno można go ulepszyć (w następnym przejściu użyję nginx -T, aby parsować strumienie danych. Ten sam pomysł można zastosować w przypadku dyrektyw proxy_pass):
źródło