tes*_*est 2 https nginx websocket node.js
因为无法找出为什么无法通过来连接WebSocket服务器,所以一直在扯头发HTTPS。
因此,我有一台运行vue应用程序的Express 4服务器。它使用wsnpm中的库连接到WebSocket服务器。Nginx是1.10.3。我使用LetsEncrypt保护它。
当我上网时,会收到(在控制台中):
main.js:12与'wss://play.mysite.com:8443 /'的WebSocket连接失败:连接建立错误:net :: ERR_CONNECTION_CLOSED
第12行:
window.ws = new WebSocket(
${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
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们的子域位于https://play.mysite.com。我的Express服务器始终在端口上侦听,4000而WebSocket服务器在生产中侦听wss/端口8443。
当查看时/var/log/wss-error-ssl.log,我得到:
2018/03/01 04:45:17 [错误] 30343#30343:在连接到上游时* 1 connect()失败(111:连接被拒绝),客户端:68.117.172.118,服务器:play.mysite.com,请求: “ GET /static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css HTTP / 1.1”,上游:“ http://[::1]:4000/static/css/app.67b8cb3fda61e1e2deaa067e29b52040.css ”,主机:“ play.mysite。 com”,引荐来源网址:“ https://play.mysite.com/ ”
那么,我到底在做什么错?
该proxy_pass是正确的设置。监听端口8443的WebSocket两个客户端/服务器上。什么意思?谢谢。
编辑:是的,我知道端口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 [::]:*
Run Code Online (Sandbox Code Playgroud)
TL'DR为添加第二个位置块/websocket并点击javascript客户端wss://play.mysite.com/websocket
我看到您的Nginx服务器配置有几个问题。
Nginx不在端口上侦听,8443但是您的javascript命中了wss://play.mysite.com:8443。因此,尽管nginx的是服务了港口443和80为play.mysite.com域,你的JavaScript使用试图绕过的nginx wss(TLS),并直接命中的NodeJS -尽管我想你的意思来卸载SSL到Nginx的。wss调用必须通过nginx才能成功进行SSL握手。
您正在将所有呼叫转接到localhost:4000。相反,我建议您有两个位置块location / { ... }和location /websocket { ... }。这样,在第二个websocket位置块中,您可以代理将呼叫传递到localhost:8443。这将要求客户端连接到wss://play.mysite.com/websocket。
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |