【问题标题】:Nodejs - BrowserSync running on express serverNodejs - 在快速服务器上运行的 BrowserSync
【发布时间】:2016-08-22 06:07:09
【问题描述】:

我想从数据库中提取一个 URL 并将其用作代理 URL。然而,我提出的设置会使用递增的端口号为每个 URL 初始化一个新的 BrowserSync 服务器。

有没有一种方法可以在不每次都初始化新的 BrowserSync 服务器的情况下完成这项工作?

或者我应该使用其他方法吗?

var bs      = require("browser-sync");
var express = require("express");

var router  = express.Router();
var app     = express();

router.get("/", function(req, res){

    var proxyUrl = getUrl() //get url from db (www.example.com)

    bs.create("bs1").init({
        notify: false,
        open: false,
        ui: false,
        port: 10000,
        proxy: proxyUrl
    });
        res.send();
});

app.use(router);

app.listen(8080, function(){
  console.log('listening on *:8080');
});

以上内容很好(ish),但是为每个 URL(可能是数千个)初始化一个新服务器是一种好习惯吗?

向系统的每个用户公开一个新的端口号是否安全? (我可以用子域屏蔽它吗?)

更新

我的最终目标是使用唯一的子域来引用每个代理 url。

例如:

sub1.mysite.com 代理 www.example.com,

sub2.mysite.com 代理 www.example2.com

【问题讨论】:

  • 这个解决方案可能对你有用..stackoverflow.com/questions/7075577/…
  • @BEJGAMSHIVAPRASAD 感谢您的帮助,但不幸的是它没有帮助。我已经编辑了这个问题。再看看。
  • 哦..对不起,我错过了您的要求..您是在寻找为公众提供代理服务..还是您正在尝试构建 SAAS 应用程序?
  • @BEJGAMSHIVAPRASAD 我正在尝试构建一个 SAAS 原型。我选择使用浏览器同步是因为它是我见过的最完整的反向代理,到目前为止它已经为我完美地代理了每个站点。它还有一些有用的附加功能。
  • 根据我的说法,如果您希望使用代理的 SAAS 服务不是一个好主意,那么我的想法就是……如果您要为每个客户端使用代理,将使用新端口创建进程……我的解决方案是使用监听 localhost 创建节点服务器并将 *.domain.com 映射到服务器。如果您为每个客户端使用单独的数据库:- 在节点逻辑中从请求主机获取 cname 并使用该引用连接数据库。将来如果你有更多的客户端,你可以使用 webservice 实现节点集群或标准的 Ubuntu 集群。

标签: node.js express proxy reverse-proxy browser-sync


【解决方案1】:

浏览器同步将不起作用,因为代理与服务器设置相关。

我使用以下软件包:

  • 快递
  • express-http-proxy
  • vhost(快速虚拟主机)
const port = 8080;

var app = require('express')();
var proxy = require('express-http-proxy');
var url = require('url');
var vhost = require('vhost');

app.listen(port);

/* Assuming getUrl() will return an array of sites */
// var sites = getUrl();

// DO NOT put '/' at the end of site
var sites = [
    'http://www.bing.com',
    'http://samanthagooden.com',
    'http://www.courtleigh.com'
];

var i = 0;
sites.forEach(site => {
    i++;
    var subDomain = 'sub' + i + '.mysite.com';
    app.use(vhost(subDomain, proxy(site, {
        forwardPath: (req, res) => url.parse(req.url).path,
        intercept: (rsp, data, req, res, callback) => {
            if (res._headers['content-type']) {
                var contentType = res._headers['content-type'];
                if (
                    contentType.indexOf('text') !== -1 ||
                    contentType.indexOf('javascript') !== -1
                ) {
                    // Replace link if content-type = text or javascript
                    var reg = new RegExp(site, 'g');
                    res.send(data.toString().replace(reg, ''));
                } else {
                    res.send(data);
                }
            } else {
                res.send(data);
            }
        }
    })));
    console.log(subDomain + ':' + port + ' proxy: ' + site);
});

以上示例将创建以下代理:

sub1.mysite.com:8080 proxy: www.bing.com
sub2.mysite.com:8080 proxy: www.example.com

【讨论】:

  • express-http-proxy 的问题是我似乎无法解决 Access-Control-Allow-Origin 问题。 Browsersync 已经很好地处理了所有这些。知道如何避免这个问题吗?像 www.courtleigh.com 这样的网站在代理时缺少字体。
  • @Orane 您指的是 fonts.googleapi.com 404 错误吗?该网站甚至直接加载也有同样的问题。
  • Access-Control-Allow-Origin 是跨域资源共享 (CORS) 问题。您可以将以下代码添加到您的快速服务器应用程序来解决它。 var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type');下一个(); }
  • @JohnSiu 不,不是谷歌字体。最值得注意的是右上角的社交媒体图标字体在代理时不会加载。我也在samanthagooden.com 和其他一些人上看到了同样的问题。字体加载失败。
  • @Orane 我该如何检查?因为浏览器中的网络监视器只显示 2 404 错误。
【解决方案2】:

也许我误解了你想要做什么,但 Browsersync 和 express 在这种情况下似乎有点过头了,为什么不直接将 node-http-proxy 与本机 http 模块一起使用?

var http = require('http')
var httpProxy = require('http-proxy')

var options = ...
var proxy = httpProxy.createProxyServer(options)

var server = http.createServer(function (req, res) {
  var proxyUrl = getUrl()
  proxy.web(req, res, { target: proxyUrl })
})

server.listen(8080, function () {
  console.log('listening on *:8080')
})

【讨论】:

  • node-http-proxy 的问题是我似乎无法解决 Access-Control-Allow-Origin 问题。 Browsersync 已经很好地处理了所有这些,我计划在未来使用“幽灵模式”。
  • 知道如何避免这个问题吗?像 www.courtleigh.com 这样的网站在代理时缺少字体。
  • 安全绕过 Access-Control-Allow-Origin 的唯一方法是确保 HTML 之后的所有请求也发送到您的代理而不是真实地址。这意味着您的代理必须检查网页并将对真实站点的所有引用替换为您的代理。在 www.courtleigh.com 中,源中使用了对其网站的多个绝对引用,所有这些都必须搜索并替换为您的代理。
  • 你是对的! browsersync 库已经处理了搜索和替换、转发规则等所需的额外步骤。这就是我希望使用 browsersync 库而不是试图弄清楚它们的实现细节的主要原因。
【解决方案3】:

根据我的说法,如果您想要使用代理的 SAAS 服务不是一个好主意,那么我的想法是什么。如果您要为每个客户端使用代理,将使用新端口创建进程...我的解决方案是创建节点服务器监听本地主机并将 *.domain.com 映射到服务器..

如果您为每个客户端使用单独的数据库:- 在节点逻辑中从请求主机获取 cname 并使用该引用连接数据库。

最终控制器代码将是.. var express = require('express'); var router = express.Router(); var MongoClient = require('mongodb').MongoClient;

/* GET home page. */
router.get('/', function(req, res, next) {
        var client = req.subdomains[0];
        console.log(client);
        MongoClient.connect('mongodb://localhost:27017/'+client, function(err, db) {
  if (err) {
    throw err;
  }
  db.collection('app1').find().toArray(function(err, result) {
    if (err) {
      throw err;
    }
        console.log('data');
    console.log(result);
  });
});

  res.render('index', { title: 'Express' });
});

module.exports = router;
~                                                                                                                                              
~                                  

将来如果你有更多的客户端,你可以使用 webservice 实现节点集群或标准 Ubuntu 集群

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多