Posted at

「nginx ssl 」 failed: Error during WebSocket handshake: Unexpected response code: 400

ブラウザのコンソールでエラーが出ていたが、放置していた問題が(動いていたので)解決できたので記念にメモしておく。

日本語のページが無かったので、あると安心する人もいるかもしれない。


目的

タイトルにある通りだ。

何をしているのかというと、node.js + socket.ioでwebサービスを運営している。

ただこのままだとポート番号が出てしまうから、nginxを使って隠している。

このとき、「failed: Error during WebSocket handshake: Unexpected response code: 400」というエラーがでていた。

よくわからないが、実際には動いていたので放置していた。(今は直っている)

このエラーを直したい。


見たページ

https://github.com/socketio/socket.io/issues/1942


いろいろいじった

クライアント側の問題だと思った。


index.js

//このまま動くぞ ○

var socket = io();

このあたりを色々弄れというコメントがあったからいじってみたが全部失敗に終わった。


index.js

//こっちじゃないらしい。☓

// var socket = io(
// 'wss://exsample.com',
// { transports: ['websocket'] }
// );


nginxの設定をいじったら直った


nginx.conf

//動くぞ ○

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}

3行目のproxy_set_header Upgrade $http_upgrade;を書いていなかった。

また4行目を空白にしていたので、upgradeを書いた。

これで再起動したらエラーが見事に消えた。


まとめ

マニュアルを読めという声が聞こえる。

また、それは○○で直ったという情報が散らばっているから1つ1つ試してみた。

ローカルではポート番号を表示してテストしていたが、本番ではnginxを使うことで隠すことにした。

これが結構問題だった。ローカルでも本番と同じ環境でテストしたほうがいいだろう。とは思う・・・。

普段は、LAMPで作っているので勉強になるなあ。