expressjs-vhost с несколькими доменами https - где я ошибаюсь в этой настройке? - PullRequest
0 голосов
/ 02 марта 2019

Я копал несколько сообщений здесь о том, как разместить несколько доменов https с помощью Express Vhost на одном сервере, но, похоже, я еще не нашел ответ на вопрос о моей настройке, поэтому укажите, к чему мне обратиться.

Вот мои настройки:

  1. У меня есть два домена с этим поддоменом, на самом деле я могу иметь более двух доменов для моего лабораторного тестирования, в каждом из доменов, которые я создалСамопроверка для запуска https.

  2. Я создаю основной скрипт 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');
    });
    
  3. В каждой из доменных папок сайта у меня есть папка 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;
    
  4. На домене 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.

...