奇怪的 Next.js TTFB 问题

Mik*_*ike 6 reactjs server-side-rendering next.js

我们在 Docker 中运行 Next.js。

在本地构建镜像并使用生产后端时,TTFB 几乎为零,但是当我们部署此镜像时,TTFB 在某些情况下可能长达 30 秒。

生产服务器是不需要启动的暖服务器。

我运行了四项测试,以使用相同的生产后端针对相同的路线测量 TTFB。

  1. 使用 docker 在本地处于生产模式
  2. 在本地处于生产模式 yarn build && yarn start
  3. 本地在开发模式下 yarn run dev
  4. 生产中

在 docker 内外测试生产模式时,TTFB 接近于零。

在开发模式下本地测试时,TTFB 几乎与生产相同。

我已经通过 SSH 进入生产环境并确认没有安装开发包,所以我认为我们不可能在开发模式下运行。

我希望生产 TTFB 更接近我们在当地所经历的。

什么可能导致本地和生产之间的差异?

文件

FROM node:10.13.0-alpine

WORKDIR /app

EXPOSE 8080

CMD [ "yarn", "start" ]

COPY . .

RUN yarn install

RUN yarn build
Run Code Online (Sandbox Code Playgroud)

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 });
Run Code Online (Sandbox Code Playgroud)

package.json 片段

  "scripts": {
    "start": "NODE_ENV=production node server.js",
    "build": "next build",
    "dev": "NODE_ENV=development node server.js",
  },
Run Code Online (Sandbox Code Playgroud)

Ron*_*omb 0

我想到了两件事需要检查。

  • 我想到了负载均衡器,就好像新镜像没有“应该”那样尽快上线。

  • 如果生产当时正在处理请求,则在所有现有请求完成之前,新映像尚未生效。

即使新图像已经发布一段时间后,您是否在每个请求上都遇到问题?喜欢知道正在进行某种安全检查吗?

NextJS 是否调用第三方提供商进行 idk 图像压缩或类似的操作