微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我之前有一个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);

但是,在Web浏览器中,页面无法连接到该页面,并且控制台显示服务器响应状态为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/*;

解决方法:

>确保您的域指向您的服务器.
>确保在启用了ssl的域中运行Nginx服务器块.
>从Nginx配置中删除任何位置块,尝试代理到运行socket.io服务器的端口.
>确保您的ssl证书有效.
>用io.connect()连接而不是你正在做的方式.省略url的协议部分(https://).
>从命令行使用sudo killall -9节点来杀死可能会延迟并绑定到您的端口的任何僵尸进程.当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文件中读取我的证书和密钥文件的路径,但你应该明白这个想法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐