サーバーにMEAN Stackアプリケーションをデプロイし、プロキシサーバーとしてNginxを使用してリクエストを処理し、アプリケーションの特定のポートにリダイレクトしています。
例:ユーザーがURL http://www.example.com/
にアクセスすると、アプリケーションがポート1234で実行されているため、Nginxが実際のアプリケーションURL http://www.example.com:1234/
にヒットします。
さて、分析のために、node.jsで短いスクリプトを作成し、WebサイトにアクセスしたユーザーのIPと場所を取得します。外部で検索されたクエリは表示できますが、自分のサーバーのIPアドレスと場所を取得しています。何故ですか?
Nginxが原因ですか?これを解決してユーザーの実際の場所を取得するにはどうすればよいですか?
これが、パス/etc/nginx/conf.d/example.com.conf
に配置されたNginx Confです。
server {
listen 80;
listen [::]:80;
server_name example.com;
proxy_set_header Host $http_Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass "http://localhost:1234/";
}
}
他のNginx Confは必要ありませんでした。以前の実装では、/etc/nginx/sites-available/default
ディレクトリに別のconfファイルがあり、サーバー名の重複として競合していました。最後に、変更をリセットする前にNginx Testingコマンドを使用するコマンドを追加したいと思います。これは大きな助けでした。 コマンド:nginx -t
。
Node.jsでは、これがクライアントのIPアドレスにアクセスする最も適切な方法です。
var getClientAddress = (req.headers['x-forwarded-for'] || '').split(',')[0]
|| req.connection.remoteAddress;
console.log(getClientAddress);
乾杯;-)
メインアプリケーションサーバーはプロキシサーバーの背後にあるので、プロキシサーバーのIPアドレスが表示されます。これは、事実上、アプリケーションサーバーへの要求を行う「クライアント」であるためです。
プロキシサーバーへの要求を行うクライアントのIPアドレス(発信元IPアドレス)が必要です。この情報を取得する唯一の方法は、プロキシサーバーが要求を行ったIPアドレスを渡す場合です。プロキシサーバーは通常、X-Forwarded-For
HTTP要求ヘッダーを使用してこれを行います。
X-Forwarded-For: <client-ip-address>
ただし、複数のプロキシサーバーがパススルーされている場合、このヘッダーには複数のIPアドレス(カンマ区切り)を含めることができます。
X-Forwarded-For: <client-ip-address>, <previous-proxy-ip>