リバースプロキシのエラーを示す Proxy-Statusヘッダの提案仕様

CDNクラウドのロードバランサを使用するのは一般的です。これらのリバースプロキシは様々な理由により502 Bad Gateway504 Gateway Timeoutを返しますが、トラブルシュートするには情報が少ない場合があります。

また、追加の情報を示す場合においても、各社によって異なっています。

そこで、プロキシのエラー情報を示すProxy-Statusレスポンスヘッダを定義する「The Proxy-Status HTTP Header Field」という提案仕様がFastlyのmnot氏らより出されています。

初版のdraftだが読む。

Proxy-Statusヘッダはまずそのエラータイプが示され、Extra Parameters続きます(ない場合もあります)。

f:id:ASnoKaze:20190221012051p:plain
Proxy-Statusの例を示します。

   HTTP/1.1 504 Gateway Timeout
   Proxy-Status: connection_timeout; proxy=SomeCDN; origin=abc; tries=3

上記は、SomeCDNがオリジンであるabcに対して3回思考した後、connection_timeoutのエラーとなったことを示します。
proxy, origin, tries などがExtra Parametersです。

Proxy Status Types

現在はエラーとして様々なタイプが定義されています。

エラーごとに推奨されるステータスコードも併記されている。また、エラーごとに付与されるExtra Parametersが異なるが本記事では省略する。

  • dns_timeout: 宛先ホスト名の解決にタイムアウトした(504)
  • dns_error: 宛先ホスト名の解決エラーとなった(502)
  • destination_not_found: 適切なバックエンドを決定できなかった(500)
  • destination_unavailable: ネクストホップが利用できないと判断した(503)。ヘルスチェックがダウンしてる場合など。
  • destination_ip_prohibited: 宛先IPへの接続を禁止する設定になっている(502)
  • destination_ip_unroutable: 宛先IPへの経路を見つけることができなかった(502)
  • connection_refused: ネクストホップに拒否された(502)
  • connection_terminated: ネクストホップに切断された(502)
  • connection_timeout: ネクストホップへの接続がタイムアウトした(504)
  • connection_read_timeout: 期待すべきデータを待ったが上限にたっした(504)
  • connection_write_timeout: データを書き込もうとしたが出来なかった。バッファがはけなかった場合など(504)
  • connnection_limit_reached: コネクション数の上限に達した
  • http_response_status: 4xxや5xxのレスポンスを受け取った
  • http_response_incomplete: 受け取ったレスポンスが不完全(502)
  • http_protocol_error: HTTPプロトコルエラー(502)
  • http_response_header_block_size: HTTPレスポンスヘッダブロックが大きすぎる(502)
  • http_response_header_size: HTTPレスポンスヘッダのいずれかが大きすぎる(502)
  • http_response_body_size: HTTPレスポンスボディが大きすぎる
  • http_response_transfer_coding: レスポンスのtransfer-codingデコードエラー(502)
  • http_response_content_coding: レスポンスのcontent-codingデコードエラー(502)
  • http_response_timeout: HTTPレスポンスのタイムアウト(504)
  • tls_handshake_error: ネクストホップとのTLSハンドシェイクエラー(502)
  • tls_untrusted_peer_certificate: ネクストホップとのTLSハンドシェイクにおける信頼できない証明書エラー(502)
  • tls_expired_peer_certificate: ネクストホップとのTLSハンドシェイクにおける証明書有効期限切れ(502)
  • tls_unexpected_peer_certificate: ネクストホップとのTLSハンドシェイクにおける期待されない証明書のエラー(502)
  • tls_unexpected_peer_identity: ネクストホップとのTLSハンドシェイクにおける名前の不一致(502)。Subject Alternative Nameの不一致など
  • tls_missing_proxy_certificate: ネクストホップとのTLSハンドシェイクで証明書を要求したが設定されていなかった(500)
  • tls_rejected_proxy_certificate: TLSハンドシェイク中に得られた証明書を拒否した(500)
  • tls_error: ネクストホップとの通信中のTLSエラー(502)
  • http_request_error: オリジンに代わって、プロキシが400, 403などのステータスコードを返す
  • http_request_denied: HTTPリクエストを拒否し、HTTPリクエストはフォワードしなかった。
  • http_upgrade_failed: プロキシとネクストホップ間でHTTP Upgradeに失敗した(502)
  • proxy_internal_error: オリジンと関係しないプロキシ内のエラー(500)