Elastic Load Balancing を使用してウェブサーバーのログにクライアント IP アドレスをキャプチャする方法を教えてください。
ウェブサーバーに Elastic Load Balancing (ELB) を使用しており、ウェブサーバーのアクセスログにロードバランサーの IP アドレスが表示されています。代わりにクライアント IP アドレスをキャプチャしたいと考えています。
簡単な説明
ロードバランサーがインスタンスへの接続を確立するため、ウェブサーバーのアクセスログにはロードバランサーの IP アドレスが記録されます。ウェブサーバーのアクセスログにクライアントの IP アドレスをキャプチャするには、以下を設定します。
-
Application Load Balancer および HTTP/HTTPS リスナーが設定された Classic Load Balancer の場合は、X-Forwarded-For HTTP ヘッダーを追加してクライアント IP アドレスをキャプチャします。その後、これらの IP アドレスを記録するようにウェブサーバーのアクセスログを設定できます。
注: 場合によっては、X-FORWARDED-FOR ヘッダーがないか、空になることがあります。Application Load Balancer、Classic Load Balancer、Network Load Balancer によって開始されたヘルスチェックリクエストには、X-FORWARDED-FOR ヘッダーは含まれません。また、Network Load Balancer および TCP/SSL リスナーが設定された Classic Load Balancer は、受信リクエストに X-FORWARDED-FOR ヘッダーを追加しません。Application Load Balancer の場合は、Append 処理モードを選択して、X-FORWARDED-FOR ヘッダーを一貫して追加します。
-
TCP/SSL リスナーが設定された Classic Load Balancer の場合は、Classic Load Balancer とターゲットアプリケーションでプロキシプロトコルのサポートを設定します。
-
Network Load Balancer の場合、ターゲットをインスタンス ID で登録すると、ウェブサーバーを追加設定しなくてもクライアント IP アドレスを取得できます。手順については、「Target group attributes」(ターゲットグループ属性) を参照してください。
-
Network Load Balancer の場合、IP アドレスのみをターゲットとして登録できる場合は、ロードバランサーでプロキシプロトコルバージョン 2 を有効にします。手順については、「Proxy protocol」(プロキシプロトコル) を参照してください。
解決策
Application Load Balancer および HTTP/HTTPS リスナーが設定された Classic Load Balancer (Apache)
X-Forwarded-For HTTP ヘッダーを追加し、ウェブサーバーのアクセスログを設定するには、次の手順を実行します。
-
テキストエディタを使用して Apache 設定ファイルを開きます。場所は構成によって異なります。例えば、Amazon Linux と RHEL の場合は /etc/httpd/conf/httpd.conf、Ubuntu の場合は /etc/apache2/apache2.conf です。
-
次の例に示すように、LogFormat セクションに %{X-Forwarded-For}i を追加します。
... LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common ... -
変更を保存します。
-
Apache サービスをリロードします。使用するシステムに応じて、次のコマンドのいずれかを実行します。
Sysvinit、Debian ベースのシステム (Ubuntu など)、SUSE (SLES11 など)
# /etc/init.d/apache2 reloadSysvinit、RPM ベースのシステム (RHEL 6 や Amazon Linux など)、SUSE を除く
# /etc/init.d/httpd reloadSystemd、Debian ベースのシステム (Ubuntu など)、SUSE (SLES12 など)
# systemctl reload apache2RPM ベースのシステム (RHEL 7 や Amazon Linux 2 など)、SUSE を除く
# systemctl reload httpd -
Apache ウェブサーバーのアクセスログを開きます。場所は構成によって異なります。
-
クライアント IP アドレスが X-Forwarded-For ヘッダーの下に記録されるようになったことを確認します。
Application Load Balancer および HTTP/HTTPS リスナーが設定された Classic Load Balancer (NGINX)
X-Forwarded-For HTTP ヘッダーを追加し、ウェブサーバーのアクセスログを設定するには、次の手順を実行します。
-
テキストエディタを使用して NGINX 設定ファイルを開きます。通常、この場所は /etc/nginx/nginx.conf です。
-
次の例のように、LogFormat セクションに $http_x_forwarded_for を追加します。
http { ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; ... } -
変更を保存します。
-
NGINX サービスをリロードします。Amazon Linux 2 または RHEL の場合は、次のコマンドを実行します。
systemctl reload nginx注: NGINX サービスをリロードするコマンドは、他のシステムでは異なります。NGINX をリロードするコマンドは、前のセクションの Apache サービスをリロードするコマンドと似ています。
-
NGINX ウェブサーバーのアクセスログを開きます。場所は構成によって異なります。
-
クライアント IP アドレスが X-Forwarded-For ヘッダーの下に記録されるようになったことを確認します。
TCP/SSL リスナーが設定された Classic Load Balancer (Apache)
プロキシプロトコルサポートを設定するには、次の手順を実行します。
-
テキストエディタを使用して Apache 設定ファイルを開きます。場所は構成によって異なります。例えば、Amazon Linux と RHEL の場合は /etc/httpd/conf/httpd.conf、Ubuntu の場合は /etc/apache2/apache2.conf です。
-
Apache の設定で mod_remoteip モジュール (Apache バージョン 2.4.31 以降で利用可能) がロードされることを確認します。詳細については、Apache のウェブサイトの「Apache Module mod_remoteip」(Apache モジュール mod_remoteip) を参照してください。このモジュールには RemoteIPProxyProtocol ディレクティブが含まれています。詳細については、Apache のウェブサイトの「RemoteIPProxyProtocol Directive」(RemoteIPProxyProtocol ディレクティブ) を参照してください。設定ファイルで、次のいずれかに似た行がないか確認します。
ディレクティブ または RHEL
LoadModule remoteip_module modules/mod_remoteip.soUbuntu
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so -
mod_remoteip モジュールがロードされたことを確認するには、次のコマンドを実行します。
$ sudo apachectl -t -D DUMP_MODULES | grep -i remoteip -
出力を確認し、出力に次のような行が含まれていることを確認します。
remoteip_module (shared)重要: 出力にこの行が含まれていない場合、モジュールは構成に含まれていないか、ロードされていません。先に進む前に、必ずモジュールを有効にしてください。
-
プロキシプロトコルサポートを有効にするには、Apache 設定ファイルに次の行を追加します。
RemoteIPProxyProtocol On -
設定ファイルの LogFormat セクションを編集して、リモート IP アドレス (%a) とリモートポート (%{remote}p:) をキャプチャします。
LogFormat "%h %p %a %{remote}p %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined -
変更を保存します。
-
Apache サービスをリロードします。使用するシステムに応じて、次のコマンドのいずれかを実行します。
Sysvinit、Debian ベースのシステム (Ubuntu など)、SUSE (SLES11 など)
# /etc/init.d/apache2 reloadSysvinit、RPM ベースのシステム (RHEL 6 や Amazon Linux など)、SUSE を除く
# /etc/init.d/httpd reloadSystemd、Debian ベースのシステム (Ubuntu など)、SUSE (SLES12 など)
# systemctl reload apache2Systemd、RPM ベースのシステム (RHEL 7 や Amazon Linux 2 など)、SUSE を除く
# systemctl reload httpd -
Apache ウェブサーバーのアクセスログを開きます。場所は構成によって異なります。
-
クライアント IP アドレスが [プロキシプロトコル] ヘッダーの下に記録されるようになったことを確認します。
-
ターゲットアプリケーションでプロキシプロトコルのサポートを有効にします。
TCP/SSL リスナーが設定された Classic Load Balancer (NGINX)
プロキシプロトコルサポートを設定するには、次の手順を実行します。
-
テキストエディタを使用して NGINX 設定ファイルを開きます。通常、この場所は /etc/nginx/nginx.conf です。
-
server セクションの listen 行を proxy_protocol に更新します。http セクションの log_format 行を更新して、proxy_protocol_addr を設定します。
http { ... log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$proxy_protocol_addr"'; access_log /var/log/nginx/access.log main; ... } server { ... listen 80 default_server proxy_protocol; ... } ... } -
変更を保存します。
-
NGINX サービスをリロードします。Amazon Linux 2 または RHEL の場合は、次のコマンドを実行します。
systemctl reload nginx注: NGINX サービスをリロードするコマンドは、他のシステムでは異なります。NGINX をリロードするコマンドは、前のセクションの Apache サービスをリロードするコマンドと似ています。
-
NGINX ウェブサーバーのアクセスログを開きます。場所は構成によって異なります。
-
クライアント IP アドレスが [プロキシプロトコル] ヘッダーの下に記録されるようになったことを確認します。
-
ターゲットアプリケーションでプロキシプロトコルのサポートを有効にします。
- 言語
- 日本語

This article was reviewed and updated on 2025-10-24.
関連するコンテンツ
質問済み 9年前