我们在 Docker 中运行 Next.js。
在本地构建映像并使用生产后端时,TTFB 几乎为零,但是当我们部署此映像时,在某些情况下,TTFB 可以达到 30 秒。
生产服务器是不需要启动的暖服务器。
我进行了四次测试,以针对具有相同生产后端的相同路线测量 TTFB。
- 使用 docker 在本地处于生产模式
- 在本地以生产模式使用
yarn build && yarn start - 在本地以开发模式使用
yarn run dev - 生产中
在 docker 内外测试生产模式时,TTFB 接近于零。
在开发模式下进行本地测试时,TTFB 几乎与生产模式相同。
我已经 SSH 进入生产环境并确认没有安装开发包,所以我认为我们不可能在开发模式下运行。
我希望生产 TTFB 更接近我们在当地的体验。
什么可能导致本地和生产之间的差异?
Dockerfile
FROM node:10.13.0-alpine
WORKDIR /app
EXPOSE 8080
CMD [ "yarn", "start" ]
COPY . .
RUN yarn install
RUN yarn build
server.js 片段
const express = require('express');
const next = require('next');
const cookieParser = require('cookie-parser');
const jwtDecode = require('jwt-decode');
const { join } = require('path');
const admin = require('firebase-admin');
// serviceAccount used for local development
// https://firebase.google.com/docs/admin/setup
const path = require('path');
const { fetchNewToken } = require('./src/services/Firebase');
let serviceAccount;
const dev = process.env.NODE_ENV !== 'production';
if (dev) {
serviceAccount = require('./credentials/serviceAccountKey.json')
}
admin.initializeApp({
credential: dev ? admin.credential.cert(serviceAccount) : admin.credential.applicationDefault(),
});
const app = next({ dev });
package.json 片段
"scripts": {
"start": "NODE_ENV=production node server.js",
"build": "next build",
"dev": "NODE_ENV=development node server.js",
},