【问题标题】:Socket.io SSL connection with Nginx and ExpressSocket.io SSL 连接与 Nginx 和 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 标志一样简单。 stackoverflow.com/questions/30317831/socket-io-nodejs-nginx-ssl
  • 我试过了,但没有任何改变。 Express 可以很好地在 https 中提供我的 html 页面。只有 socket.io 失败了。
  • 您不应该使用wss 协议从客户端连接吗?
  • 也试过了,还是一样。
  • 我过去也有同样的要求,我设法找到了可行的解决方案。请在此处参考我的问答,了解我的 nginx+express+client 配置,这可能对您有所帮助:stackoverflow.com/q/30673664/1874155

标签: node.js ssl express nginx socket.io


【解决方案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;
   }
}

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多