はじめに

自分の頭を整理するために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の例
設定項目 意味
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/

https://qiita.com/schwarz471/items/9b44adfbec006eab60b0

Comments powered by CComment

関連記事
最も読まれた記事
クラウドタグ