Skip to content

生产环境 - 处理性能和可靠性

gzip 压缩

Gzip 压缩可以大大减少响应主体的大小,从而提高 Web 应用的速度。在 Express 应用中使用压缩中间件进行 gzip 压缩。例如:

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

对于生产中的高流量网站,实施压缩的最佳方法是在反向代理级别实施压缩,而不是在应用程序级别。在这种情况下,您无需使用压缩中间件。在 Nginx 中启用 gzip 压缩的详细信息,请参阅Nginx 文档中的模块 ngx_http_gzip_module

不要使用同步函数

在生产环境中,同步函数是不安全的,因为它们可能会导致应用程序无限等待。在 Express 中,同步函数和方法会阻塞执行过程,直到它们返回.

日志记录

应用程序记录日志有两个用处:

  • 开发调试
  • 数据跟踪

异常处理

Node 应用在遇到未捕获的异常时会崩溃。不处理异常并采取适当的措施将导致 Express 应用崩溃并下线。

为了确保处理所有异常,请使用以下技术:

  • try/catch
  • promises

使用 try-catch 处理潜在进程崩溃异常的示例:

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

但是,try-catch 仅适用于同步代码。由于 Node 平台主要是异步的(特别是在生产环境中),try-catch 不会捕获大量异常.

Promises 只需将其添加 .catch(next) 到 Promise 链的末尾即可。例如:

js
app.get('/', (req, res, next) => {
  // do some sync stuff
  queryDb()
    .then((data) => makeCsv(data)) // handle data
    .then((csv) => { /* handle csv */ })
    .catch(next)
})

app.use((err, req, res, next) => {
  // handle error
})

现在,所有异步和同步错误都会传播到错误中间件。

开发环境设置

您可以在系统环境中执行以下一些操作来提高应用程序的性能:

NODE_ENV 设置为“production”

将 NODE_ENV 设置为 “production” 会使 Express:

  • 缓存视图模板。
  • 缓存由 CSS 扩展生成的 CSS 文件。
  • 生成不太详细的错误消息。

测试表明,仅仅这样做就可以将应用程序性能提高 三倍

应用自动重启

您需要确保应用程序在应用程序崩溃和服务器本身崩溃时都能重新启动。尽管您希望这两种情况都不会发生,但实际上您必须通过以下方式考虑这两种情况:

  • 当应用程序(和 Node)崩溃时,使用进程管理器重新启动它。
  • 当操作系统崩溃时,使用操作系统提供的 init 系统重新启动进程管理器。也可以在没有进程管理器的情况下使用 init 系统。

PM2 部署服务

具体需要查看 pm2 文档。

Released under the MIT License.