首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js生产部署

Node.js生产部署
EN

Stack Overflow用户
提问于 2013-04-12 12:14:27
回答 1查看 3.4K关注 0票数 3

这是2013年,自2011年(新的和过时的库)以来发生了很大变化,当时大多数流行的node.js部署问题都得到了解答。

我想知道在部署node.js时,您认为最佳实践是什么。

如何自动重新启动node.js应用程序

莫尼特?

如何创建集群和负载平衡请求(websocket支持)

节点-http-代理,HAProxy?

hook.io已被删除,因此我也不太喜欢使用节点-http-代理。

Node.js测井实用工具

等等..。

Node.js现在更成熟了,你学到了什么,你推荐什么?

EN

回答 1

Stack Overflow用户

发布于 2013-04-12 13:23:55

部署

我的部署选择是按子堆栈使用舰队

我在SmartOS上部署,并将机队中心和无人驾驶飞机作为自动重新启动的服务运行。

我正在调度员上工作,这是舰队的前端。Dispatcher将允许您将所有的repos保存在一个中心位置,如github或bitbucket,然后从您的中央git服务器部署最新的代码。

负载平衡

有关设置http和https服务器,请参见我在这里的回答。在我的应用程序中,http服务器实际上是另一个节点--http-代理服务器。在这个设置中,我的应用程序可以由许多在海港中注册的小服务组成。

路由http服务器

代码语言:javascript
复制
var http = require('http')
var https = require('https')
var httpProxy = require('http-proxy');
var seaport = require('seaport');
var fs = require('fs')
var inspect = require('eyespect').inspector();
var express = require('express')
function router(data, cb) {
  var app = express()
  var config = data.config
  var logger = data.logger
  var appPort = config.get('application:port');
  var routerConfig = config.get('router')
  var seaHost = config.get('seaport:host')
  var seaPort = config.get('seaport:port')
  var ports = seaport.connect(seaPort, seaHost)
  var proxy = new httpProxy.RoutingProxy();
  app.use(express.methodOverride());
  app.use(app.router)
  var server = http.createServer(app)
  app.all('/api/:service/*', function (req, res) {
    var service = req.params.service
    var ps = ports.query(service);
    if (!ps || ps.length === 0) {
      ps = null
      unavailable(req, res, service, logger);
      service = null
      return
    }
    var item = ps[0]
    // remove /api/service/ from start of the url
    var newURL = req.url.replace(/^\/api\/.*?\//, '/')
    logger.debug('proxying to api service', {
      role: router,
      service: service,
      url: req.url,
      newURL: newURL
    })
    req.url = newURL
    proxy.proxyRequest(req, res, {
      host: item.host,
      port: item.port
    });
    item = null
  })

  var pong = 'PONG'
  app.get('/ping', function (req, res) {
    res.send(pong)
  })
  app.get('/services', function (req, res) {
    return showServices(req, res, ports)
  })
  app.all('/*', function (req, res) {
    var service = 'web'
    var ps = ports.query(service);
    if (!ps || ps.length === 0) {
      unavailable(req, res, service, logger);
      service = null
      ps = null
      return
    }

    proxy.proxyRequest(req, res, {
      host: ps[0].host,
      port: ps[0].port
    });
    ps = null
  })

  var serverPort = routerConfig.port
  server.listen(serverPort, function (err, reply) {
    if (err) { return cb(err); }
    logger.debug('router application online', {
      type: 'router',
      port: serverPort
    });
    var output = {
      port: serverPort,
      server: server
    }
    cb(null, output)
  });
}
function showServices(req, res, ports) {
  var ps = ports.query();
  var data = {
    message: 'Current services registered',
    services: ps
  }
  res.writeHead(200)
  return res.end(JSON.stringify(data))
}

function isServicesURL(url) {
  var pattern = /^\/services/i;
  return pattern.test(url)
}

function unavailable(req, res, service, logger ) {
  var resData = {
    error: 'service unavailable',
    message: 'no servers are available to serve your request',
    url: req.url,
    role: 'router'
    service: service
  };
  logger.debug('router service unavailable', {
    role: 'router',
    responseData: resData
  })
  res.writeHead(500);
  return res.end(JSON.stringify(resData));
}

module.exports = router;

spinUpRouter.js --这是舰队实际生成的节点进程。

代码语言:javascript
复制
var inspect = require('eyespect').inspector()
var assert = require('assert')
var fs = require('fs')
var routerLib = require('./index.js');
var optimist = require('optimist');
var nconf = require('nconf')
var argv = optimist.demand(['config']).argv;
var configFilePath = argv.config
assert.ok(fs.existsSync(configFilePath), 'config file not found at path: ' + configFilePath);
var config = nconf.argv().env().file({file: configFilePath});
var logger = require('loggly-console-logger')
var routerData = {
  config: config,
  logger: logger
}
logger.debug('spinning up router', {
  type: 'router',
  configFilePath: configFilePath
})
routerLib(routerData, function (err, server) {
  inspect('router online')
})

日志记录

我使用温斯顿来管理日志。更具体地说,我使用控制台和洛格利传输。我做了这么多,我把它封装成一个模块日志记录器

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15971156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档