通过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浏览器中,页面无法连接到它,并且控制台显示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> 

编辑:: Nginxconfiguration:

 # 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/*; 

  1. 确保你的域指向你的服务器。
  2. 确保启用了ssl的nginx服务器块正在为您的域运行。
  3. 从你的nginx配置中删除任何位置块试图代理到你正在运行你的socket.io服务器的端口。
  4. 确保你的ssl证书是有效的。
  5. 使用io.connect()而不是你正在做的方式来连接。 省略url( https:// )的协议部分。
  6. 使用sudo killall -9 node行中的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(Bad Gateway)表示nginx服务试图联系代理服务器,但失败。 nginx配置中的行

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

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

我有同样的问题,但与Apache2,我解决了这个问题,添加到我的虚拟主机配置

SSLProxyEngine on SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off