[英]Error with IP and Nginx as reverse proxy
我將我的Nginx配置為簡單的反向代理。
我只是使用基本設置
location / {
proxy_pass foo.dnsalias.net;
proxy_pass_header Set-Cookie;
proxy_pass_header P3P;
}
問題是,經過一段時間(幾天)后,nginx背后的網站變得無法訪問。 Indead nginx嘗試調用一個壞的ip(nginx背后的網站在我家后面的盒子里,我使用的是dyn-dns,因為我的ip不是固定的)。 這個dyn-dns總是有效的(我可以直接調用我的網站),但由於不明原因,Nginx卡住了這個...
如上所述,nginx只是在一段時間后給我504網關超時。 當我的IP在家里改變時,看起來錯誤就來了。 以下是錯誤日志示例:
[error] ... upstream timed out (110: Connection timed out) while connecting to upstream, client: my.current.ip, server: myreverse.server.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://my.old
.home.ip", host: "myreverse.server.com"
所以你知道為什么nginx使用ip而不是DN嗎?
如果proxy_pass
值不包含變量,則nginx會在加載配置時將域名解析為IP並將其緩存,直到重新啟動/重新加載它為止。 從性能的角度來看,這是可以理解的。
但是,在動態DNS記錄更改的情況下,這可能不是所希望的。 因此,根據您擁有或不擁有的許可證,有兩種選擇。
在這種情況下,使用上游塊並指定需要使用特定解析器定期解析哪個域名。 記錄TTL可以使用valid=time
參數覆蓋。 server
指令的resolve
參數將強制定期解析DN。
http {
resolver X.X.X.X valid=5s;
upstream dynamic {
server foo.dnsalias.net resolve;
}
server {
server_name www.example.com;
location / {
proxy_pass http://dynamic;
...
}
}
}
此功能已添加到Nginx + 1.5.12中。
在這種情況下,您還需要一個自定義解析器,如上一個解決方案中所示。 但要解決不可用的上游解決方案,您需要在proxy_pass
指令中使用變量。 這樣nginx也會使用解析器,尊重使用valid
參數指定的緩存時間。 例如,您可以使用域名作為變量:
http {
resolver X.X.X.X valid=5s;
server {
server_name www.example.com;
set $dn "foo.dnsalias.net";
location / {
proxy_pass http://$dn;
...
}
}
}
然后,您可能需要添加proxy_redirect
指令來處理重定向。
也許請查看http://forum.nginx.org/read.php?2,215830,215832#msg-215832
resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;
In such setup ip address of "foo.example.com" will be looked up
dynamically and result will be cached for 5 minutes.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.