コンテンツにスキップ
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)に対してセキュア接続を確立できないためです。

バックエンドアプリケーションへの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'
現在、ヘルスチェック機能は実装されていません。バックエンドロケーションがダウンしている場合、そのロケーションへのリクエストは失敗します。