Node.js 通过nginx 1.10.3和LetsEncrypt保护WebSocket连接
我一直在胡思乱想,因为我不知道为什么我不能通过HTTPS连接到我的Node.js 通过nginx 1.10.3和LetsEncrypt保护WebSocket连接,node.js,nginx,https,websocket,Node.js,Nginx,Https,Websocket,我一直在胡思乱想,因为我不知道为什么我不能通过HTTPS连接到我的WebSocket服务器 因此,我有一台运行vue应用程序的Express 4服务器。它使用npm中的ws库连接到WebSocket服务器。nginx是1.10.3。我用LetsEncrypt来保护它 当我上网时,我得到(在控制台中): main.js:12连接到'wss://play.mysite.com:8443/'失败:建立连接时出错:网络::错误\u连接\u已关闭 第12行: window.ws=newwebsocket(
WebSocket
服务器
因此,我有一台运行vue
应用程序的Express 4服务器。它使用npm中的ws
库连接到WebSocket
服务器。nginx是1.10.3。我用LetsEncrypt来保护它
当我上网时,我得到(在控制台中):
main.js:12连接到'wss://play.mysite.com:8443/'失败:建立连接时出错:网络::错误\u连接\u已关闭
第12行:
window.ws=newwebsocket(${tls}://${window.location.hostname}:${port}
)`
那就是wss://play.mysite.com:8443
。它确实位于子域上
这是我的nginx
块:
更新:我知道了
upstream websocket {
server 127.0.0.1:8443;
}
server {
root /var/www/play.mysite.com/dist;
index index.html;
access_log /var/log/wss-access-ssl.log;
error_log /var/log/wss-error-ssl.log;
server_name play.mysite.com www.play.mysite.com;
location /ws {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
listen [::]:443 ssl ipv6only=on default_server; # managed by Certbot
listen 443 ssl http2 default_server; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/play.mysite.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/play.mysite.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
如您所见,我们在https://play.mysite.com
。MyExpress
服务器始终在端口4000
上侦听,MyWebSocket
服务器在生产时侦听wss/port8443
当我查看/var/log/wss error ssl.log
时,我得到:
2018/03/01 04:45:17[错误]30343#30343:*1连接()失败(111:连接被拒绝),连接到上游,客户端:68.117.172.118,服务器:play.mysite.com,请求:“GET/static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css HTTP/1.1”,上游:,主机:“play.mysite.com”,参考者:“
那么,我到底做错了什么
代理通行证设置正确。在客户端/服务器上侦听WebSocket
的端口8443
。这是什么意思?多谢各位
编辑:是的,我知道端口8443
正在运行:
root@MySITE:/var/www/play.mysite.com# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:https *:* LISTEN
tcp 0 0 localhost:4000 *:* LISTEN
tcp 0 0 localhost:mysql *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp6 0 0 [::]:8443 [::]:* LISTEN
tcp6 0 0 [::]:https [::]:* LISTEN
tcp6 0 0 [::]:http [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
udp 0 0 *:bootpc *:*
udp 0 0 45.76.1.234.vultr.c:ntp *:*
udp 0 0 localhost:ntp *:*
udp 0 0 *:ntp *:*
udp6 0 0 2001:19f0:5:2b9c:54:ntp [::]:*
udp6 0 0 fe80::5400:1ff:fe61:ntp [::]:*
udp6 0 0 localhost:ntp [::]:*
udp6 0 0 [::]:ntp [::]:*
TL'DR为
/websocket
添加第二个位置块,并让javascript客户端点击wss://play.mysite.com/websocket
我发现您的nginx服务器配置有几个问题
8443
,但您的javascript正在点击wss://play.mysite.com:8443
。因此,当nginx为play.mysite.com
域提供端口443
和80
时,javascript试图使用wss
(TLS)绕过nginx并直接命中NodeJS——尽管我想您是想将SSL卸载到nginx上。wss调用必须通过nginx才能成功进行SSL握手localhost:4000
。相反,我建议您有两个位置块location/{…}
和location/websocket{…}
。这样,在第二个websocket位置块中,您可以代理将调用传递到localhost:8443
。这需要客户端连接到wss://play.mysite.com/websocket
这里有几个技术堆栈。在设置nginx之前,您是否尝试在客户端和服务器之间直接连接WebSocket?可能您缺少了一个
代理\u重定向http://localhost:4000 https://play.mysite.com;代码>。最后,既然您运行了node.js,为什么不试试socket.io呢?在这一行的“升级”中尝试使用大写字母“U”:proxy\U set\U header Connection“upgrade”代码>头是区分大小写的,尽管大多数技术将其视为不敏感的…您不应该使用window.ws=new-WebSocket(${tls}://${window.location.hostname}:${port}/WebSocket/)代码>@faizuddnmohamed它是。仍然-错误。这是有道理的。我这样做了,还升级了updated
变量。我用新的nginxconf
文件更新了我的帖子。。同样的错误。我相信。我还更新了客户端
连接到新WebSocket('wss://play.mysite:8443/websocket)
和/var/log/wss error ssl.log
log。客户端不应使用端口8443,请尝试从URL中删除:8443
。Nginx conf基本上是说:“端口443上的代理传入连接,其位置匹配/websocket
到本地主机:8443
。“这就是为什么我们不需要从客户端定义替代端口8443。相反,只需让wss协议默认为443——端口nginx正在侦听。还要确保删除位置/websocket/{
块上的尾随斜杠。酷!很高兴我们对其进行了排序。祝您的项目玩得开心。