web-dev-qa-db-ja.com

ユーザーの訪問ではなく、自分のサーバーのIPアドレスと場所を取得する

サーバーにMEAN Stackアプリケーションをデプロイし、プロキシサーバーとしてNginxを使用してリクエストを処理し、アプリケーションの特定のポートにリダイレクトしています。

例:ユーザーがURL http://www.example.com/にアクセスすると、アプリケーションがポート1234で実行されているため、Nginxが実際のアプリケーションURL http://www.example.com:1234/にヒットします。

さて、分析のために、node.jsで短いスクリプトを作成し、WebサイトにアクセスしたユーザーのIPと場所を取得します。外部で検索されたクエリは表示できますが、自分のサーバーのIPアドレスと場所を取得しています。何故ですか?

Nginxが原因ですか?これを解決してユーザーの実際の場所を取得するにはどうすればよいですか?

6
Dynamic Remo

これが、パス/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);

乾杯;-)

4
Dynamic Remo

メインアプリケーションサーバーはプロキシサーバーの背後にあるので、プロキシサーバーのIPアドレスが表示されます。これは、事実上、アプリケーションサーバーへの要求を行う「クライアント」であるためです。

プロキシサーバーへの要求を行うクライアントのIPアドレス(発信元IPアドレス)が必要です。この情報を取得する唯一の方法は、プロキシサーバーが要求を行ったIPアドレスを渡す場合です。プロキシサーバーは通常、X-Forwarded-For HTTP要求ヘッダーを使用してこれを行います。

X-Forwarded-For: <client-ip-address>

ただし、複数のプロキシサーバーがパススルーされている場合、このヘッダーには複数のIPアドレス(カンマ区切り)を含めることができます。

X-Forwarded-For: <client-ip-address>, <previous-proxy-ip>
1
MrWhite