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

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

新規登録して質問してみよう
ただいま回答率
85.50%
nginx

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

3回答

4621閲覧

Php-fpm×Nginx×ELBでremote IPを取得する方法

kenkbou

総合スコア151

nginx

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/11/25 11:03

お世話になります。

ELB => Nginx => PHP でアクセス元のIPを取得して国を判別したいと思っております。
以下の記事を参考にして記述をしてみたのですが、なかなかうまくいかずに困っています。

https://christina04.hatenablog.com/entry/2016/10/25/190000

nginx.conf

server { client_max_body_size 512M; root /var/www/html; index index.html index.htm index.php; set_real_ip_from 172.20.0.1/16; real_ip_header X-Forwarded-For; real_ip_recursive on; location / { try_files $uri $uri/ /index.php$is_args$args; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~ .*.php?$ { fastcgi_param REMOTE_ADDR $http_x_real_ip; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php-fpm.sock; fastcgi_index index.php; } }

PHP側で取得をしようとすると

PHP

1 if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 2 $ipArray = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 3 $ip = $ipArray[0]; 4 } else { 5 $ip = $_SERVER['REMOTE_ADDR']; 6 }

172.20.0.1が表示されてしまいます。

どのようにしてアクセス元のIPを取得することが可能でしょうか。

あまりnginxに関して詳しくなく、教えて頂けたら幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2018/11/25 11:20 編集

PHPでは、 $_SERVER['HTTP_X_FORWARDED_FOR'] と $_SERVER['REMOTE_ADDR'] のどちらの値を表示して、 172.20.0.1 となっているのでしょうか?
kenkbou

2018/11/25 11:46

ご回答ありがとうございます。今は、$_SERVER['REMOTE_ADDR']こちらの値が入って来ております。
guest

回答3

0

自己解決

最終的に
proxyサーバーを一つ追加して対応しました。

投稿2019/01/06 04:50

kenkbou

総合スコア151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実施した内容とかぶるかもしれませんが、以下最低限の手順を説明いたします。

nginx -Vを実行してconfigure arguments:--with-http_realip_moduleが含まれていれば利用できます。

Nginx設定ファイル/etc/nginx/nginx.confを以下のように設定します。

set_real_ip_from 172.31.0.0/16; #ELBに設定しているサブネットのネットワークアドレス real_ip_header X-Forwarded-For;

nginx再起動

sudo service nginx restart

以上で

投稿2018/11/26 01:27

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenkbou

2018/11/27 08:37

ありがとうございます。 --with-http_realip_moduleこちらも含まれていました。 nginx.confに記述もして再起動を行なったのですが、同じ結果でした。 PHP側ではどのような値で入って来ますでしょうか。 $_SERVERを見てみたのですが、それらしき値は見当たりませんでした。。。
moonphase

2018/11/27 09:08

$_SERVER["REMOTE_ADDR"]に設定されます。 あと考えられるのはELBのアドレス帯が間違っている可能性です。 以下設定を入れて確認してもらえますか? set_real_ip_from 0.0.0.0/0; set_real_ip_from ::0/0;
kenkbou

2018/11/27 12:12

ありがとうございます。 やはり試してみたのですが、『"172.20.0.1』が入って来てしまいます。。。
moonphase

2018/11/27 12:14

ELBがアプリレベルではなくネットワークレベルという事はないでしょうか?
kenkbou

2018/11/27 13:26

いえ、アプリごとに設定をしております。『172.20.0.1』こちらのIPがそもそもどこから来ているのかが不明です、、
moonphase

2018/11/28 00:12

そのIPアドレスはELBのアドレスですよね?ご自身でset_real_ip_fromに設定しているので。
kenkbou

2018/11/28 07:50

ありがとうございます。お手数おかけして申し訳ありません、、行き詰ってしまいました
moonphase

2018/11/28 08:33

一点確認させてください。ELBのリスナーの設定で「ロードバランサーのプロトコル」は何になっていますか?
kenkbou

2018/11/28 11:01

arn:aws:elasticloadbalancing:ap-northeast-1 このような形でしょうか。
guest

0

$_SERVER['REMOTE_ADDR'] が参照されているということは、条件で指定している $_SERVER['HTTP_X_FORWARDED_FOR'] が、設定されていない状況ということですね。


  1. nginx.conf の Server に listen や server_name が記載されていないようですが、これは、転記の際に省略されているだけでしょうか?

listen 80;
server_name example.com www.example.com;

  1. nginx の設定ファイルを書き換えた後に nginx の再起動が必要ですが、再起動されているでしょうか?

投稿2018/11/25 12:31

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenkbou

2018/11/27 08:44

ありがとうございます。 > 1) nginx.conf の Server に listen や server_name が記載されていないようですが、これは、転記の際に省略されているだけでしょうか? はい、そうなります。 > 2) nginx の設定ファイルを書き換えた後に nginx の再起動が必要ですが、再起動されているでしょうか? 再起動も行なっております。 なぜかうまくいかないですね、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問