Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 通过nginx 1.10.3和LetsEncrypt保护WebSocket连接_Node.js_Nginx_Https_Websocket - Fatal编程技术网

Node.js 通过nginx 1.10.3和LetsEncrypt保护WebSocket连接

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(

我一直在胡思乱想,因为我不知道为什么我不能通过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(
${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
。My
Express
服务器始终在端口
4000
上侦听,My
WebSocket
服务器在生产时侦听wss/port
8443

当我查看
/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服务器配置有几个问题

  • 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
    变量。我用新的nginx
    conf
    文件更新了我的帖子。。同样的错误。我相信。我还更新了
    客户端
    连接到
    新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/{
    块上的尾随斜杠。酷!很高兴我们对其进行了排序。祝您的项目玩得开心。