Cloudflare は、追加設定なしでプロキシされた WebSocket 接続に対応しています。
WebSockets は、クライアントとオリジンサーバーのあいだで維持される開いた接続です。WebSockets 接続の内部では、クライアントとオリジンがセッションを再確立せずにデータをやり取りできます。そのため、WebSockets 接続内でのデータ交換は高速です。WebSockets は、ライブチャットやゲームなどのリアルタイムアプリケーションでよく使われます。
ダッシュボードでオリジンサーバーへの WebSockets 接続を有効にするには、次の手順を実行します。
-
Cloudflare ダッシュボードで Network ページを開きます。
Network を開く ↗ -
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 Analytics、GraphQL Analytics API、HTTP リクエストログ で確認できます。
Cloudflare がグローバルネットワークへ新しいコードをリリースするとき、サーバーを再起動することがあり、その場合 WebSockets 接続は終了します。
- keepalive ↗ を実装します。
- オリジンやクライアントのタイムアウト設定を見直し、削除するか延長します。
WebSocket の問題調査には、wscat ↗ のようなクライアントツールが役立ちます。シンプルなツールで 1 つの URL に対して問題を再現できると、原因を絞り込みやすくなります。
HTTP リクエストログ の EdgeStartTimestamp と EdgeStopTimestamp フィールドは、WebSocket 接続の継続時間を表します(最初の HTTP 接続の時間ではありません)。
どちらの方向にもデータが流れない状態が一定時間続くと、Cloudflare は WebSocket 接続を閉じます。Enterprise のお客様は、アカウントチームに連絡してカスタムのアイドルタイムアウトを設定できます。アイドル中も長寿命接続を維持するには、クライアント側のハートビート(ping/pong)を実装します。
WebSocket オリジンが Cloudflare Load Balancer の背後にある場合は、Session affinity を有効にして、同じクライアントからのリクエストが同じオリジンサーバーへ届くようにします。セッションアフィニティがないと、WebSocket の再接続が、セッション状態を持たない別のオリジンへ着くことがあります。