Nodejs - 在快速服务器上运行的BrowserSync

时间:2016-08-22 06:07:10

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

我想从数据库中提取一个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(可能是数千个)初始化新服务器是一个好习惯吗?

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

更新

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

例如:

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

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

3 个答案:

答案 0 :(得分:1)

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

我使用以下包:

  • 表示
  • 明示-HTTP代理
  • vhost(express 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

答案 1 :(得分:0)

也许我误解了你要做的事情,但是在这种情况下,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')
})

答案 2 :(得分:0)

按照我的说法如果你想使用代理服务器SAAS服务并不是一个好主意,那就是我在想什么..如果你要为每个客户端使用代理服务器将使用新端口创建进程...我的解决方案是创建节点服务器使用listen localhost并将* .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集群