9. 対応するフィルター
ここでは、公式にサポートするフィルターと、それぞれが受け付けるパラメーターを示します。コンパイルオプションによっては、利用できないフィルターもあります。利用可能なフィルターの一覧はhaproxy -vvに表示されます。
関連項目:“filter”
9.1. トレース
filter trace [name <name>] [random-forwarding] [max-fwd <max>] [hexdump]
引数:
このフィルターは、新しいフィルターを開発する際のひな形として使えます。すべてのコールバックを定義し、それぞれについて有用な情報を含むメッセージを標準エラーストリーム(stderr)へ出力します。ほかのフィルターの動作や、HAProxy自体の動作のデバッグに役立つ場合があります。
<random-parsing>や<random-forwarding>パラメーターを使うと、処理に遅延を加え、クライアントとサーバーの間で交換されるデータを解析するフィルターの動作をテストできます。
9.2. HTTP圧縮
filter comp-req
“compression"設定に従って、HTTPリクエストの圧縮を明示的に試みるフィルターを有効にします。“compression direction request"を暗黙に設定します。
filter comp-res
“compression"設定に従って、HTTPレスポンスの圧縮を明示的に試みるフィルターを有効にします。“compression direction response"を暗黙に設定します。
filter compression(非推奨)
後方互換性のための別名で、“comp-req"と"comp-res"の両フィルターを有効にするのと機能的に同等です。適切な動作を設定するには、“compression"キーワードを使わなければなりません。
HTTP圧縮は、HAProxy 1.7でフィルターへ移されました。HTTP圧縮を有効化・設定するには、引き続き"compression"キーワードを使わなければなりません。ほかのフィルターを使わない場合は、それだけで十分です。cacheやfcgi-appを有効にして使う場合も、それだけで十分です。この場合、圧縮は常にレスポンスがキャッシュへ保存された後に行われます。ただし、同じリスナー/フロントエンド/バックエンドで、cacheやfcgi-app以外のフィルターを一つでも使う場合は、filter行を明示してHTTP圧縮を有効にしなければなりません。これは、フィルターの評価順を決めるために重要です。
関連項目:“compression”、キャッシュフィルターについてはセクション9.4 、fcgi-appフィルターについてはセクション9.5 。
9.3. Stream Processing Offload Engine(SPOE)
filter spoe [engine <name>] config <file>
引数:
Stream Processing Offload Engine(SPOE)は、外部コンポーネントと通信するフィルターです。階層型アプリケーションで、ストリームに対する特定の処理を外部へ任せられます。外部コンポーネントと、それらとの間で交換する情報の大部分は、専用ファイルで設定します。また、HAProxy設定内に定義した専用のバックエンドも必要です。
SPOEは、独自のバイナリプロトコルであるStream Processing Offload Protocol(SPOP)を使って外部コンポーネントと通信します。
ストリームでSPOEを使うと、外部コンポーネントとの通信を担当する専用ストリームが作られます。元のストリームは、この"SPOE"ストリームの親ストリームになります。そのため、“SPOE"ストリームから元のストリームの変数を取得できます。詳細は、変数についてのセクション2.8 を参照してください。
SPOE設定とSPOP仕様の詳しい情報は、“doc/SPOE.txt"を参照してください。
9.4. キャッシュ
filter cache <name>
引数:
キャッシュは、キャッシュ可能なレスポンスを保存するためにフィルターを使います。キャッシュをいつ、どのように使うかは、HTTPルールの"cache-store"と"cache-use"で定義しなければなりません。デフォルトでは、対応するフィルターが暗黙に定義されます。fcgi-appやcompression以外のフィルターを使わない場合は、それだけで十分です。この場合、圧縮フィルターは常にキャッシュフィルターの後に評価されます。ただし、同じリスナー/フロントエンド/バックエンドで、compressionやfcgi-app以外のフィルターを一つでも使う場合は、filter行を明示してキャッシュを使わなければなりません。これは、フィルターの評価順を決めるために重要です。
関連項目:圧縮フィルターについてはセクション9.2 、fcgi-appフィルターについてはセクション9.5 、キャッシュについてはセクション6 。
9.5. Fcgi-app
filter fcgi-app <name>
引数:
FastCGIアプリケーションは、リクエスト経路ですべてのカスタムパラメーターを評価し、レスポンス経路でヘッダーを処理するためにフィルターを使います。<name>は、既存のfcgi-appセクションを参照しなければなりません。使うアプリケーションの定義には、“use-fcgi-app"ディレクティブを使うことを推奨します。デフォルトでは、対応するフィルターが暗黙に定義されます。cacheやcompression以外のフィルターを使わない場合は、それだけで十分です。ただし、同じバックエンドでcompressionやcache以外のフィルターを一つでも使う場合は、fcgi-app用のfilter行を明示しなければなりません。これは、フィルターの評価順を決めるために重要です。
関連項目:“use-fcgi-app”、圧縮フィルターについてはセクション9.2 、キャッシュフィルターについてはセクション9.4 、FastCGIアプリケーションについてはセクション10 。
9.6. OpenTracing
OpenTracingフィルターは、HAProxyで分散トレースを直接利用できるようにします。Datadog、Jaeger、Lightstep、Zipkinなど、対応するトレーサーへOpenTracing準拠のリクエストを送ることで動作します。トレーサーは推奨順ではなく、アルファベット順に記載している点に注意してください。
この機能は、HAProxyをUSE_OT=1でビルドした場合にのみ有効です。
OpenTracingフィルターは、HAProxyの設定で明示的に指定して有効にします。指定しなければ、OpenTracingフィルターはHAProxyの動作に一切関与しません。
filter opentracing [id <id>] config <file>
引数:
フィルターの動作、設定、使い方に関する詳しいドキュメントは、addons/otディレクトリにあります。
注意:OpenTracing自体が開発元による保守・サポートを終了しているため、新しい設計ではOpenTracingフィルターを使わないことを推奨します。OpenTracingは3.3で非推奨となり、3.5で削除されます。OpenTelemetryに基づく代替フィルターは3.4から利用でき、完全なビルド手順は現在、次の場所にあります。
9.7. 帯域制限
引数:
ストリーム単位でデータの転送速度を制限するには、帯域制限フィルターを使うことを推奨します。ひいては、リソースが消費するネットワーク帯域を制限できます。複数の帯域制限フィルターを使えます。たとえば、クライアントが帯域全体を使い切ってほかのクライアントに不利益を与えないよう、送信元アドレスごとの制限を設け、同じクライアントの複数接続を公平に扱うため、さらにストリームごとの制限を設けられます。
これらのフィルターの定義順序は重要です。一つのストリームで複数の帯域制限フィルターを有効にすると、定義順に適用されます。ほかのフィルターの定義順序も影響することを理解しておく必要があります。たとえば、HTTP圧縮フィルターが帯域制限フィルターの前か後かによって、制限が圧縮後のペイロードに適用されるかどうかが変わります。キャッシュフィルターについても同様です。
帯域制限フィルターには二種類あります。一つはデフォルトの制限をストリームごとに適用します。もう一つはスティックテーブルを使い、同じテーブルエントリーを共有するすべてのストリームに、制限を均等に分配します。
さらに、同じフィルターでも、使うキーワードに応じて、クライアントから受信してサーバーへ転送する入力データか、サーバーから受信してクライアントへ送る出力データのどちらを制限するかが変わります。入力データには"bwlim-in”、出力データには"bwlim-out"キーワードを使わなければなりません。いずれも、転送するデータにストリーム単位で帯域制限を適用します。
帯域制限は、接続単位ではなくストリーム単位で適用します。多重化プロトコル(H2、H3、FastCGI)では、同じ接続内のストリームに異なる制限を設定できます。
ストリームごとの帯域制限フィルターでは、デフォルトの期間と制限を定義しなければなりません。名前のとおり、ストリームの帯域制限レートを設定するためのデフォルト値です。ただし、この種類のフィルターに限り、TCP/HTTPの"set-bandwidth-limit"アクションでフィルターを有効にする際に、サンプル式でこれらの値を再定義できます。
共有の帯域制限フィルターでは、入力・出力のどちらのデータに適用するかに応じて、使うスティックテーブルに対応するバイトレート情報を保存しなければなりません。入力データを制限するには"bytes_in_rate(<period>)“カウンターを保存し、出力データを制限するには"bytes_out_rate(<period>)“カウンターを使わなければなりません。
最後に、帯域制限フィルターが、特定のストリームで一度に転送できる最小バイト数を設定できます。小さすぎる単位での転送を避け、CPU使用率を下げるために使うことを推奨します。値は慎重に決めなければなりません。小さすぎるとCPU使用率が高くなり、大きすぎるとレイテンシーが増える可能性があります。設定した帯域制限とも密接に関係します。制限値に近すぎると、一度に多くのバイトを消費するため、上限を超えないよう途中で一時停止が入る場合があります。適切な値はフィルターの設定に大きく依存します。まずTCP MSSの約2倍、通常は2896バイト程度から始め、実験して調整するのがよいでしょう。
例:
関連項目:“tcp-request content set-bandwidth-limit”、“tcp-response content set-bandwidth-limit”、“http-request set-bandwidth-limit”、“http-response set-bandwidth-limit”。