【发布时间】:2018-03-30 13:25:53
【问题描述】:
我在运行于express 的node.js 应用程序中使用socket.io。
在本地版本 (localhost) 上一切正常,但是当我切换到生产服务器(使用自定义证书通过 https 提供服务)时,我在浏览器控制台中收到以下错误:
websocket.js:112 WebSocket connection to 'wss://infranodus.com/socket.io/?EIO=3&transport=websocket&sid=j_WBxkPY_RlpF9_ZAANP' failed: Error during WebSocket handshake: Unexpected response code: 400
我进行了一项研究 (issue referenced here),结果发现这是因为我的应用程序/托管服务提供商阻止了像 wss 这样的连接,而我的 socket.io 依靠 AJAX 发出请求(功能正常,但是有时会有错误)。
所以我想问你是否可以对我的应用程序进行修改以消除此错误?
仅供参考,目前对http://infranodus.com 的所有请求都被转发(通过静态.htaccess)到https://infranodus.com 和我的app.js 文件(服务器激活的部分看起来像这样):
var http = require('http');
var app = express();
var server = http.Server(app);
var io = require('socket.io')(server);
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
以及我在前端文件中需要套接字的方式:
<script src="/socket.io/socket.io.js"></script>
然后
var socket = io();
也许问题是我使用http 而不是https 在我的node.js 应用程序中激活服务器?但我不想切换到那个,因为我不知道我的证书存储在哪里,我不想过多地更改后端代码。
更新(2018 年 10 月 21 日): 我们发现问题出在 with nginx server 并且由于一些不允许用户编辑 nginx 服务器的托管服务提供商的限制,websockets 过于安全协议被阻止或出现 400 错误。最好在 sockets.io 中解决这个问题,因为这是许多用户遇到的问题。有什么想法吗?
重现问题:请打开您的 Javascript 控制台并转到 https://infranodus.com/news/english
【问题讨论】:
-
你在哪里托管你的应用程序?,你有多个服务器,还是只有一个?
-
@MarcosCasagrande 我只有一台服务器,我将它托管在 Webfaction 上
-
你的 node 应用前面有 nginx 服务器吗?
-
我想是的,@MarcosCasagrande - 我该如何检查?
-
如果您不确定,可能无法控制它,您将无法更改任何内容。 stackoverflow.com/questions/29043879/socket-io-with-nginx
标签: node.js sockets nginx websocket socket.io