Azure Websites 上の Node.js で WebSocket を使えるようにする方法

今しがた数分ハマったので覚書。

Websites ではご存じの通りNode が動く。

Node アプリケーションでは Socket.IO 等を使って WebSocket 通信をするシチュエーションが結構あるので、ぜひ Websites でも WebSocket を使いたい。

Websites の管理画面の構成タブの全般セクションの中に WEB SOCKET という項目があり、これをオンにすると Websites で WebSocket 通信が有効になる

でも、これだけでは Node アプリケーションで WebSocket が使えるようにはならない。

このままの状態で動かしてみると、次のようなエラー出力が見られる。

クライアント側
Error during WebSocket handshake: Unexpected response code: 502  
サーバー側
warn: client not handshaken client should reconnect  
info: transport end (error)  

この公式ブログ記事 によると、iiswsock.dll というIISのWebSocketをサポートするためのモジュールが Node にとっては不要(邪魔) であるため、無効化する必要があると書かれている。

This web.config entry turns off the IIS WebSockets support module (iiswsock.dll) since it isn’t needed by node.js. Nodej.js on IIS includes its own low-level implementation of WebSockets, which is why the IIS support module needs to be explicitly turned off.

(この辺も管理コンソールから設定変更できるようになると嬉しい)

という訳で、例によって Web.config ファイルで設定する。

configuration > system.webServer の下に <webSocket enabled="false" /> を追加して IIS側のWebSocketサポートを無効にする。

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
  <system.webServer>
    <webSocket enabled="false" />
    ...

これで Websites で WebSocket が使えるようになる。めんどいけど。

公式チュートリアル