开发环境:
- 使用 gzip 压缩
使用 compression 中间件var compression = require('compression') var express = require('express') var app = express() app.use(compression())
或 使用 Nginx 实现压缩
- 不要使用同步函数
影响性能 - 正确的 log 输出
使用 debug 代替 console.log()
APP 可以使用 Winston or Bunyan - 正确处理异常:使用 try-catch 或者 promises,不要使用 throw
同步使用 try-catchapp.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() 进行转换。
生产环境:
- 设置 NODE_ENV 为 “production”
方便缓存 模版 和 css 文件等 - 保证 app 可以自动重启
使用 进程管理器 如:
StrongLoop Process Manager
PM2
Forever - 多进程运行 app
使用上面提到的进程管理器 设置多 cluster 运行 - 缓存请求结果
使用 Varnish or Nginx 服务器 - 使用负载均衡
Nginx or HAProxy. - 使用反向代理
Nginx or HAProxy.
分散直接请求,处理错误页面,进行压缩、缓存等
参考: