質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • nginx

    1032questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

nginxでリバースプロキシを使った際に取得したIPアドレスが127.0.0.1になっている

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,522

CyberMergina

score 275

nginxとnodeサーバーを使ったアプリで現象が起きています。

IPアドレスは、socket.io の「handshake.address」を使って取得しようとしています。

nginxでリバースプロキシを使うとヘッダー情報のIPアドレスが127.0.0.1に書き換わる(?)という事象があるというのは

サイトでいくつか見て、それぞれ対処法を試してみたのですが、変化ありません。。

おかしなところがありましたら、ご教授頂きたいです。

よろしくお願い致します。

  • サブドメイン(仮):hoge.huga.jp
  • NodeのHttpサーバー:http://0.0.0.0:2222
  • Nodeのwsサーバー:http://0.0.0.0:1111

 設定ファイル

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # ! modified ! #
    gzip on;
    proxy_buffering on;
    proxy_buffer_size   8k;
    proxy_buffers       100 8k;

    server_tokens off;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Client-IP $remote_add;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    include /etc/nginx/conf.d/*.conf;
}

default.conf

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    # demo site(http://demo.localhost/)
    listen       80;
    server_name  demo.localhost;
    root         /var/www/hoge/demo_site;
    index        index.html;
}

server {
    listen 80;
    server_name hoge.huga.jp;

    location / {
      proxy_set_header Host $http_host;
      proxy_pass http://0.0.0.0:2222;
    }

    location /socket.io/ {
      proxy_pass http://0.0.0.0:1111;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }

    location /socket/ {
      proxy_pass http://0.0.0.0:1111/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }

}

server {
    listen 443;
    server_name hoge.huga.jp;

    location / {
      proxy_pass http://0.0.0.0:2222;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }
}

server {
    listen      80 default_server;
    server_name _;
    return      444;
}

socket_ctrl.js

~ 省略 ~

  //接続確立時の処理
  connect = io.sockets.on('connection', function (socket) {

      // 接続時
      socket.on('connected', function (r) {
console.log(socket.handshake); // ひとまずここでヘッダー情報をとれるか確認してます。

(※原因はnginxの設定ファイルだと今のところ思っているので、websocketはタグ付けしません。)


解決方法

結局、serverのレベルに「X-Forwarded-For」の設定を入れていたので効いていなかったようです。 以下のように location のレベルに指定をいれて動くようになりました。 ※nginx.confの「proxy_set_header」は全て削除しました。

server {
    listen 80;
    server_name hoge.huga.jp;

    location / {
      proxy_pass http://0.0.0.0:2222;
    }

    location /socket.io/ {
      proxy_pass http://0.0.0.0:1111;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }

    location /socket/ {
      proxy_pass http://0.0.0.0:1111/;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Module ngx_http_realip_moduleを使用されているようですが、
これは指定したHTTPヘッダから、nginxへの接続元のアドレスを取得するもので、nginxの手前にプロクシなどがある場合に使用するものです。 今回は、nginxの手前には何もないと思いますので、関係ありません。 そのため、以下の設定は不要と思います。

set_real_ip_from   [グローバルIP];
real_ip_header    X-Forwarded-For;

逆に、以下のページにあるように、 自分でX-FORWARDED-FORなどに、nginxへの接続元のアドレスを設定する必要があります。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

centos7 - nginx でアクセス元のIPを正しく表示させる方法 - Qiita

さらに、handshake.addressは直接のTCP接続元を取得するもののようなので、
HTTPヘッダをみるには、 以下にあるように、handshake.headers['x-forwarded-for']を使うべきです。

express - How to get request’s HTTP headers with Socket.io? - Stack Overflow

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/09 20:50

    情報ありがとうございます!
    コピペでやっていたもので、意味を理解していませんでした・・・

    実際に「handshake.headers」の中身をログに出してみると「x-forwarded-for」が見当たりませんでした・・・

    header { connection: 'close',
    host: '0.0.0.0:1111',
    origin: 'http://xxxxxxxxxxx',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36 OPR/33.0.1990.115',
    accept: '*/*',
    referer: 'http://xxxxxxx/hogehoge/index.html',
    'accept-encoding': 'gzip, deflate, lzma, sdch',
    'accept-language': 'en-US,en;q=0.8,ja;q=0.6',
    cookie: 'io=xxxxxxxxxxxxxx' }

    明日原因を探ってみます・・・

    キャンセル

  • 2015/12/09 21:03

    すみません。
    こちらの調査不足で、回答の内容が誤っているようです。
    改めて調べたあと、更新します。

    キャンセル

  • 2015/12/09 21:46

    ngx_http_realip_moduleの機能を誤解していました。
    更新したので、確認お願いします。

    キャンセル

  • 2015/12/10 10:08

    追記、ありがとうございます!

    X-Forwarded-Forにセットされるように記述してみたのですが、ヘッダー情報は変わらずでした・・・
    ヘッダーへのセットについて足りないものがないか調査してみます!

    キャンセル

  • 2015/12/10 10:53

    ちょっとこちらで検証できず申し訳ないのですが、
    切り分けのために、X-Forwarded-forに固定の文字列を渡すようにしてみると、
    どうでしょうか?

    キャンセル

  • 2015/12/10 14:47

    返信遅れてしまい、大変申し訳ございません。
    X-Forwarded-for に「123.456.789.123」という文字列を渡してみましたが、
    結果は変わらずでした。

    キャンセル

  • 2015/12/11 14:58

    一旦、仮想環境を作り一から設定しなおしてみると
    X-Forwarded-Forを設定すると上手く取得できました!

    あとは違いを見てみることにします。
    ありがとうございました!

    キャンセル

  • 2015/12/11 14:59

    了解です。
    違いがハッキリしたら、
    ここに追記しておくと、
    他の人の役に立つかも知れません。

    キャンセル

  • 2015/12/14 15:44

    助言ありがとうございます!書いておきます!

    キャンセル

同じタグがついた質問を見る

  • nginx

    1032questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。