多段リバースプロキシにおけるサイト内のURLの変換をnginxで行う
多段リバースプロキシは、複数のリバースプロキシを組み合わせて利用することで、より高度な負荷分散やセキュリティ機能を実現する手法です。 しかし、多段リバースプロキシを使用する場合、サイト内のURLが正しく変換されないという問題が生じることがある。 この問題を解決するために、nginxを使用してサイト内のURLの変換を行う方法を紹介する。
背景
独自ドメインのサイトを運営する際に、複数のサイトを稼働させたい時がある。 この時バックエンドのサーバーにルーティングさせる際に パス(/site1, /site2)のように区切りたい。
しかし、nginxでルーティングした後のサーバーが受け取るパスパラメータはルーティングのための区切り文字を認識してしまう。 また、サイト内でリダイレクトがある場合はルーティングパスを無視して、移動してしまう問題もあった。
バックエンドのサーバーにはnginxのルーティングを意識させたくないので、なんとか設定できるようにした。
nginxを使用したURLの変換(リダイレクト)
http://192.168.1.74:8888
がバックエンドのサーバとする。
/item
というパスがルーティングの識別子にしており、バックエンドがこれを認識したくない。
そのために、proxy_redirect / /item/;
を追加して、バックエンドに送るパスから削除する。
また、ページ内リンクが不正になるので、これをsub_filter
を使って、無理やり書き換える。
'src="/' 'src="/item/
のように、サイト内リンクの場合バックスラッシュから始まるので、こいつにパスルーティングの値に変換する。
events { worker_connections 1024; } http { server { listen 80; server_name localhost; client_max_body_size 100M; location /item/ { proxy_pass http://192.168.1.74:8888/; proxy_redirect / /item/; sub_filter 'src="/' 'src="/item/'; # 画像のURLに /item を追加 sub_filter 'href="/' 'href="/item/'; # リンクのURLに /item を追加 sub_filter_once off; } } }
以上。