如何使用自定义服务器与PM2部署Next.js开发的应用?
Next.js自定义服务器部署规范流程
1. 本地前置验证
- 本地执行
npm run build,确认构建全程无报错 - 本地执行
npm run start,访问127.0.0.1:3000验证生产模式功能完全正常,禁止直接将未本地验证的构建产物上传到服务器
2. 服务器环境准备
- 确认Debian服务器Node.js版本和本地开发环境一致,Next.js 11要求Node.js版本≥12.22.0,不建议直接用Debian默认源安装的Node版本,推荐通过nvm安装匹配版本
- 建议创建普通用户运行Node服务,避免直接用root操作产生的权限异常问题
3. 服务端项目配置
- 将本地项目代码(排除node_modules、.next文件夹)上传到服务器指定目录
- 服务器端执行
npm install --production,仅安装生产依赖,减少冗余依赖带来的兼容风险 - 服务器端执行
npm run build生成对应环境的构建产物,不要直接上传本地构建的.next文件夹,不同操作系统的构建产物无法通用
4. 进程持久化配置
- 不要直接通过SSH前台启动服务,断开SSH连接后服务会自动终止,推荐使用PM2做进程管理:
- 全局安装PM2:
npm install pm2 -g - 启动Next.js服务:
pm2 start npm --name "next-app" -- run start - 保存当前PM2进程列表:
pm2 save - 配置开机自动启动:
pm2 startup
- 全局安装PM2:
5. 访问配置
- 确认服务器安全组、防火墙开放3000端口,Debian系统可执行
ufw allow 3000开放端口 - 如需绑定域名,可配置Nginx反向代理,将80/443端口的请求转发到127.0.0.1:3000即可
现有配置的问题排查点
- package.json存在语法错误:scripts字段闭合的大括号后缺少逗号,会导致JSON解析失败,若你本地配置正常,大概率是上传到服务器的配置未同步修复
- 部分Linux系统默认不支持
NODE_ENV=production的变量赋值写法,可安装cross-env兼容:执行npm install cross-env --production,再将package.json中start脚本修改为"start": "cross-env NODE_ENV=production node server.js" - server.js默认监听127.0.0.1,如需外网直接访问,可将listen部分修改为
.listen(3000, '0.0.0.0', (err) => {,允许所有IP访问服务
内容的提问来源于stack exchange,提问作者maifs
相关产品推荐
相关产品推荐

