web-dev-qa-db-ja.com

$ remote_addrを使用したNginx proxy_pass

成功せずに、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を解決するリゾルバが定義されていません

32
david.sansay

Proxy_passステートメントに変数が含まれていない場合、起動時または再読み込み時に「gethostbyaddr」システムコールが使用され、その値が永続的にキャッシュされます。

次のいずれかを使用するなど、変数がある場合:

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

次に、nginxは組み込みリゾルバーを使用し、「リゾルバー」ディレクティブmustが存在します。 「レゾルバ」はおそらく誤った呼び名です。 「組み込みのリゾルバが使用するDNSサーバー」と考えてください。 nginx 1.1.9以降、組み込みのリゾルバはDNS TTL値を尊重します。それ以前は、5分の固定値を使用していました。

100
Chris Cogdon

ドメイン名がハードコードされているため、nginxが設定時ではなく実行時にドメイン名の解決に失敗しているのは少し奇妙に思えます。 resolver宣言をロケーションブロックに追加すると、通常、実行時に発生するDNSの問題が修正されます。したがって、ロケーションブロックは次のようになります。

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

このソリューションは、しばらく前に読んだ記事に基づいています- プロキシパスとリゾルバ 。読む価値があるでしょう。

50
Rob Squires

Nginx server port の中に proxy_pass uri。これで問題は解決しました。

0
RijulB

まだ問題が発生している場合は、私にとっては助けました 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/;
  }
}
0
AmazingTurtle