CDNやクラウドのロードバランサを使用するのは一般的です。これらのリバースプロキシは様々な理由により502 Bad Gatewayや504 Gateway Timeoutを返しますが、トラブルシュートするには情報が少ない場合があります。
また、追加の情報を示す場合においても、各社によって異なっています。
そこで、プロキシのエラー情報を示すProxy-Statusレスポンスヘッダを定義する「The Proxy-Status HTTP Header Field」という提案仕様がFastlyのmnot氏らより出されています。
初版のdraftだが読む。
例
Proxy-Statusヘッダはまずそのエラータイプが示され、Extra Parameters続きます(ない場合もあります)。
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)