如何在nodejs中使用https创建虚拟主机?

时间:2018-02-22 05:10:38

标签: node.js express https

我需要知道如何使用虚拟主机服务多个项目,但使用https。

我可以使用express和vhost轻松地在http中执行此操作。但我无法使用https。我的所有项目都有密钥和证书。

我基本上需要在端口443中运行https://subdomain.example.comhttps://example.com

我尝试过但没有工作:

var express = require('express');
var path = require('path');
var vhost = require('vhost');
var https = require('https');
var fs = require('fs');

var server = express();

// FOODIFY ============================================================================================================
var credenciaisCliente = {
  key: fs.readFileSync(__dirname + "/foodify/certificados/cliente/private.key", "utf8"),
  cert: fs.readFileSync(__dirname + "/foodify/certificados/cliente/certificate.crt", "utf8"),
  ca: fs.readFileSync(__dirname + "/foodify/certificados/cliente/ca_bundle.crt", "utf8")
};

var credenciaisAdministracao = {
  key: fs.readFileSync(__dirname + "/foodify/certificados/administracao/private.key", "utf8"),
  cert: fs.readFileSync(__dirname + "/foodify/certificados/administracao/certificate.crt", "utf8"),
  ca: fs.readFileSync(__dirname + "/foodify/certificados/administracao/ca_bundle.crt", "utf8")
};

var foodifyAdministracao = express();
foodifyAdministracao.use("/", express.static(__dirname + "/foodify/cliente/administracao"));
foodifyAdministracao.get("*", (request, response) => {
  response.sendFile(__dirname + "/foodify/cliente/administracao/index.html");
});
var httpsFoodifyAdministracao = https.createServer(credenciaisAdministracao, foodifyAdministracao);

var foodifyCliente = express();
foodifyCliente.use("/", express.static(__dirname + "/foodify/cliente/cliente"));
foodifyCliente.get("*", (request, response) => {
  response.sendFile(__dirname + "/foodify/cliente/cliente/index.html");
});
var httpsFoodifyCliente = https.createServer(credenciaisCliente, foodifyCliente);

var foodifyAdministracaoHost = vhost("administracao.foodify.com.br", foodifyAdministracao);
var foodifyHost = vhost("*.foodify.com.br", foodifyCliente);

server.use(httpsFoodifyAdministracao);
server.use(httpsFoodifyCliente);

server.listen(443, () => {
  console.log("Servido os projetos na porta 443 por https.");
});

我也试过其他一些图书馆作为饮食,但也没有工作。

2 个答案:

答案 0 :(得分:1)

您可以尝试Redbird:https://www.npmjs.com/package/redbird

Redbird将侦听端口80,443,您的其他应用程序将侦听自己独特的端口。 Redbird将根据域名从80/443路由到其他端口。

答案 1 :(得分:0)

虽然有点晚了,但几周前我注意到在NodeJS中,tls模块提供了一个名为server.addContext(hostname, creds)的方法,该方法接收主机名及其相应的凭据。这意味着您基本上可以使用子域和相应的证书扩展HTTPS服务器。与其他反向代理解决方案(例如Redbird,node-http-proxy和Nginx)相比,这有一个好处,因为它只需要侦听单个端口(443)并且只需要一个正在运行的节点脚本。

我编写了一个最小包vhttps,它包装了这个并直接在其上添加了虚拟主机功能(因此您可能不需要vhost包)。你可以查看一下。