通过 SSL 使用 Socket.io Node.js 出现网关错误

Posted

技术标签:

【中文标题】通过 SSL 使用 Socket.io Node.js 出现网关错误【英文标题】:Bad Gateway Error using Socket.io Node.js over SSL 【发布时间】:2016-06-12 10:27:22 【问题描述】:

我之前有一个 Socket.io 脚本在 http 上运行良好,但升级到 https 已经破坏了它。我已经在服务器上安装了证书,但没有运气。服务器设置的代码是:

var https = require('https'),
    fs =    require('fs');

var options = 
    key:    fs.readFileSync('/etc/nginx/ssl/default/54082/server.key'),
    cert:   fs.readFileSync('/etc/nginx/ssl/default/54082/server.crt')
;
var app = https.createServer(options);

var io = require('socket.io').listen(app);

但是在网络浏览器中,页面无法连接到它,并且控制台显示the server responded with a status of 502 (Bad Gateway) 响应。

关于脚本设置是否错误的任何想法?或者可能是 Nginx 设置中的某些内容?

非常感谢

编辑:我用来连接的前端代码:

<script type="text/javascript" src="https://socket.example.com/socket.io/socket.io.js"></script>
<script>
var io = io('https://socket.example.com',  secure: true );
</script>

编辑:: Nginx 配置:

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/socket.example.co.uk/before/*;

server 
    listen 443 ssl;
    server_name socket.example.co.uk;
    root /home/forge/socket.example.co.uk;

    # FORGE CONFIG (DOT NOT REMOVE!)
    include forge-conf/socket.example.co.uk/server/*;

    location /     
        proxy_pass https://socket.example.co.uk:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    



# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/socket.example.co.uk/after/*;

【问题讨论】:

连接服务器时是否传递了 secure: true ? ***.com/questions/6599470/node-js-socket-io-with-ssl 不需要通过nginx代理到node.js。端口是开放的,因此您只需从客户端连接io.connect('&lt;domain&gt;:&lt;port&gt;',secure:true); 即可启动并运行。无法通过 nginx 进行代理(也没有必要,因为节点绑定到所有接口,并且由于 DNS 配置,域无论如何都会路由到您的 ip:port)。我昨天确实将我的套接字 io 升级到了 https 没有问题。 @r3wt 所以你是说域名应该有所不同?应该是什么?我正在使用代码var io = io('https://socket.example.com/socketio/socketio.js', secure: true ); @r3wt :( 不需要名字。我正在尽力而为,您不必帮助我。我现在将发布前端代码... 那些因为我缺乏努力而打电话给我的人是让我成为更好的开发人员的人。与其为自己的无能而原谅自己,不如将其视为一份礼物,这样你才能看到自己的不足和需要改进的地方。 【参考方案1】:
    确保您的域指向您的服务器。 确保 nginx 服务器块正在为您的域运行并启用 ssl。 从您的 nginx 配置中删除任何位置块,尝试代理到您运行 socket.io 服务器的端口。 确保您的 ssl 证书有效。 与io.connect() 联系,而不是您正在做的事情。省略 url 的协议部分 (https://)。 在命令行中使用sudo killall -9 node 来杀死任何可能滞留并绑定到您的端口的僵尸进程。当 socket.io 无法正常关闭时,有时会发生这种情况。

我自己的代码示例:

var socket = io.connect('dev.somedomain.com:3000',secure:true);

我自己域中的服务器示例:

var fs = require('fs'),
    https = require('https'),
    config = JSON.parse(fs.readFileSync('./config.json','utf-8')),
    serverOpts = 
        key: fs.readFileSync(config.server.key),
        cert: fs.readFileSync(config.server.cert)
    ,
    server = https.createServer(serverOpts,function(req,res)),
    io = require('socket.io').listen(server);

io.on('connection', function(socket)
   console.log('houston, we have lift off');
);

server.listen(config.port, function()
    log('listening on *:%d',config.port);
);

显然我正在从 config.json 文件中读取我的证书和密钥文件的路径,但你应该明白吗?

【讨论】:

没有任何运气。无论如何感谢您的帮助。也许我的设置中有其他东西破坏了某些东西......我现在只是放弃......【参考方案2】:

502 (Bad Gateway) 表示 nginx 服务尝试联系代理服务器但失败。 nginx 配置中的那一行

 proxy_pass https://socket.example.co.uk:3000;

似乎是问题所在。无法从您的 nodejs 代码中看到正在使用端口 3000。

【讨论】:

【参考方案3】:

我有同样的问题,但使用 apache2,我通过将此行添加到我的虚拟主机配置来解决它

SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off

【讨论】:

以上是关于通过 SSL 使用 Socket.io Node.js 出现网关错误的主要内容,如果未能解决你的问题,请参考以下文章

Nginx + Node.js + Socket.io + SSL 可能吗?

将 Socket.IO 与 Apache、Node.js、SSL 和 CloudFlare (HTTP 500) 一起使用

在 node.js 中使用 socket.io 设置服务器-服务器 SSL 通信

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

node ios socket.io SSL 适用于 xcode 调试,但不适用于 ipa install

为 socket.io 和 SSL / WSS 配置 Apache