1. 平文HTTPリバースプロキシ
ここでは、受信した平文HTTPリクエストをバックエンドアプリケーションに転送するシンプルなリバースプロキシサーバーの設定方法を説明します。
最もシンプルな設定
TOML形式の設定ファイル(例: config.toml)の最もシンプルな設定は以下の通りです。
listen_port = 80
[apps.app1]
server_name = 'app1.example.com'
reverse_proxy = [{ upstream = [{ location = 'app1.local:8080' }] }]上記の設定では、rpxyはポート80 (TCP)でリッスンし、HOSTヘッダーまたはリクエスト行のURLにapp1.example.comを含む平文HTTPリクエストを処理します。例えば、以下のようなHTTPリクエストメッセージです。
GET http://app1.example.com/path/to HTTP/1.1\r\nまたは
GET /path/to HTTP/1.1\r\n
HOST: app1.example.com\r\nそれ以外のリクエスト、例えばother.example.comへのリクエストは、ステータスコード40xで拒否されます。
また上記の設定では、受信接続と同様にバックエンドアプリケーションへの送信接続も平文HTTPで行われ、HTTPSではありません。バックエンドアプリケーションへのリクエストをHTTPSで転送する必要がある場合は、以下のサブセクションを参照してください。
複数ドメイン名の提供
単一のIPアドレス/ポートで複数の異なるドメイン名をホストしたい場合は、設定ファイルに複数のapp."<app_name>"エントリを作成します。
listen_port = 80
default_app = "app1"
[apps.app1]
server_name = "app1.example.com"
reverse_proxy = [{ upstream = [{ location = 'app1.local:8080' }] }]
[apps.app2]
server_name = "app2.example.org"
reverse_proxy = [{ upstream = [{ location = 'app2.local:8888' }] }]上記の設定では、default_appエントリを指定することにより、HOSTヘッダーまたはリクエスト行のURLがreverse_proxyエントリのserver_nameのいずれにも一致しない場合、指定されたアプリケーションが平文HTTPリクエストを処理します。
server_nameに一致しないHTTPSリクエストは拒否されます。これは、不明なサーバー名(サーバー証明書のCommon Name)に対してセキュア接続を確立できないためです。バックエンドアプリケーションへのHTTPS接続
上記の例では、リクエストメッセージは平文HTTPでバックエンドアプリケーションにルーティングされます。アプリへのバックエンドチャネルをTLS経由で確立する必要がある場合(例: https://app1.localdomain:8080へのリクエスト転送)、HTTPS接続が必要なlocationに対してtlsオプションを有効にする必要があります。
[apps.app_backend_https]
server_name = "app_backend_https.example.com"
reverse_proxy = [
{ location = 'app1.localdomain:8080', tls = true }
]複数バックエンドによるロードバランシング
適切なload_balanceオプションを指定して、reverse_proxy配列に複数のバックエンドロケーションを指定することでロードバランシングが可能です。現在、以下のオプションが利用できます:
round_robin: リクエストごとに、バックエンドロケーションがラウンドロビン方式で選択されます;random: リクエストごとに、バックエンドロケーションがランダムに選択されます;sticky:round_robinと同様にバックエンドロケーションが選択されますが、Cookieを使用したセッション永続性が保証されます。
load_balanceが指定されていない場合、最初のバックエンドロケーションが常に選択されます。
[apps."app_name"]
server_name = 'app1.example.com'
reverse_proxy = [
{ location = 'app1.local:8080' },
{ location = 'app2.local:8000' }
]
load_balance = 'round_robin' # or 'random' or 'sticky'