動作環境
- rails 4.1.0
- websocket-rails 0.7.0
websocket-railsを使ったところ、SSLのところでつまずいたのですがあまり情報もなかったのでメモしておきます。
standaloneモード
-
githubのwikiに記載されているように、PassengerでRailsアプリを起動している場合には、Railsアプリとは別にサーバを起動する必要があります。
-
しかし、websocketを利用しているページのプロトコルがhttpsの場合、websocketのプロトコルもSSL通信にする必要があります。
仮に、websocketを利用しているページのURL(ここではhttps://example.com/dashboard
とする)にアクセスした場合、次のようなエラーが出力されます。
ブラウザconsole
WebSocket connection to 'wss://example.com:3001/websocket' failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR
standaloneモードのサーバにSSLの設定
- gemに用意されているrakeタスクを使うと、thinが起動します。このままだとSSL通信できません。
bundle exec rake websocket_rails:start_server
- SSL通信をできるようにするには、websocketのconfigurationで、thinの起動オプションに次の設定を行います。
config/initializers/websocket_rails.rb
config.thin_options = {
ssl: true,
ssl_key_file: 'path_to_ssl_key_file',
ssl_cert_file: 'path_to_ssl_cert_file',
ssl_disable_verify: true,
}
こちらを設定したあとに、rakeタスクでサーバを起動すればhttpsのサイトでも、standaloneモードのサーバで、websocketが利用できるようになりました。
機会があれば、Apache側で一旦、wssの通信を受けて、reverse proxyでthinにはSSL無しでつなぐということも試してみたいと思っています。