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的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 在 /socket.io 请求上返回 400

Kubernetes Nginx Ingress 和 Socket.io 连接问题

Socket.io无法在Node.js前面使用Nginx反向代理

Socket.io 无法在 nginx + node.js + php 应用程序中连接

Socket.io + SSL + 自签名 CA 证书在连接时出错

带有 express 的 socket.io 中的 SSL:缺少 PFX 或证书 + 私钥。