Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

WebSockets

最終更新 Markdown で表示Agent セットアップ

Cloudflare は、追加設定なしでプロキシされた WebSocket 接続に対応しています。

背景

WebSockets は、クライアントとオリジンサーバーのあいだで維持される開いた接続です。WebSockets 接続の内部では、クライアントとオリジンがセッションを再確立せずにデータをやり取りできます。そのため、WebSockets 接続内でのデータ交換は高速です。WebSockets は、ライブチャットやゲームなどのリアルタイムアプリケーションでよく使われます。

WebSockets を有効にする

ダッシュボードでオリジンサーバーへの WebSockets 接続を有効にするには、次の手順を実行します。

  1. Cloudflare ダッシュボードで Network ページを開きます。

    Network を開く ↗
  2. WebSockets のトグルを On に切り替えます。

API でオリジンサーバーへの WebSockets 接続を有効にするには、URI パスの設定名を websockets にし、value パラメーターを "on" にした PATCH リクエストを送信します。

互換性に関する注意

プロダクト 互換 備考
Argo いいえ Argo は WebSockets と互換性がありません。
SSL はい
WAF はい* 最初の HTTP 101 リクエストは、ほかの WebSockets 接続と同様に、WAF のマネージドルール、カスタムルール、レート制限ルール、その他の WAF 機能の対象になります。ただし、接続が確立されたあとは、WAF はそれ以上の検査を行いません。
Workers はい WebSocket セッションのエンドポイントとして Durable Objects も使えます。クライアントとの送受信メッセージを完全に制御できます。

提供プラン

WebSockets は、すべての Cloudflare プランで使えます。

リクエストと帯域幅の計測

WebSocket 接続の性質上、リクエスト数と帯域幅の使われ方は、通常の HTTP トラフィックと異なることがあります。Enterprise のお客様は、利用量を正確に見積もるために、Cloudflare がリクエストと帯域幅をどう計測するかを確認してください。

Cloudflare は、1 つの WebSocket 接続を次のように計測します。

  • リクエスト: Cloudflare が HTTP リクエストとして認識するのは、WebSocket 接続ごとの最初の upgrade リクエストだけです。確立済みの WebSocket 接続で双方向のメッセージストリームを送っても、1 つの長寿命 HTTP リクエストとしてカウントされます。

  • 帯域幅: Cloudflare は、Cloudflare からクライアントへ送るデータ転送を計測します。通常は、Cloudflare の背後にある WebSocket サーバーから WebSocket クライアントへのメッセージが帯域幅使用量に計上されます。

WebSocket 接続が閉じたあと、集計した WebSocket の利用状況は Traffic AnalyticsGraphQL Analytics APIHTTP リクエストログ で確認できます。

技術的な注意

Cloudflare がグローバルネットワークへ新しいコードをリリースするとき、サーバーを再起動することがあり、その場合 WebSockets 接続は終了します。

推奨事項

  • keepalive を実装します。
  • オリジンやクライアントのタイムアウト設定を見直し、削除するか延長します。

トラブルシューティング

WebSocket の問題調査には、wscat のようなクライアントツールが役立ちます。シンプルなツールで 1 つの URL に対して問題を再現できると、原因を絞り込みやすくなります。

HTTP リクエストログEdgeStartTimestampEdgeStopTimestamp フィールドは、WebSocket 接続の継続時間を表します(最初の HTTP 接続の時間ではありません)。

接続の制限

アイドルタイムアウト

どちらの方向にもデータが流れない状態が一定時間続くと、Cloudflare は WebSocket 接続を閉じます。Enterprise のお客様は、アカウントチームに連絡してカスタムのアイドルタイムアウトを設定できます。アイドル中も長寿命接続を維持するには、クライアント側のハートビート(ping/pong)を実装します。

ロードバランスされた WebSocket オリジンのセッションアフィニティ

WebSocket オリジンが Cloudflare Load Balancer の背後にある場合は、Session affinity を有効にして、同じクライアントからのリクエストが同じオリジンサーバーへ届くようにします。セッションアフィニティがないと、WebSocket の再接続が、セッション状態を持たない別のオリジンへ着くことがあります。

役に立ちましたか?