gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:20:03 25 4
gpt4 key购买 nike

一直在扯头发,因为我找不到为什么我不能通过 HTTPS 连接到我的 WebSocket 服务器。

所以,我有一个运行 vue 应用程序的 Express 4 服务器。它使用 npm 中的 ws 库连接到 WebSocket 服务器。 nginx 是 1.10.3。我使用 LetsEncrypt 来保护它。

当我上网时,我得到(在控制台中):

main.js:12 WebSocket connection to 'wss://play.mysite.com:8443/' failed: Error in connection establishment: net::ERR_CONNECTION_CLOSED

第 12 行:

window.ws = new WebSocket(${tls}://${window.location.hostname}:${port});`

wss://play.mysite.com:8443。它确实在子域上。

这是我的 nginx block :更新:我明白了!

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 上有子域。我的 Express 服务器总是监听端口 4000 而我的 WebSocket 服务器监听 wss/端口 8443 生产。

当我查看 /var/log/wss-error-ssl.log 时,我得到:

2018/03/01 04:45:17 [error] 30343#30343: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 68.117.172.118, server: play.mysite.com, request: "GET /static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css HTTP/1.1", upstream: "http://[::1]:4000/static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css", host: "play.mysite.com", referrer: "https://play.mysite.com/"

那么,我究竟做错了什么?

proxy_pass 设置正确。在客户端/服务器上为 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 添加第二个位置 block 并让 javascript 客户端点击 wss://play.mysite.com/websocket

我发现您的 nginx 服务器配置文件存在一些问题。

  1. Nginx 未在端口 8443 上监听,但您的 javascript 正在访问 wss://play.mysite.com:8443。因此,当 nginx 为 play.mysite.com 域提供端口 44380 时,您的 javascript 正试图使用​​ 绕过 nginx >wss (TLS) 并直接点击 NodeJS——尽管我想你打算将 SSL 卸载到 Nginx 上。 wss 调用必须通过 nginx 才能使 SSL 握手成功。

  2. 您正在将所有调用传递给 localhost:4000。相反,我建议您使用两个位置 block location/{ ... }location/websocket { ... } 。这样,在第二个 websocket 位置 block 中,您可以代理将调用传递给 localhost:8443。这需要客户端连接到 wss://play.mysite.com/websocket

关于node.js - 通过 nginx 1.10.3 和 LetsEncrypt 保护 WebSocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48979894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com