宝塔面板部署Next.js项目完整流程及常见问题
一、部署前准备
1. 环境要求
- Node.js 16.x 或更高版本(推荐18.x LTS)
- Nginx 1.18+
- PM2 进程管理器
- 服务器配置:至少1核2G内存
2. 安装必要软件(宝塔面板)
# 通过宝塔面板安装:
1. 软件商店 → 安装 Node.js 版本管理器
2. 选择 Node.js 版本(建议18.x)
3. 安装 PM2 管理器插件
二、完整部署流程
步骤1:上传项目文件
将Next.js项目打包后上传到服务器
或通过Git克隆项目:
cd /www/wwwroot
git clone [你的仓库地址]
cd your-nextjs-project
步骤2:安装依赖
# 进入项目目录
npm install --production
# 或使用yarn
yarn install --production
步骤3:构建项目
# 生产环境构建
npm run build
# 或
yarn build
步骤4:配置PM2启动
方法一:通过PM2管理器(宝塔插件)
打开PM2管理器
添加项目:
- 项目路径:/www/wwwroot/your-project
- 启动文件:node_modules/.bin/next
- 运行参数:start
- 项目名称:nextjs-app
方法二:手动创建PM2配置文件
// ecosystem.config.js
module.exports = {
apps: [{
name: 'nextjs-app',
script: 'node_modules/.bin/next',
args: 'start',
instances: 'max',
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production',
PORT: 3000
}
}]
};
启动PM2:
pm2 start ecosystem.config.js
pm2 save
pm2 startup
步骤5:配置Nginx反向代理
在宝塔面板中:
网站 → 添加站点
设置域名和目录
修改Nginx配置:
server {
listen 80;
server_name your-domain.com;
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;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-Host $server_name;
}
# 静态文件缓存
location /_next/static {
alias /www/wwwroot/your-project/.next/static;
expires 365d;
add_header Cache-Control "public, immutable";
}
# 优化设置
client_max_body_size 100m;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
步骤6:配置SSL证书(HTTPS)
宝塔面板 → 网站 → SSL
选择Let's Encrypt免费证书
自动部署
三、环境变量配置
1. 通过宝塔面板配置
网站 → 设置 → 配置文件,添加:
# 在server块内添加
location @nextjs {
proxy_set_header NEXT_PUBLIC_API_URL https://api.example.com;
# 其他环境变量...
}
2. 通过.env文件
# .env.production
NEXT_PUBLIC_API_URL=https://api.example.com
DATABASE_URL=your_database_url
四、常见问题及解决方案
问题1:内存不足导致构建失败
解决方案:
# 增加swap空间
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 优化构建命令
NODE_OPTIONS="--max-old-space-size=4096" npm run build
问题2:端口占用
解决方案:
# 检查端口占用
lsof -i:3000
# 修改Next.js启动端口
# package.json
"scripts": {
"start": "next start -p 3001"
}
问题3:静态文件404
解决方案:
# Nginx配置添加
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
root /www/wwwroot/your-project/public;
expires 30d;
add_header Cache-Control "public, immutable";
}
问题4:PM2重启后应用停止
解决方案:
# 保存PM2配置
pm2 save
# 设置开机启动
pm2 startup
# 检查日志
pm2 logs nextjs-app --lines 100
问题5:Next.js API路由超时
解决方案:
# 调整Nginx超时设置
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
问题6:上传文件大小限制
解决方案:
# Nginx配置
client_max_body_size 100m;
# Next.js配置
// next.config.js
module.exports = {
api: {
bodyParser: {
sizeLimit: '100mb'
}
}
}
五、性能优化建议
1. 启用Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/javascript application/xml+rss
application/json image/svg+xml;
2. 启用HTTP/2
listen 443 ssl http2;
3. 配置缓存策略
# 静态资源缓存
location /_next/static {
expires 1y;
add_header Cache-Control "public, immutable, max-age=31536000";
}
# 页面缓存(SSG页面)
location ~* \.html$ {
expires 1h;
add_header Cache-Control "public, max-age=3600";
}
4. 监控和维护
# 查看PM2状态
pm2 monit
# 查看应用日志
pm2 logs nextjs-app
# 重启应用
pm2 restart nextjs-app
# 更新代码后重新部署
git pull
npm install
npm run build
pm2 restart nextjs-app
六、自动化部署脚本
#!/bin/bash
# deploy.sh
echo "开始部署Next.js应用..."
# 1. 拉取最新代码
git pull origin main
# 2. 安装依赖
npm install --production
# 3. 构建应用
NODE_OPTIONS="--max-old-space-size=4096" npm run build
# 4. 重启应用
pm2 restart nextjs-app
# 5. 清理旧文件
npm cache clean --force
echo "部署完成!"
七、备份策略
1. 代码备份
# 定时备份脚本
0 2 * * * tar -czf /backup/nextjs-$(date +%Y%m%d).tar.gz /www/wwwroot/your-project
2. 数据库备份(如使用)
通过宝塔面板 → 计划任务设置自动备份
八、安全建议
更新依赖:定期运行
npm audit fix
防火墙设置:仅开放必要端口
文件权限:
chown -R www:www /www/wwwroot/your-project
chmod 750 /www/wwwroot/your-project
禁用目录浏览:Nginx配置中添加
autoindex off;
按照以上流程操作,即可在宝塔面板上成功部署Next.js项目。如遇到其他问题,可查看宝塔面板的错误日志和PM2日志进行排查。