我在使用nginx和我的ssl证书,它给我的网站的https版本,这是很好的。问题是,除非我使用常规的http连接,否则我的socket.io通信无法工作。如果这段时间有点长,我很抱歉,但我不知道我在这里做什么,我想确定你们是否拥有了可能需要知道的一切。我尝试了各种不同的网站的解决方案,其中一些是在这里,但没有一个有效。
我尝试手动创建https服务器,而不是让express来完成,但这根本没有导致加载,使用当前的实现,我至少可以看到站点。
upstream project {
server example.org:4000;
}
server {
listen 80;
return https://$host$request_uri;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /home/adam/SSL/public.crt;
ssl_certificate_key /home/adam/SSL/example.org.key;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://example.org;
}
}
这似乎是起作用的,因为当我去我的网站,它会自动带我到https版本和页面被加载。问题是当客户端试图连接时,我一直得到:
"CLOSED“
打印到控制台
以下是我的客户端和服务器代码:
var IPaddress = 'https://MY_SERVER_IP:4040';
var socket = io.connect(IPaddress,{secure:true});
socket.on('connect', function (socket) {
console.log('Connected!');
});
服务器代码:
var express = require('express');
var app = express();
var privateKey = fs.readFileSync(__dirname+'/SSL/example.com.key','utf8');
var certificate = fs.readFileSync(__dirname+'/SSL/public.crt','utf8');
var intermediate = fs.readFileSync(__dirname+'/SSL/intermediate.crt','utf8');
var options = {key:privateKey,cert:certificate,ca:intermediate};
var io = require('socket.io').listen(4040,options);
//var io = require('socket.io').listen(4040);
io.sockets.on('connection', function (socket) {
socket.on('disconnect',function(){
console.log("A client has left us :(");
});
});
app.listen(4000);
更新-2017年12月2日
在我的代码中,我有一行:
require('./routes.js')(app);
其中包括:
module.exports = function(app) {
app.get('/main',function(req,res){
if (req.session.user == null){
// if user is not logged-in redirect back to login page //
res.redirect('/');
} else{
res.sendFile(path.join(__dirname + '/FrontEnd/main.html'));
}
});
// viewed at http://localhost:8080
app.get('/', function(req, res) {
if(req.cookies.user == undefined || req.cookies.pass == undefined){
res.sendFile(path.join(__dirname + '/FrontEnd/login.html'));
}else {
//attempt automatic login
AM.autoLogin(req.cookies.user,req.cookies.pass,function(o){
if(o !=null){
req.session.user = o;
res.sendFile(path.join(__dirname + '/FrontEnd/home.html'));
}else{
res.sendFile(path.join(__dirname + '/FrontEnd/login.html'));
}
});
}
});
.
这会导致502坏网关错误吗?
发布于 2017-11-30 13:06:31
在我的评论中,在您当前的服务器代码中,express和socket.io都只接受常规的HTTP连接。socket.io listen(port[, options])
函数不接受HTTPS连接。
您从手动创建HTTPS服务器开始使用正确的方法。然后,您需要将express和socket.io附加到该服务器。
var fs = require('fs');
var express = require('express');
var app = express();
var privateKey = fs.readFileSync(__dirname + '/SSL/example.com.key', 'utf8');
var certificate = fs.readFileSync(__dirname + '/SSL/public.crt', 'utf8');
var intermediate = fs.readFileSync(__dirname+'/SSL/intermediate.crt', 'utf8');
var options = { key: privateKey, cert: certificate, ca: intermediate };
// Create our HTTPS server here and attach express to it
var server = require('https').createServer(options, app);
// Attach socket.io to our existing HTTPS server
var io = require('socket.io')(server);
io.sockets.on('connection', function (socket) {
socket.on('disconnect', function() {
console.log("A client has left us :(");
});
});
server.listen(4000);
https://stackoverflow.com/questions/47570948
复制