プロキシで別サーバーのアプリを同一URLで表示する設定方法

by

in

すでに運用しているアプリケーションの配下に別のアプリケーションを表示するための方法です。

WordPressを運用している、Laravelアプリケーションを動かしている、その他様々なアプリケーションを稼働しているが、特定のパス配下に別のアプリケーションを表示できるようにするプロキシ設定の方法です。

いつもながら当サイトはレンタルサーバーに特化した情報を提供しているため、 .htaccess を使用したプロキシ設定を紹介していきます。

実現したい環境をおさらい

まず、プロキシ設定を行う目的を理解しておきましょう。この設定は以下のような場合に役立ちます。

  • 異なるサーバーのコンテンツを一つのURLで提供する
    • 例えば、静的コンテンツは一つのサーバーに、動的コンテンツは別のサーバーにホストされている場合、それぞれのサーバーのコンテンツを一つのURLで提供することができます。
  • サーバーの負荷分散
    • トラフィックを複数のサーバーに分散させることで、サーバーの負荷を軽減し、パフォーマンスを向上させることができます。

URLで表現すると

  • https://example.com/
    • WordPressがすでに稼働している
  • https://example.com/apps/
    • Laravelアプリケーション、WordPressとは別のサーバーで稼働

を実現できます。

逆の組み合わせとして既に稼働しているWebアプリケーション配下(例えば /articles パス全て)にWordPressアプリケーションを動かすこともできます。

レンタルサーバーはWordPressの運用に特化している物も多くあるため、WordPressだけレンタルサーバーにホスティングする選択を取る事が可能になります。

そして .htaccess での設定方法を理解することは多くの稼働実績がある方法なので、他のHTTPサーバーにも応用できる方法になります。

.htaccessの設定方法

実際に設定する方法を紹介します。

  • https://example.com
    • WordPressを運用済み
    • /tools に別サーバーのアプリケーションを表示したい
  • http://tools.example.com
    • アプリケーションが稼働している
    • プロキシで表示するため https は不要
    • このURLにアクセスすると https://example.com/tools にリダイレクトさせる

この設定を実現します。

# example.com のサーバーで設置する .htaccess
# /tools ディレクトリを作成してその中に設置

<IfModule mod_dir.c>
    DirectoryIndex disabled
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule (.*) http://tools.example.com/$1 [P,L,QSA]
</IfModule>
# tools.example.com のサーバーで設置する .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTP:X-Forwarded-Server} !^www.example.com$ [NC]
    RewriteRule (.*)$ https://example.com/tools/$1 [R=301,L]
</IfModule>

これで設定は完了しました。ためしにcurlでアクセスされるかを確認して問題ないか確認しましょう。

 % curl -L -I https://example.com/tools/
HTTP/2 200 
server: nginx
date: Wed, 05 Jun 2024 07:52:16 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
cache-control: no-cache, private

 % curl -L -I https://tools.example.com 
HTTP/2 301 
server: nginx
date: Wed, 05 Jun 2024 07:52:23 GMT
content-type: text/html; charset=iso-8859-1
content-length: 233
location: https://example.com/tools/

HTTP/2 200 
server: nginx
date: Wed, 05 Jun 2024 07:52:24 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
cache-control: no-cache, private

正常にリライトやリダイレクトされていることが確認できます。

解説

ポイントとしては「リライト」と「リダイレクトしない」設定です。

本来アクセスしたいURLパス( https://example.com/tools/ ) に置いた設定では「リライト」を行なっています。ブラウザ的にはアクセスしたURLのままで、表示すべき内容を取得するのがリライトです。

RewriteRule (.*) http://tools.example.com/$1 [P,L,QSA]

の指定によって RewriteRule のフラグが指定されています。

  • P フラグ
    • プロキシ要求とみなし、リバースプロキシとして動作します
  • L フラグ
    • ラスト。ルールにマッチしていたら処理の終了
  • QSA フラグ
    • クエリ文字列が引き継がれます

プロキシされた後のアプリケーションでも設定を行います。同じ内容が2つのURLで表示されてしまうとSEOでのマイナスポイントとなってしまうために「リダイレクト」をします。アクセスしたら本来のURLに遷移します。

    RewriteCond %{HTTP:X-Forwarded-Server} !^www.example.com$ [NC]
    RewriteRule (.*)$ https://example.com/tools/$1 [R=301,L]

この設定によってリダイレクトされます。

  • R=301 フラグ
    • リダイレクト。なおかつステータスコードを301に指定
  • L フラグ
    • ラスト。処理の終了

ポイントとしては X-Forwarded-Server のヘッダーで 「www.example.com」が付与されていればリダイレクト対象から外すように指定しています。指定文字列で「!」によってnot指定になります。

この指定をしないとサーバー内部でリダイレクトとリライトの要求が発生し続けてしまうので無限ループに落ち入り、HTMLの表示がされないようになってしまいます。

私がいつも使っているレンタルサーバーのエックスサーバーではこの設定で出来ましたが、環境によっては別のヘッダー値をみる必要があります。 (エックスサーバーは最初からnginxでプロキシをかませてapacheで実行しているので少し特殊な気がします)

確認方法としては実際に届いたリクエストヘッダーを見るのが手っ取り早いです。

<?php

# リクエストヘッダーの表示
foreach (getallheaders() as $name => $value) {
    echo "$name: $value\n";
}

このファイルを tools.example.com に設置、 example.com/tools/.htaccess でのリライト設定だけおく事で確認できます。 (確認時には tools.example.com/.htaccess は削除やコメントアウトしてください)

 % curl -L https://tools.example.com/info.php 
Accept: */*
User-Agent: curl/8.6.0
Connection: close
X-File-Type: normal
X-Ua-Device: pc
X-Failure-Cache-Time: 0
X-Accel-Expires: 60
X-Wp-Access: 0
X-Php-Fpm-Version: 82
X-Server-Address: ***.***.***.***
X-Real-Ip: ***.***.***.***
X-Forwarded-Ssl: on
X-Forwarded-Port: 443
X-Forwarded-Host: tools.example.com
X-Forwarded-Proto: https
X-Forwarded-For: ***.***.***.***
Host: tools.example.com


 % curl -L https://example.com/tools/info.php
X-Forwarded-Server: www.example.com
Accept: */*
User-Agent: curl/8.6.0
Connection: close
X-File-Type: normal
X-Ua-Device: pc
X-Failure-Cache-Time: 0
X-Accel-Expires: 60
X-Wp-Access: 0
X-Php-Fpm-Version: 82
X-Server-Address: ***.***.***.***
X-Real-Ip: ***.***.***.***
X-Forwarded-Port: 80
X-Forwarded-Host: tools.example.com
X-Forwarded-Proto: http
X-Forwarded-For: ***.***.***.***, ***.***.***.***, ***.***.***.***
Host: tools.example.com

本来アクセスを許したいパスからアクセスにだけ付与されているヘッダーを見つけて設定を行なってください。確認したエックスサーバーの場合には「X-Forwarded-Server」があったのでこちらを設定しました。

X-Real-IpX-Forwarded-For でも値が変わったので、こちらで判別をしてもいいかもしれません。

値が変わらない場合には

RequestHeader set FOO 'bar'

などでヘッダーを付与できるので、こちらで判別することも可能です。

終わりに

以上、プロキシ設定でした。

レンタルサーバーはいつも便利に活用しているのですが、稼働できるアプリケーションが限定されてしまうのが難点です。ですが、プロキシ設定を行う事で外部サーバーで運用しているアプリケーションを同じURLで公開することができます。

うまく使いこなしていきましょう。

稼働するアプリケーションによってはヘッダー値によって処理が変わってしまうので、別途対応が必要になるかもしれません。ヘッダーの確認方法なども今回の記事で取り扱っているのでエラー解消などに活用してみてください。

参考URL

さくらのレンタルサーバの .htaccess に RewriteRule を書いてリバースプロキシする

C.1.3 RewriteRule

レンタルサーバーを最大限使いこなすための方法

Laravelの記事を厳選して紹介

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA