Socket.io SSL 连接与 Nginx 和 Express
Posted
技术标签:
【中文标题】Socket.io SSL 连接与 Nginx 和 Express【英文标题】:Socket.io SSL connection with Nginx and Express 【发布时间】:2016-09-09 23:01:06 【问题描述】:我试图在我的运行 socket.io 的应用程序上使用 SSL,但我无法让它工作。我已经完成了我的研究,但我发现没有一个有效。
我一直有错误:ERR_CONNECTION_CLOSED,客户端没有 http 状态代码。
GET https://subdomain.mywebsite.com:1339/socket.io/?EIO=3&transport=polling&t=LIgxHmz net::ERR_CONNECTION_CLOSED
这是我的 nginx 配置:
server
listen 443;
server_name subdomain.mywebsite.com;
root /usr/share/nginx/html;
index index.html index.htm;
ssl on;
# Use certificate and key provided by Let's Encrypt:
ssl_certificate /etc/letsencrypt/live/subdomain.mywebsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/subdomain.mywebsite.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
location /
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:1339/;
proxy_redirect off;
# Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
这里是服务器端:
var express = require('express'),
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
server.listen(1339);
...
这是客户端: subdomain.mywebsite.com
var socket = io.connect("https://subdomain.mywebsite.com:1339");
页面加载良好,服务器端没有错误,但没有连接到 socket.io。 在我尝试切换到 SSL 之前,一切都完美无缺。
我做错了什么?
【问题讨论】:
根据您使用的 nginx 版本,它可能就像移动 ssl 标志一样简单。 ***.com/questions/30317831/socket-io-nodejs-nginx-ssl 我试过了,但没有任何改变。 Express 可以很好地在 https 中提供我的 html 页面。只有 socket.io 失败了。 您不应该使用wss
协议从客户端连接吗?
也试过了,还是一样。
我过去也有同样的要求,我设法找到了可行的解决方案。请在此处参考我的问答,了解我的 nginx+express+client 配置,这可能对您有所帮助:***.com/q/30673664/1874155
【参考方案1】:
试试这个配置。请确保拥有正确的 SSL 证书和密钥。如果您在本地测试,您可以轻松使用mkcert 工具生成 SSL 证书以进行本地测试。
server
listen 80;
server_name <your server_name>;
return 301 https://<your server_name>$request_uri;
server
listen 443 ssl;
ssl_certificate <your certificate path>; # better if you put them at /etc/nginx/ssl/
ssl_certificate_key <your certificate_key path >;
server_name <your server_name>;
location /
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_buffering off;
【讨论】:
以上是关于Socket.io SSL 连接与 Nginx 和 Express的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes Nginx Ingress 和 Socket.io 连接问题
Socket.io无法在Node.js前面使用Nginx反向代理
Socket.io 无法在 nginx + node.js + php 应用程序中连接