Nginx(リバースプロキシ)からApacheにクライアントのグローバルIPを渡す方法

やりたいこと

このブログもそうなんですが、まずクライアントからのアクセスは全てNginxが受け取って、ソコからドメイン毎に必要なコンテナにアクセスをさばいています。 平たく言うとリバースプロキシを使っています。 とはいってもNginx-proxyが自動的にさばいてくれているのですが。

ただこの方法だと、Nginx-proxyから処理を渡されたアプリケーション側のWebサーバなどでは、アクセス元のクライアントIPがNginx-proxyのIPアドレスになってしまいます。 アクセスログにはアクセスしてきたクライアントのIPを記録したいのでコレはマズいです。 そこで、Nginx-proxyはデフォルトでちゃんとX-Forwarded-Forセットしてくれるので、コレを使ってちゃんとクライアントのIPを取得出来るようにします。

前提条件

DockerコンテナNginx-proxyを動かしていて、そのNginx-proxyから背後の別のDockerコンテナ上のApacheにプロキシさせます。 今回利用したApacheは、PHPが提供しているphp:7.4-apacheに入っているApache。 このイメージのApacheのバージョンは2.4で、mod_remoteipが付いているのでコレを利用します。

準備するファイル

000-default.conf

Apacheの標準の設定ファイル。

<VirtualHost *:80>
 
        # ...抜粋...
  
        # a2enmod remoteipを実行しておけばRemoteIPHeaderが使えるようになる
        RemoteIPHeader X-Forwarded-For
  
        # %aがリモートIPになる
        LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-remote-ip
  
        CustomLog ${APACHE_LOG_DIR}/access.log combined-remote-ip
  
        # ...抜粋...
  
</VirtualHost>

Dockerfile

今回GDライブラリを使うのに余計な処理が入っているけど、重要なのはs2enmod remoteipCOPYの行だけ。

FROM php:7.4-apache
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd \
    && a2enmod rewrite \
    && a2enmod remoteip
COPY 000-default.conf /etc/apache2/sites-available/

ビルド

後はコレでビルドすればOK!

まとめ

一旦内容を知ってしまえばどうというものでもないですね。 Dockerが前提ですが、基本的にNginxがX-Forwarded-Forを設定する部分さえ押さえておけば、Docker抜きにしても同じような感じで実現できるはずです。

公開日:2021/11/09

About me

ドイツの現地企業でWeb Developer/System Administratorとして働いているアラフォーおじさんです。

プログラミングとかコンピュータに関する事がメインですが、日常的なメモとか雑多なことも書きます。

Links :
目次

やりたいこと


前提条件


準備するファイル


000-default.conf


Dockerfile


ビルド


まとめ