
nginx-proxyとApacheで実IPアドレスを取得する方法(基礎編)
リバースプロキシを使ったWordPress環境で、アクセスログに訪問者の実IPアドレスが記録されず困っていませんか?この記事では、nginx-proxy + Apache環境で実IPを正しく取得する方法を、初心者にもわかりやすく解説します。
問題:ログに内部IPしか記録されない
WordPressのアクセスログを見ると、すべて 172.18.0.4
という同じIPアドレスになっている…これは実際の訪問者のIPアドレスではなく、nginx-proxyコンテナの内部IPなんです。
なぜこうなるのか?
リバースプロキシを使っている環境では、以下のような構成になっています:
インターネット → nginx-proxy → Apache → WordPress
(リバースプロキシ) (Webサーバー)
訪問者はまずnginx-proxyに接続し、nginx-proxyがApacheに転送します。だからApacheから見ると、「nginx-proxyから接続されている」ように見えてしまうんです。
解決の鍵:HTTPヘッダー
でも安心してください。実際の訪問者のIPアドレスは、HTTPヘッダーに含まれて送られているんです。
HTTPヘッダーとは?
HTTPヘッダーは、WebブラウザとWebサーバーがやり取りする際に送る「付箋メモ」のようなものです:
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
X-Real-IP: 203.0.113.45 ← ここに実IPが入っている!
X-Forwarded-For: 203.0.113.45
この X-Real-IP
や X-Forwarded-For
に、実際の訪問者のIPアドレスが入っているんです。nginx-proxyが自動的に付与してくれます。
nginx変数の命名規則
nginxの設定を見ると、$http_cf_connecting_ip
や $remote_addr
といった変数が出てきます。これらには決まったルールがあります。
HTTPヘッダー名 | nginx変数名 |
---|---|
X-Real-IP | $http_x_real_ip |
X-Forwarded-For | $http_x_forwarded_for |
CF-Connecting-IP | $http_cf_connecting_ip |
User-Agent | $http_user_agent |
変換ルール:
- 最初に
$http_
を付ける - ヘッダー名を小文字にする
- ハイフン
-
をアンダースコア_
に変える
例えば CF-Connecting-IP
というヘッダーは:
$http_
を付けて →$http_CF-Connecting-IP
- 小文字にして →
$http_cf-connecting-ip
- ハイフンを
_
にして →$http_cf_connecting_ip
Cloudflareって何?
Cloudflareは、Webサイトとインターネットの間に入って、セキュリティやスピードを向上させるサービスです。
Cloudflareを使っている場合
訪問者 → Cloudflare → nginx-proxy → Apache
(実IP) (CFのIP)
Cloudflareを使っていない場合
訪問者 → nginx-proxy → Apache
(実IP)
Cloudflareが送る特別なヘッダー
Cloudflare経由のアクセスでは、以下のヘッダーが追加されます:
CF-Connecting-IP: 203.0.113.45 ← 実際の訪問者のIP(最も信頼できる!)
CF-Ray: 8a1b2c3d4e5f
CF-IPCountry: JP
X-Forwarded-For: 203.0.113.45, 104.21.x.x
X-Forwarded-For
は誰でも偽装できますが、CF-Connecting-IP
はCloudflareだけが設定できるので安全なんです。
次回予告
次回の記事では、TRUST_DOWNSTREAM_PROXY
という設定の謎と、Cloudflare使用サイトと直接アクセスサイトが混在する環境での完璧な解決策を解説します。
関連記事:
- 第2部:TRUST_DOWNSTREAM_PROXYと混在環境の設定(続く)
- 第3部:Apache側の設定とログフォーマットの詳細(続く)
タグ: nginx, Apache, WordPress, Docker, リバースプロキシ, IPアドレス, Cloudflare