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 remoteip
とCOPY
の行だけ。
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