2013-07-16 149 views
15

我想在我的proxy_pass包括$ remote_addr或$ http_remote_addr沒有成功。

重寫規則工作

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

的proxy_pass沒有$ REMOTE_ADDR工作,但freegeoip不讀取X-實時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; 
} 

然後,我添加的IP來請求的結尾,如下所示:

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

但nginx報告此錯誤:no resolver defined to re解決freegeoip.net

+0

,當你重新啓動nginx的確實發生了錯誤,或者當http請求遇到位置塊? –

+0

當我請求url –

回答

60

如果proxy_pass語句中沒有變量,那麼它將在啓動或重新加載期間使用「gethostbyaddr」系統調用,並將永久緩存該值。

如果有任何變量,如使用下列的:

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

然後nginx的會使用一個內置的解析器,並且「解析」指令必須存在。 「解析器」可能是一個誤稱。將其視爲「內置解析器使用什麼DNS服務器」。自nginx 1.1.9以來,內置的解析器將支持DNS TTL值。在此之前它使用5分鐘的固定值。

+1

這是一個_much_更有用和信息豐富的答案。謝謝。 –

+0

是的,這非常有用,謝謝。 – jwerre

+0

關鍵是存在於proxy_pass值中的任何變量,感謝您的正確答案和解釋。 –

35

似乎有點奇怪,nginx無法在運行時解析域名,而不是在配置時解析(因爲域名是硬編碼的)。向位置塊添加resolver聲明通常會修復運行時遇到的dns問題。 - Proxy pass and resolver

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

該解決方案是基於一個文章我讀了一段時間後:所以像你的位置塊可能看起來。值得一讀。

+6

Do ** NOT **使用可公開訪問的DNS服務器,如「8.8.8.8」。 [爲防止DNS欺騙,建議將DNS服務器配置在正確安全的可信任本地網絡中。](http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver) – Tim

+0

這應該是公認的答案,因爲它涵蓋了其他的情況,如args,remote_addr等 – onalbi

0

您還可以在proxy_pass uri中提及您的nginx server port。這解決了我的問題。

0

如果有人stll遇到問題,對我來說幫助到proxy_pass主機移動到一個單獨的上游,所以我想出了這樣的事情

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/; 
    } 
}