ITエンジニアのコツコツ日記

ITエンジニアの雑記です

多段リバースプロキシにおけるサイト内のURLの変換をnginxで行う

多段リバースプロキシにおけるサイト内の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;
        }
    }
}

以上。