我以前有一个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/*;
nginx
配置中删除任何位置块试图代理到你正在运行你的socket.io服务器的端口。 io.connect()
而不是你正在做的方式来连接。 省略url( https://
)的协议部分。 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