发布于 2026-02-14, 更新于 2026-03-02
最近将博客从 SSG 改成了 SSR ,基于原有的数据库和前台界面,通过 AI 编程完全重写写了后端接口和管理端界面,实现前后端同构、服务端渲染等。在此记录一些部署中遇到的问题,以及 PM2 + Nginx 的部署配置信息。
在服务器环境跑 next build 时,有时候会直接卡死。解决思路:
ignoreBuildErrors。 IGNORE_BUILD_TYPES=true typescript.ignoreBuildErrorsNext.js App Router 会尝试静态化页面(SSG),但当页面依赖数据库或需要实时数据时,会在构建期触发 DB 连接。
解决方式:对相关页面显式声明强制动态渲染
export const dynamic = 'force-dynamic';
适用场景:
在开发和部署过程中,升级了 Next.js 版本,遇到了本地启动非常卡的情况,开发工具一直显示 Compiling。
原因是 .next 里的增量编译 / 缓存状态损坏或不一致,导致 Next.js 在 dev 模式下等不到“编译完成信号”。比如:
解决方式:删除 .next 目录就好了。可以在 package.json 加一个便捷命令:
{
"scripts": {
"dev:clean": "rimraf .next && next dev",
}
}
dev 卡在 Compiling 超过 1 分钟,就可以尝试删除 .next 目录。
Next.js SSR 运行时需要 Node 进程常驻,PM2 是常见守护方式。推荐的启动方式:
pm2 start npm --name heibaimeng-blog-client-fe -- start start/stop/reload/delete 管理通过单进程启动,不使用集群模式。如需要负载均衡,应该是多机器 / 多容器,而不是一个进程使用 cluster 模式。
Next.js 的很多行为默认假设它运行在单实例环境。PM2 官方也提醒 cluster 只适合无状态应用,而 Next.js 很多功能其实是带状态缓存的:ISR、fetch cache、image cache、route cache 等。
将 SSR 服务与静态文件分离,可以提升性能并降低 Next 的静态文件压力。
配置示例:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /uploads/ {
alias /var/www/html/uploads/;
try_files $uri =404;
expires 30d;
add_header Cache-Control "public";
}
/ 走 Next SSR 服务 /uploads/ 静态直出,由 Nginx 直接返回