60

我试图在我的 proxy_pass 中包含 $remote_addr 或 $http_remote_addr 但没有成功。

重写规则有效

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

没有 $remote_addr 的 proxy_pass 有效,但 freegeoip 不读取 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;
}

然后,我将 ip 添加到请求的末尾,如下所示:

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

但是nginx报这个错误:没有定义解析器来解析freegeoip.net

4

6 回答 6

165

如果 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 分钟的固定值。

于 2014-03-07T19:33:47.343 回答
74

nginx 在运行时而不是在配置时解析域名似乎有点奇怪(因为域名是硬编码的)。向 location 块添加resolver声明通常可以修复运行时遇到的 dns 问题。因此,您的位置块可能如下所示:

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

该解决方案基于我不久前阅读的一篇文章 -代理传递和解析器。值得一读。

于 2013-07-23T09:03:45.853 回答
9

如果有人遇到麻烦,对我来说,它有助于将 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/;
  }
}
于 2017-12-25T14:17:31.837 回答
0

你也可以server portproxy_pass uri. 这为我解决了这个问题。

于 2014-12-10T06:19:36.797 回答
0

另一种方法是您可以提供您的主机ip地址和port号码,而不是主机URLproxy_pass如下所示:

您的代码: proxy_pass http://freegeoip.net/json/;

更新代码 proxy_pass http://10.45.45.10:2290/json/;

于 2021-02-09T02:29:37.693 回答
0

尝试使用 dig / nslookup 确保这仍然是 nginx 问题。在我的情况下,问题是我的 nginx 和根 dns 之间的一个 dns 服务器不遵守小至 1 秒的 TTL 值。

Nginx 不会重新解析 Docker 中的 DNS 名称

于 2022-01-10T15:23:43.323 回答