Express 性能提升方法

开发环境:

  1. 使用 gzip 压缩
    使用 compression 中间件

    var compression = require('compression')
    var express = require('express')
    var app = express()
    app.use(compression())

    或 使用 Nginx 实现压缩

  2. 不要使用同步函数
    影响性能
  3. 正确的 log 输出
    使用 debug 代替 console.log()
    APP 可以使用  Winston or Bunyan
  4. 正确处理异常:使用 try-catch 或者 promises,不要使用 throw
    同步使用 try-catch

    app.get('/search', function (req, res) {
      // Simulating async operation
      setImmediate(function () {
        var jsonStr = req.query.params
        try {
          var jsonObj = JSON.parse(jsonStr)
          res.send('Success')
        } catch (e) {
          res.status(400).send('Invalid JSON string')
        }
      })
    })

    异步使用 promises

    app.get('/', function (req, res, next) {
      // do some sync stuff
      queryDb()
        .then(function (data) {
          // handle data
          return makeCsv(data)
        })
        .then(function (csv) {
          // handle csv
        })
        .catch(next)
    })
    
    app.use(function (err, req, res, next) {
      // handle error
    })

    所有异步代码都需要返回 promises ,如果有不返回的,可以使用 Bluebird.promisifyAll() 进行转换。

生产环境:

  1. 设置 NODE_ENV 为  “production”
    方便缓存 模版 和 css 文件等
  2. 保证 app 可以自动重启
    使用 进程管理器 如:
    StrongLoop Process Manager
    PM2
    Forever
  3.  多进程运行 app
    使用上面提到的进程管理器 设置多 cluster 运行
  4. 缓存请求结果
    使用 Varnish or Nginx 服务器
  5. 使用负载均衡
    Nginx or HAProxy.
  6. 使用反向代理
    Nginx or HAProxy.
    分散直接请求,处理错误页面,进行压缩、缓存等

 

 

参考:

Production best practices: performance and reliability