2017年8月3日木曜日

裏のApacheでクライアントのIPアドレスを知る

前回Nginxをリバースプロキシとし、
Apacheをその裏に持っていきましたが、
ちょっと困ったことが。

Apache+PHPでアクセス元のウェブブラウザのIPアドレスを
$ip=$_SERVER["REMOTE_ADDR"];
で取得しようとしても
常にlocalhostの"127.0.0.1"になってしまいます。
まあApacheにアクセスしているのは
ローカルのリバースプロキシNginxなんですから
当たり前と言えば当たり前です。
しかしそれでは実用上困ります。

これには対処法があり、Nginxの設定に前回同様
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
を加えておくことで解決できます。
これにより
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];
でウェブブラウザのIPアドレスが分かります。
もしリバースプロキシ経由と直接の両方に対応したければ
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];
if(strlen($ip)==0)
    $ip=$_SERVER["REMOTE_ADDR"];
とでもしておけばいいでしょう。

さて、アクセス元IPアドレスが知りたいのはログファイルでも同様です。
Apacheのログが"127.0.0.1"からのアクセスで埋め尽くされても困ります。
無論NginxとApacheのログをタイムスタンプで照らし合わせれば
本当のアクセス元も分かりますが、そんな面倒な事はしたくありません。
実は先の件と同様に、ApacheのログにブラウザのIPアドレスを
記録する方法はあります。

"/etc/apache2/sites-available/"ディレクトリ下の設定ファイルで
CustomLog設定を片っ端から確認すると、
"combined"と"vhost_combined"が使われている事が分かります。
ということで、設定ファイル"/etc/apache2/apache2.conf"の
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
の行を
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Forwarded-For}i\"" combined
のように変更します。
Apacheを再起動すれば、アクセスログの各行の末尾に
ウェブブラウザのIPアドレスが追加されています。
プロキシ経由でない直接アクセスの場合は"-"と記録されます。

とりあえずこれぐらいしておけば運用でも困らないでしょう。

0 件のコメント:

コメントを投稿