Next.js部署Docker+Nginx生产环境CPU占100%问题求助
Next.js生产环境CPU飙升问题排查与优化方案
核心排查方向
getServerSideProps 资源泄漏排查
重点检查流量最高的两个页面的getServerSideProps逻辑:- 确认是否存在未释放的资源:比如数据库连接未关闭、定时器/事件监听器未清除、全局变量持续累积数据。可通过Node.js的
--inspect参数启动服务,在Chrome DevTools的Memory面板对比堆快照,或用clinic.js分析CPU占用热点。 - 检查异步操作的异常处理:未捕获的Promise拒绝可能导致请求挂起,长期累积会占用大量CPU资源。
- 确认是否存在未释放的资源:比如数据库连接未关闭、定时器/事件监听器未清除、全局变量持续累积数据。可通过Node.js的
Next.js 运行模式验证
确保生产环境使用next build构建后,通过next start启动服务,绝对不能用next dev(开发模式包含大量调试逻辑,性能开销极大)。
Nginx 配置优化
- 调整反向代理参数,避免请求堆积:
以上配置可让Nginx与Next.js保持长连接,减少TCP握手开销,避免连接数过载导致的CPU飙升。proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; - 开启gzip压缩,降低传输负载:
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
PM2/Docker 运行优化
PM2 集群模式配置
利用多核CPU能力,同时设置内存阈值自动重启,避免泄漏累积:{ "apps": [ { "name": "next-app", "script": "node_modules/next/dist/bin/next", "args": "start -p 3000", "instances": "max", "exec_mode": "cluster", "watch": false, "max_memory_restart": "512M" } ] }Docker 资源限制与健康检查
限制容器资源占用,同时配置健康检查自动恢复异常实例:services: next-app: build: . ports: - "3000:3000" deploy: resources: limits: cpus: '2.0' memory: 1G healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3可新增一个简单的
/health接口返回200状态码,用于健康检查触发。
代码层面优化
缓存
getServerSideProps结果
对非实时数据用内存缓存减少重复查询:import LRU from 'lru-cache'; const cache = new LRU({ max: 100, ttl: 60 * 1000 }); // 缓存100条,有效期1分钟 export async function getServerSideProps(context) { const cacheKey = `page-data-${context.query.id}`; if (cache.has(cacheKey)) { return { props: cache.get(cacheKey) }; } const data = await fetchData(); cache.set(cacheKey, data); return { props: { data } }; }优化数据查询
检查数据库慢查询并添加索引;避免嵌套循环查询,改用批量处理;用Promise.all并行执行多个异步请求,减少单请求的CPU占用时间。
其他检查点
- 确认Node.js版本为Next.js官方推荐的LTS版本(如18.x/20.x),旧版本可能存在已知性能缺陷。
- 更新依赖包至最新稳定版,尤其是数据请求、ORM类库(如axios、prisma)。
- 收集Node.js stderr日志与Nginx access/error日志,分析CPU飙升时段的请求特征与异常信息,定位触发源。
内容的提问来源于stack exchange,提问作者sahil
相关产品推荐
相关产品推荐

