通过SSL使用Socket.io Node.js时发生错误的网关错误
我以前有一个Socket.io脚本可以在http上正常运行,但升级到https会破坏它。我已经在服务器上安装了证书,但运气不好。服务器设置的代码为:通过SSL使用Socket.io Node.js时发生错误的网关错误,node.js,ssl,nginx,socket.io,Node.js,Ssl,Nginx,Socket.io,我以前有一个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('
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(坏网关)
响应
有没有关于脚本设置是否错误的想法?或者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
配置中删除试图代理到您正在运行socket.io服务器的端口的所有位置块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文件中读取证书和密钥文件的路径,但您应该正确理解这一点?502(坏网关)表示nginx服务试图联系代理服务器,但失败。nginx配置中的行
proxy_pass https://socket.example.co.uk:3000;
这似乎是个问题。从您的nodejs代码中看不到正在使用端口3000。我也有同样的问题,但对于apache2,我通过将此行添加到vhost配置中来解决它
SSLProxyEngine打开
SSLProxyVerify无
SSLProxyCheckPeerCN关闭
SSLProxyCheckPeerName关闭
SSLProxyCheckPeerExpire off
连接到服务器时是否传递{secure:true}?无需通过nginx代理node.js。端口已打开,因此正在连接io.connect(':',{secure:true})您只需从客户端执行代码>即可启动并运行。不可能通过nginx进行代理(这是不必要的,因为节点绑定到所有接口,并且由于DNS配置,域被路由到您的ip:端口)。昨天我把我的socket io升级到https没有问题。@r3wt所以你是说域应该有所不同?应该是什么?我正在使用代码var io=io('https://socket.example.com/socketio/socketio.js“,{secure:true})代码>@r3wt:(不需要姓名。我正在尽全力,你不必帮助我。我现在就发布前端代码……那些因我缺乏努力而给我打电话的人正是他们让我成为了一名更好的开发人员。与其原谅自己的无能,不如将此视为一份礼物,这样你就可以看到自己的不足和需要在这方面我没有任何运气。不管怎样谢谢你的帮助。也许在我的设置中有其他东西打破了某些东西…我现在只是放弃。。。
proxy_pass https://socket.example.co.uk:3000;