3. パスベースの柔軟なルーティング
rpxyは、パス情報に基づいて受信リクエストを複数のバックエンド先にルーティングできます。ルーティング情報は各アプリケーション(server_name)ごとに以下のように指定できます。
listen_port_tls = 443
[apps.app1]
server_name = 'app1.example.com'
tls = { https_redirection = true, tls_cert_path = 'server.crt', tls_cert_key_path = 'server.key' }
[[apps.app1.reverse_proxy]]
upstream = [
{ location = 'default.backend.local' }
]
[[apps.app1.reverse_proxy]]
path = '/path'
upstream = [
{ location = 'path.backend.local' }
]
[[apps.app1.reverse_proxy]]
path = '/path/another'
replace_path = '/path'
upstream = [
{ location = 'another.backend.local' }
]上記の例では、以下へのリクエスト
https://app1.example.com/path/to?query=okは最長プレフィックスマッチングにより2番目のreverse_proxyエントリに一致し、パスとクエリ情報を保持したままpath.backend.localにルーティングされます。つまり、以下のように処理されます。
http://path.backend.local/path/to?query=ok一方、以下へのリクエスト
https://app1.example.com/path/another/xx?query=ngは3番目のエントリに一致し、replace_pathオプションで指定されたパス情報の書き換えを伴ってルーティングされます。つまり、一致した/path/another部分が/pathに書き換えられ、以下のように処理されます。
http://another.backend.local/path/xx?query=ngいずれのパスにも一致しないリクエストは、pathオプションを持たない最初のエントリによってルーティングされ、これがデフォルトの転送先となります。言い換えれば、すべてのreverse_proxyエントリに明示的なpathオプションがある場合、rpxyはいずれのパスにも一致しないリクエストを拒否します。
シンプルなパスベースルーティングの例
このパスベースルーティングオプションは多くのケースで十分です。例えば、各アプリケーションに固有のパスを指定することで、1つのドメインで複数のアプリケーションを提供できます。具体的には以下の例を参照してください。
[apps.app]
server_name = 'app.example.com'
#...
[[apps.app.reverse_proxy]]
path = '/subapp1'
replace_path = '/'
upstream = [ { location = 'subapp1.local' } ]
[[apps.app.reverse_proxy]]
path = '/subapp2'
replace_path = '/'
upstream = [ { location = 'subapp2.local' } ]
[[apps.app.reverse_proxy]]
path = '/subapp3'
replace_path = '/'
upstream = [ { location = 'subapp3.local' } ]この設定例は、パスベースルーティングの非常によくある状況を示しています。app.example.com/subappNへのリクエストがパス部分/subappNを/に置換してsubappN.localにルーティングされます。