Я копал несколько сообщений здесь о том, как разместить несколько доменов https с помощью Express Vhost на одном сервере, но, похоже, я еще не нашел ответ на вопрос о моей настройке, поэтому укажите, к чему мне обратиться.
У меня есть два домена с этим поддоменом, на самом деле я могу иметь более двух доменов для моего лабораторного тестирования, в каждом из доменов, которые я создалСамопроверка для запуска https.
Я создаю основной скрипт vhost, чтобы запустить весь сайт домена, работающий на узле через app.js.Вот код:
// app.js for web proxy vhost .
var express = require('express');
var vhost = require('vhost');
var app = express();
var compression = require('compression');
var spdy = require('spdy');
app.use(compression());
app.use(vhost('example1.com', require('/websites/example1/app.js')))
.use(vhost('www.example1.com', require('/websites/example1/app.js')))
.use(vhost('sub1.example1.com',require('/websites/example1/sub1/app.js')))
.use(vhost('sub2.example1.com',require('/websites/example1/sub2/app.js')))
.use(vhost('example2.com', require('/websites/example2/app.js')))
.use(vhost('www.example2.com', require('/websites/example2/app.js')))
.listen(80);
});
app.get('/', function(req, res){
res.send('Server running');
});
В каждой из доменных папок сайта у меня есть папка certs, dist для статического контента и маршрут по умолчанию.Вот код сценария запуска веб-сайта
//app.js for example1.com
let logger = require('morgan');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
let proxy = require('http-proxy-middleware');
let appRoutes = require('./routes/app');
let app = express();
let https = require('https');
let compression = require('compression');
let fs = require('fs');
let forcessl = require('express-force-ssl');
let spdy = require('spdy');
// setup ssl
var key = fs.readFileSync('./example1/certificates/private.key');
var cert = fs.readFileSync('./example1/certificates/private.crt');
var ca = fs.readFileSync('./example1/certificates/root.ca');
var options = {
key: key,
cert: cert,
ca: ca
};
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.use(compression({filter: compressContent}));
function compressContent(req, res){
if(req.header['x-no-compression']){
return false
}
return compression.filter(req,res)
}
// uncomment after placing your favicon in /public
app.use(forcessl);
app.use(favicon(path.join(__dirname, 'dist', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'dist')));
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'https://example1.com');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PATCH, DELETE, OPTIONS');
next();
});
app.use('/api/**', proxy({target: 'http://localhost:8080', changeOrigin: false}));
// catch 404 and forward to error handler
app.use(function (req, res, next) {
return res.render('index');
});
spdy.createServer(options, app)
.listen(443, function(){
console.log('listening on port 443! https://example1.com');
})
console.log('Listening on port 80 http://example1.com');
module.exports = app;
На домене example2.com я также создаю сценарий запуска, например example1.com.Вот код:
//app.js for example2.com
let logger = require('morgan');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
let proxy = require('http-proxy-middleware');
let appRoutes = require('./routes/app');
let app = express();
let https = require('https');
let compression = require('compression');
let fs = require('fs');
let forcessl = require('express-force-ssl');
let spdy = require('spdy');
// setup ssl
var key = fs.readFileSync('./example2/certificates/private.key');
var cert = fs.readFileSync('./example2/certificates/private.crt');
var ca = fs.readFileSync('./example2/certificates/root.ca');
var options = {
key: key,
cert: cert,
ca: ca
};
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
app.use(compression({filter: compressContent}));
function compressContent(req, res){
if(req.header['x-no-compression']){
return false
}
return compression.filter(req,res)
}
// uncomment after placing your favicon in /public
app.use(forcessl);
app.use(favicon(path.join(__dirname, 'dist', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'dist')));
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'https://example2.com');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PATCH, DELETE, OPTIONS');
next();
});
app.use('/api/**', proxy({target: 'http://localhost:8081', changeOrigin: false}));
// catch 404 and forward to error handler
app.use(function (req, res, next) {
return res.render('index');
});
spdy.createServer(options, app)
.listen(443, function(){
console.log('listening on port 443! https://example2.com');
})
console.log('Listening on port 80 http://example2.com');
module.exports = app;
Проблема, с которой я столкнулся сейчас, заключается в том, что я не могу создать второй сервер https и прослушивать порт 443 для домена example2.com, кроме первого, которыйпрослушал на exmaple1.com 443 из-за конфликта портов.
Как я могу запустить оба https на example1.com и example2.com?Примечание: я использую spdy для протокола https и http2 вместо обычного https.