WebSocket 错误,意外响应代码:200 与 Nginx 和 Node.js
Posted
技术标签:
【中文标题】WebSocket 错误,意外响应代码:200 与 Nginx 和 Node.js【英文标题】:WebSocket error, Unexpected response code: 200 with Nginx and Node.js 【发布时间】:2019-11-24 06:19:45 【问题描述】:我在 DigitalOcean 上使用 Ubuntu 服务器来托管 nginx Web 服务器和运行 WebSocket 服务器的 Node 应用程序。尝试连接到服务器的 IP 时,我在控制台中收到以下消息:
WebSocket connection to 'ws://<server's public IP>' failed: Error during WebSocket handshake: Unexpected response code: 200
我设置 Nginx 所做的只是关注this guide,它只是告诉你安装 Nginx 并调整 UFW 防火墙。我在第 4 步中没有设置服务器块,也没有触及任何其他配置文件。
之后,我将我的index.html
和client.js
文件放在/var/www/html
目录中,由Nginx 提供服务。
index.html
是一个运行client.js
的非常简单的HTML 页面。该 JS 文件如下所示:
const ws = new WebSocket('ws://<public IP, same as above>:80');
ws.addEventListener('open', () =>
const json = message: 'hello from client!' ;
const jsonString = JSON.stringify(json);
ws.send(jsonString);
);
ws.addEventListener('message', event =>
const data = JSON.parse(event.data);
console.log(data);
);
服务端 Node 应用是websocket.js
,它看起来像这样:
const buffer = require('buffer');
const http = require('http').createServer();
const ws = require('ws');
const wsServer = new ws.Server( server: http );
wsServer.on('connection', (socket) =>
socket.on('message', (msg) =>
console.log('received: ' + msg);
socket.send(Buffer.from('hello from the server!'));
);
const json = message: 'hello from server!' ;
const jsonString = JSON.stringify(json);
socket.send(Buffer.from(jsonString));
);
http.listen(8080, () => console.log('listening on 8080'));
此文件与node_modules
、package.json
和package-lock.json
一起放置在/root
。将它与/var/www/html
的客户端代码一起提供并没有帮助。当然,它也是通过 PM2 运行的,我也尝试在没有 PM2 的情况下运行。
感谢您的帮助,如果有任何我可能遗漏的信息,请告诉我。
【问题讨论】:
【参考方案1】:为了让 Nginx 和 Node.js 正常运行,您需要采取一些额外的步骤。
我去了/etc/nginx/sites-available/default
并更新了这个块:
location /
try_files $uri $uri/ =404;
到这个块:
location /
proxy_pass http://localhost:8080; # change to your port if needed
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
try_files $uri $uri/ =404;
然后更新我的 Node 应用程序以使用 app.use(express.static('/var/www/html'));
通过 Express 提供文件。
这里有几个链接帮助我找到了正确的答案:
Node.js + Nginx - What now?
https://www.digitalocean.com/community/questions/how-to-run-node-js-server-with-nginx
我发现了一个额外的链接,它告诉你更多关于使用的 Nginx 指令:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html
【讨论】:
以上是关于WebSocket 错误,意外响应代码:200 与 Nginx 和 Node.js的主要内容,如果未能解决你的问题,请参考以下文章
WebSocket 握手 - 意外响应代码 200 - AngularJs 和 Spring Boot