ReverseProxy(Squid) + Apache + mod_rpafで接続元IPを出力してみたの巻

スポンサーリンク

ReverseProxyにSquidを利用すると、外部からの80番へのアクセスはSquidが受け、外からのWebアクセスはSquidが“代行”することとなる。無論、これが「Proxy」の役目。Squidは渡されたWebアクセスをApacheに渡すという仕事をしている。

さて、問題になるのは、Apacheにアクセスするクライアント(接続元)はこのReverseProxyになってしまうので、Aapcheのaccess_logやerror_logにて記録される接続元IPアドレスがReverseProxyのIPアドレスになってしまう。この影響を受けるのは、PHPで利用する「$_SERVER[“REMOTE_ADDR”]」などその他のWebアプリケーションにも影響を与える。

今までは、access_logに関しては「%{X-Forwarded-for}i」を用いることでSquidが付与する接続元IPアドレス情報「X-Forwarded-For」を接続元情報として利用していました。また、WordPressでも接続元IPアドレスを正しく認識するように、以下の記述をwp-config.phpに記述していました。

// added for reverse proxy
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $list[0];
}

これでApacheのaccess_logと、WordPressに記録されるコメント接続元やアクセス元に関しては問題なく処理されるようになったのですが、error_logに関してはApacheの仕様上出力フォーマットは変更できないためSquidのIPアドレスであるlocalhostのIPアドレス「127.0.0.1」が出力されておりました。これでも良かったのですが、error_logにNotFoundを連発させるようなアクセスがあると、その時間帯からSquidのアクセスログを掘り出してやっとこさ接続元がわかるなどちょっと手間がかかっていました。

そこで、今回見つけた「mod_rpaf」をインストールし利用してみたところ、すっきりと問題を解決してくれたので「mod_rpaf」モジュールのインストール方法を書いておきます。

「mod_rpaf」の概要を理解されたい場合は以下URLにアクセスし御一読を。

mod_rpaf for Apache
http://stderr.net/apache/rpaf/

1.以下URLにアクセスし最新のバージョンのリンクをコピーします。

http://stderr.net/apache/rpaf/download/

2.インストールしたいサーバーの/tmp/ディレクトリに移動し、wgetでダウンロードしてきます。

[root@vps1 ~]# cd /tmp
[root@vps1 tmp]#
[root@vps1 tmp]# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
--2011-11-27 02:06:06--  http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
Resolving stderr.net... 173.8.116.123
Connecting to stderr.net|173.8.116.123|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7695 (7.5K) [application/x-tar]
Saving to: `mod_rpaf-0.6.tar.gz'

100%[======================================>] 7,695       38.7K/s   in 0.2s

2011-11-27 02:06:07 (38.7 KB/s) - `mod_rpaf-0.6.tar.gz' saved [7695/7695]

[root@vps1 tmp]#

3.ダウンロードしてきたファイルをtarで展開し、作成されたディレクトリに移動しlsして確認します。

[root@vps1 tmp]# tar zxf mod_rpaf-0.6.tar.gz
[root@vps1 tmp]#
[root@vps1 tmp]# cd mod_rpaf-0.6
[root@vps1 mod_rpaf-0.6]# ls -al
total 64
drwxr-xr-x 3 1000 users 4096 Jan  2  2008 .
drwxrwxrwt 4 root root  4096 Nov 27 02:06 ..
-rw-r--r-- 1 1000 users  758 Jan  2  2008 CHANGES
-rw-r--r-- 1 1000 users 1342 Dec 13  2007 Makefile
-rw-r--r-- 1 1000 users  888 Nov 26  2007 README
-rwxr-xr-x 1 1000 users  745 Dec 13  2007 gen_tests.sh
-rw-r--r-- 1 1000 users 1104 Jan  1  2008 httpd-rpaf.conf-template
-rw-r--r-- 1 1000 users 1200 Jan  1  2008 httpd-rpaf.conf-template-2.0
-rw-r--r-- 1 1000 users 9652 Jan  1  2008 mod_rpaf-2.0.c
-rw-r--r-- 1 1000 users 9866 Jan  1  2008 mod_rpaf.c
drwxr-xr-x 3 1000 users 4096 Jan  2  2008 t
-rw-r--r-- 1 1000 users 3360 Jan  2  2008 test-Makefile-template
[root@vps1 mod_rpaf-0.6]#

4.apxsコマンドを用いてmoduleを追加します。
apxsコマンドがインストールされていない場合は yum -y install http-devel でインストールできます。

[root@vps1 mod_rpaf-0.6]# apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
/usr/lib/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -pthread -I/usr/include/httpd  -I/usr/include/apr-1   -I/usr/include/apr-1   -c -o mod_rpaf-2.0.lo mod_rpaf-2.0.c && touch mod_rpaf-2.0.slo
/usr/lib/apr-1/build/libtool --silent --mode=link gcc -o mod_rpaf-2.0.la  -rpath /usr/lib/httpd/modules -module -avoid-version    mod_rpaf-2.0.lo
/usr/lib/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib/apr-1/build/libtool' mod_rpaf-2.0.la /usr/lib/httpd/modules
/usr/lib/apr-1/build/libtool --mode=install cp mod_rpaf-2.0.la /usr/lib/httpd/modules/
cp .libs/mod_rpaf-2.0.so /usr/lib/httpd/modules/mod_rpaf-2.0.so
cp .libs/mod_rpaf-2.0.lai /usr/lib/httpd/modules/mod_rpaf-2.0.la
cp .libs/mod_rpaf-2.0.a /usr/lib/httpd/modules/mod_rpaf-2.0.a
chmod 644 /usr/lib/httpd/modules/mod_rpaf-2.0.a
ranlib /usr/lib/httpd/modules/mod_rpaf-2.0.a
PATH="$PATH:/sbin" ldconfig -n /usr/lib/httpd/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/lib/httpd/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib/httpd/modules/mod_rpaf-2.0.so
[root@vps1 mod_rpaf-0.6]#

5.mod_rpafモジュールのインストールが完了したので、後はこれを読み込む設定を追加します。

/etc/httpd/conf.d/mod_rpaf.conf を作成します。
RPAFproxy_ips にはReverseProxyとして利用しているIPアドレスを設定します。

[root@vps1 mod_rpaf-0.6]# vi /etc/httpd/conf.d/mod_rpaf.conf
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For

6.最後にインストールに利用したファイルの削除とApacheの再読み込みを行えば完了です。

[root@vps1 mod_rpaf-0.6]# cd
[root@vps1 ~]# rm -rf /tmp/mod_rpaf-0.6*
[root@vps1 ~]#
[root@vps1 ~]# service httpd configtest
Syntax OK
[root@vps1 ~]#
[root@vps1 ~]# service httpd reload
Reloading httpd:                                           [  OK  ]
[root@vps1 ~]#

access_logやerror_logを確認したり、PHPの「$_SERVER[“REMOTE_ADDR”」の解釈に変化があるかなどお試しください。

<?php
  print $_SERVER["REMOTE_ADDR"];
?>

以上

コメント

タイトルとURLをコピーしました