成功せずに、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を解決するリゾルバが定義されていません
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分の固定値を使用していました。
ドメイン名がハードコードされているため、nginxが設定時ではなく実行時にドメイン名の解決に失敗しているのは少し奇妙に思えます。 resolver
宣言をロケーションブロックに追加すると、通常、実行時に発生するDNSの問題が修正されます。したがって、ロケーションブロックは次のようになります。
location ^~ /freegeoip/ {
#use google as dns
resolver 8.8.8.8;
proxy_pass http://freegeoip.net/json/$remote_addr;
}
このソリューションは、しばらく前に読んだ記事に基づいています- プロキシパスとリゾルバ 。読む価値があるでしょう。
Nginx server port
の中に proxy_pass uri
。これで問題は解決しました。
まだ問題が発生している場合は、私にとっては助けました 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/;
}
}