はじめに
自分の頭を整理するためにNginx の reverse proxyの使い方をまとめてみた。
環境は以下のとおり。
$ nginx -v
nginx version: nginx/1.26.1
$ php -v
PHP 8.3.9 (cli) (built: Jul 2 2024 15:37:13) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.9, Copyright (c) Zend Technologies
想定しているシステム構成は、yyy.yyy.yyy.yyyのアドレスで稼働しているnginx_server に zzzz:zzzz:zzzz:zzzzz:zzzz:zzzz:zzzz:zzzzのクライアントでアクセスし、Lan内部のnginx_server に reverse_proxyしてもらった場合。
Internet | --> | reverse_proxyを設定した nginx_server | --> | Lan 内部の nginx _server |
adress | yyy.yyy.yyy..yyy | xxx.xxx.xxx.xxx | ||
^ | server_name kurafuto.homelinux.com | |||
| | <-- | <-- | <-- | Lan 内部のクライアント |
zzzz:zzzz:zzzz:zzzzz:zzzz:zzzz:zzzz:zzzz |
インターネットに接続するnginx_serverが、reverse_proxy の設定で、lan内部のnginx _serverに処理を任せ、結果を受け取ってインターネット上に返すシステム。
1.転送元の Nginx
server {
listen 443;
listen [::]:443;
server_name my.domain;
各種 proxy_set_header の設定1
ssl の設定;
ocation / {
roxy_pass http:// 転送先のip_address/;
}
}
※1 proxy_passだけでも、テーマの反映制限、一部のモジュールの機能制限を除き、ほぼ正常に機能する。
デフォルトでは、NGINX はプロキシされたリクエスト内の 2 つのヘッダー フィールド「Host」と「Connection」を再定義し、値が空の文字列であるヘッダー フィールドを削除します。「Host」は$proxy_host変数に設定され、「Connection」はcloseに設定されます。https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
一般的に紹介されているproxy_set_headerは何を送信しているのか?あまり良くわかっていないがまとめてみた。誤りがあればご指摘いただくとありがたい。
設定項目 | 値 | 意味 |
proxy_set_header Host | $host; | ホスト名を転送先のサーバに送信 |
proxy_set_header X-Real-IP | $remote_addr; | 接続してきたクライアントのIPv4アドレスを送信 |
proxy_set_header X-Forwarded-Host | $host; | 転送先のサーバのホスト名に接続サーバ名を送信 |
proxy_set_header X-Forwarded-Server | $host; | 転送先のサーバー名は転送元サーバのドメイン |
proxy_set_header X-Forwarded-For | $proxy_add_x_forwarded_for; | 接続してきたクライアントのIPv6アドレスを送信 |
2.転送先のサーバの設定
server {
listen 80;
isten [::]:80;
server_name IP_address
root /var/www/html;
ndex index.php
php の設定;
}
3.結果
転送先のnginx で出力された phpinfo(); の結果(関係すると思われる項目を抜き出した)
proxy_headerの設定なし | 上記の設定をした場合 | |
$_SERVER['HTTP_CONNECTION'] | close | close |
$_SERVER['HTTP_HOST'] | xxx.xxx.xxx.xxx | kurafuto.homelinux.com |
$_SERVER['SERVER_NAME'] | xxx.xxx.xxx.xxx | xxx.xxxx.xxx.xxx |
$_SERVER['SERVER_PORT'] | 80 | 80 |
$_SERVER['SERVER_ADDR'] | xxx.xxx.xxx.xxx | xxx.xxx.xxx.xxx.xxx |
$_SERVER['REMOTE_ADDR'] | yyy.yyy.yyy.yyy | yyy.yyy.yyy.yyy |
$_SERVER['HTTP_X_FORWARDED_FOR'] | zzzz:zzzz:zzzz:zzzz:zzzz:zzzz:zzzz:zzzz | |
$_SERVER['HTTP_X_FORWARDED_SERVER'] | kurafuto.homelinux.com | |
$_SERVER['HTTP_X_FORWARDED_HOST'] | kurafuto.homelinux.com | |
$_SERVER['HTTP_X_REAL_IP'] | zzzz:zzzz:zzzz:zzzz:zzzz:zzzz:zzzz:zzzz |
proxy_set_header の設定がなされない場合は、
- remote_addr 以外はすべて転送先のipv4アドレスになる(デフォルトで HOSTで$hostが設定されるため)が、
設定がなされると、
- sever_name 設定の domain 情報が送信され、リバプロされたサーバはすべて domain 情報に書き換えられている
- X-Forwarded-For と X-Real-IP として 接続してきたクライアント情報が引き継がれている。
4.困ったこと
この設定によって
- エクステンションがほぼ表示されない、したがって機能しない。GotoTopだけは機能するようだが、Darkimage関係は表示すらされない。
- バックエンドのダッシュボード、Notificationの項目が「不明」と表示される。これはダッシュボードからシステムのタブに遷移すると改善されるようだ。
- 記事の投稿や編集で使う「CMSコンテンツ」が機能しない。例えばイメージを挿入しようと思っても、ポップアップされた画面には「kurafuto.homelinux.com が接続を拒否した」旨表示され、イメージが表示できない。
- ipv4アドレスで直接開けば、上記の不具合は解消できる。
参考
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
Comments powered by CComment