8wired

とりあえずやってみるブログ

Nginxのリバースプロキシでバックエンドにリモートアドレスを転送する

2016/06/14

 「NginxでWordPressのスマホページを高速化してみる」でNginxの設定変更するのと平行して、バックエンドのウェブサーバをNginxからApacheに変更したのですが、Apacheで取得したリモートアドレスが全てNginxのIPアドレスになっていたので改善してみました。

 まずバックエンドのApacheでリモートアドレスを取得するために、Nginx側でX-Forwarded-Forの設定を行います。X-Forwarded-Forは、プロキシを経由したときに接続元のIPアドレスを通知するために用意されている環境変数で、経由したプロキシのIPアドレスの履歴が格納されています。

location / {
        proxy_set_header Host              $http_host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

 次にX-Forwarded-Forに設定されているIPアドレスを、Apacheでリモートアドレスとして利用できるようモジュールを追加します。今回はmod_rpafというモジュールを利用しましたが、他にもmod_extract_forwardedというモジュールもあります。どちらも機能的には大きな違いはないと思います。

 ホームページ(http://stderr.net/apache/rpaf/)から最新版のmod_rpaf-0.6.tar.gzをダウンロードして任意の場所に展開します。

 上記のサイトは、現在閉鎖されてしまっているようです。こちらからダウンロードすることができます。

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar xvpfz mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6

 私の環境ではそのままだとmakeが通らなかったので、Makefileを修正してからmakeを行いました。

4
5
-APXS2=$(shell which apxs2)
+APXS2=$(shell which apxs)
make rpaf-2.0
make install-2.0

 インストールが完了したら、httpd.confに以下を追加して、Apacheをリスタートします。

LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For

 WordPressを利用していく上でバックエンドもNginxの構成の方が余計なリソースを消費せず高負荷時にも安心なのですが、Apacheを利用したほうが使い勝手がよさそうな気がしたので思い切って変更してみました。それぞれの良いところを上手に利用していければって思います。

-ITネタ
-