コンテンツにスキップ
1. 平文HTTPリバースプロキシ

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)に対してセキュア接続を確立できないためです。
default_appへのフォールバック経路では、rpxyは送出するHostヘッダーをデフォルトアプリに設定されたserver_nameで強制的に上書きし、元のホスト名はX-Forwarded-Host / Forwarded: host=にのみ載ります。バックエンドはこれらの値を信頼できない参考情報として扱う必要があります。

バックエンドアプリケーションへのHTTPS接続

上記の例では、リクエストメッセージは平文HTTPでバックエンドアプリケーションにルーティングされます。アプリへのバックエンドチャネルをTLS経由で確立する必要がある場合(例: https://app1.localdomain:8080へのリクエスト転送)、HTTPS接続が必要なlocationに対してtlsオプションを有効にする必要があります。

[apps.app_backend_https]
server_name = "app_backend_https.example.com"
reverse_proxy = [
  { upstream = [{ location = 'app1.localdomain:8080', tls = true }] }
]

複数バックエンドによるロードバランシング

適切なload_balanceオプションを指定して、upstream配列に複数のバックエンドロケーションを指定することでロードバランシングが可能です。現在、以下のオプションが利用できます:

  • round_robin: リクエストごとに、バックエンドロケーションがラウンドロビン方式で選択されます;
  • random: リクエストごとに、バックエンドロケーションがランダムに選択されます;
  • sticky: round_robinと同様にバックエンドロケーションが選択されますが、Cookieを使用したセッション永続性が保証されます;
  • primary_backup: 常に最初の正常なバックエンドロケーションにルーティングします。アクティブヘルスチェックの有効化が必要です。

load_balanceが指定されていない場合(none)、最初のバックエンドロケーションが常に選択されます。ヘルスチェックが有効な場合は、最初の正常なロケーションが選択されます。

[apps."app_name"]
server_name = 'app1.example.com'

[[apps."app_name".reverse_proxy]]
upstream = [
  { location = 'app1.local:8080' },
  { location = 'app2.local:8000' },
]
load_balance = 'round_robin' # または 'random'、'sticky'、'primary_backup'
stickyを使う場合は、グローバルオプションsticky_cookie_secretが必須です。パディングなしbase64urlでエンコードされた32バイトの秘密鍵で、stickyセッションのクッキー(rpxy_sticky_token)を不透明なAEAD暗号文として封印するために使われます。openssl rand -base64 32 | tr '+/' '-_' | tr -d '=\n'で生成できます。
アクティブヘルスチェックを有効にすると、rpxyはバックエンドロケーションを定期的に監視し、異常なロケーションをロードバランシングの対象から除外します。