2013-07-16 25 views
15

Próbuję dołączyć $ remote_addr lub $ http_remote_addr na moim proxy_pass bez powodzenia.

Reguła przepisać działa

location ^~ /freegeoip/ { 
    rewrite^http://freegeoip.net/json/$remote_addr last; 
} 

proxy_pass bez $ REMOTE_ADDR działa, ale freegeoip nie czyta x-Real-IP

location ^~ /freegeoip/ { 
    proxy_pass http://freegeoip.net/json/; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $host; 
} 

Następnie Dodaję do ip na koniec żądania, tak:

location ^~ /freegeoip/ { 
    proxy_pass http://freegeoip.net/json/$remote_addr; 
} 

, ale nginx zgłosić ten błąd: nie określono resolwera rozwiązać freegeoip.net

+0

czy błąd występuje po ponownym uruchomieniu nginx, lub gdy żądanie http trafi blok lokalizacji? –

+0

Gdy żądam adresu URL –

Odpowiedz

60

Jeśli instrukcja proxy_pass nie zawiera żadnych zmiennych, użyje wywołania systemowego "gethostbyaddr" podczas uruchamiania lub przeładowania i będzie trwale buforować tę wartość.

czy są jakieś zmienne, takie jak przy użyciu jednej z następujących powodów:

set $originaddr http://origin.example.com; 
proxy_pass $originaddr; 
# or even 
proxy_pass http://origin.example.com$request_uri; 

Następnie nginx będzie używać wbudowanej rezolwerem, a „rezolwer” dyrektywa musi być obecny. "resolver" jest prawdopodobnie mylącą nazwą; pomyśl o tym, "co serwer DNS użyje wbudowanego przelicznika". Od wersji nginx 1.1.9 wbudowany przelicznik będzie honorował wartości DNS TTL. Wcześniej używał stałej wartości 5 minut.

+1

To jest jeszcze bardziej przydatna i pouczająca odpowiedź. Dziękuję Ci. –

+0

Tak, to bardzo przydatne, dziękuję. – jwerre

+0

Klucz jest dowolną zmienną występującą w wartości proxy_pass, dzięki za właściwą odpowiedź i wyjaśnienie. –

35

Wydaje się nieco dziwne, że nginx nie jest w stanie rozwiązać nazwy domeny w czasie wykonywania, a nie w czasie konfiguracji (ponieważ nazwa domeny jest zakodowana na sztywno). Dodanie deklaracji resolver do bloku lokalizacji zwykle rozwiązuje problemy dns występujące w środowisku wykonawczym. Więc twój blok lokalizacja może wyglądać następująco:

location ^~ /freegeoip/ { 
    #use google as dns 
    resolver 8.8.8.8; 
    proxy_pass http://freegeoip.net/json/$remote_addr; 
} 

Rozwiązanie to opiera się na artykule czytałem jakiś czas temu - Proxy pass and resolver. Byłoby warto przeczytać.

+6

Czy ** NIE ** używaj publicznie dostępnego serwera DNS, takiego jak '8.8.8.8'. [Aby zapobiec fałszowaniu DNS, zaleca się skonfigurowanie serwerów DNS w odpowiednio zabezpieczonej zaufanej sieci lokalnej.] (Http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

+0

To powinna być zaakceptowana odpowiedź, ponieważ Obejmuje inne przypadki, takie jak args, remote_addr, itp. – onalbi

0

Można również wspomnieć o swoim nginx server port w proxy_pass uri. To rozwiązało problem dla mnie.

0

Jeśli ktoś stll przeżywa kłopoty, dla mnie to pomogło przenieść hosta proxy_pass na oddzielna pod prąd, więc wymyślić coś takiego

upstream backend-server { 
    server backend.service.consul; 
} 

server { 
    listen  80; 
    server_name frontend.test.me; 

    location ~/api(.*)$ { 
    proxy_pass http://backend-server$1; 
    } 
    location/{ 
    # this works mystically! backend doesn't... 
    proxy_pass http://frontend.service.consul/; 
    } 
} 
Powiązane problemy