nextjs mysql nginx pm2 部署方案
后端开发

# ============================================
# Next.js + Nginx 生产部署完整步骤
# 操作系统:Ubuntu 22.04/24.04 (Linux 6.8.0-90-generic)
# ============================================
# ============ 第一阶段:服务器初始化 ============
# 1.1 系统更新
sudo apt update && sudo apt upgrade -y
# 1.2 安装 Node.js 20.x LTS (推荐稳定版本)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# 验证安装
node --version # 应该显示 v20.x.x
npm --version # 显示对应 npm 版本
# 1.3 安装 Nginx
sudo apt install -y nginx
# 1.4 安装 PM2 (进程管理)
sudo npm install -g pm2
# 1.5 配置防火墙
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # 开放 HTTP(80) 和 HTTPS(443)
sudo ufw --force enable
sudo ufw status
# ============ 第二阶段:上传项目并构建 ============
# 2.1 在服务器创建项目目录
sudo mkdir -p /var/www/my-nextjs-app
sudo chown -R $USER:$USER /var/www/my-nextjs-app
# 2.2 【在您本地电脑】上传项目文件到服务器
# 假设您本地项目目录是 ~/projects/my-nextjs-app
# 请替换 username 和 your-server-ip 为您的实际信息
# 本地终端执行:
# rsync -avz --exclude='node_modules' --exclude='.next' --exclude='.git' ~/projects/my-nextjs-app/ username@your-server-ip:/var/www/my-nextjs-app/
# 2.3 SSH登录服务器并进入项目目录
ssh username@your-server-ip
cd /var/www/my-nextjs-app
# 2.4 安装项目依赖并构建
npm ci # 或 npm install
# 2.5 创建生产环境变量 (根据您的项目需要)
cat > .env.production << EOF
NODE_ENV=production
# 添加您的生产环境变量,例如:
# DATABASE_URL=your_production_db_url
# NEXT_PUBLIC_API_URL=https://api.yourdomain.com
EOF
# 2.6 构建 Next.js 应用
npm run build
# 注意:如果构建失败,请查看具体错误信息并修复
# 常见问题:内存不足、TypeScript错误、依赖缺失等
# ============ 第三阶段:配置 PM2 进程守护 ============
# 3.1 创建 PM2 配置文件
cat > ecosystem.config.js << 'EOF'
module.exports = {
apps: [{
name: 'my-nextjs-app',
script: 'npm',
args: 'start',
cwd: '/var/www/my-nextjs-app',
instances: 1,
exec_mode: 'fork',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: '/var/log/pm2/my-nextjs-app-error.log',
out_file: '/var/log/pm2/my-nextjs-app-out.log',
log_file: '/var/log/pm2/my-nextjs-app-combined.log',
time: true
}]
}
EOF
# 3.2 创建日志目录
sudo mkdir -p /var/log/pm2
sudo chown -R $USER:$USER /var/log/pm2
# 3.3 启动应用
pm2 start ecosystem.config.js
# 3.4 设置 PM2 开机自启
pm2 startup
# 执行上述命令后,会显示一条需要以root身份运行的命令,复制并执行它
# 示例:sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username
# 3.5 保存当前进程列表
pm2 save
# 3.6 查看应用状态
pm2 status
pm2 logs my-nextjs-app --lines 50 # 查看最近50行日志
# ============ 第四阶段:配置 Nginx 反向代理 ============
# 4.1 创建 Nginx 站点配置文件
sudo vim /etc/nginx/sites-available/my-nextjs-app
# 将以下配置粘贴到文件中(按 i 进入插入模式,粘贴后按 Esc,输入 :wq 保存)
# --------------------------------------------------
server {
listen 80;
listen [::]:80;
# 您的域名(如果没有域名,用服务器IP地址)
server_name your-domain.com www.your-domain.com;
# 或 server_name 123.123.123.123; # 您的服务器IP
# 日志文件
access_log /var/log/nginx/my-nextjs-app.access.log;
error_log /var/log/nginx/my-nextjs-app.error.log;
# 反向代理配置
location / {
proxy_pass http://localhost: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_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 可选:静态资源缓存(提升性能)
location /_next/static {
proxy_cache STATIC;
proxy_ignore_headers Cache-Control;
proxy_cache_valid 200 60d;
proxy_pass http://localhost:3000;
}
}
# --------------------------------------------------
# 4.2 启用站点配置
sudo ln -s /etc/nginx/sites-available/my-nextjs-app /etc/nginx/sites-enabled/
# 4.3 移除默认配置(如果存在)
sudo rm -f /etc/nginx/sites-enabled/default
# 4.4 测试 Nginx 配置语法
sudo nginx -t
# 应该显示:nginx: configuration file /etc/nginx/nginx.conf test is successful
# 4.5 重启 Nginx
sudo systemctl restart nginx
# ============ 第五阶段:验证部署 ============
# 5.1 检查所有服务状态
sudo systemctl status nginx
pm2 status
# 5.2 测试应用是否运行
curl -I http://localhost:3000
curl -I http://localhost
# 5.3 查看实时日志
# 在一个终端窗口查看 PM2 日志
pm2 logs my-nextjs-app --lines 100
# 在另一个终端窗口查看 Nginx 日志
sudo tail -f /var/log/nginx/my-nextjs-app.access.log
# 或错误日志
sudo tail -f /var/log/nginx/my-nextjs-app.error.log
# 5.4 测试公网访问
# 打开浏览器访问:http://您的服务器IP地址 或 http://您的域名
# ============ 第六阶段:HTTPS 配置(可选但推荐) ============
# 6.1 安装 Certbot (用于获取免费 SSL 证书)
sudo apt install -y certbot python3-certbot-nginx
# 6.2 获取 SSL 证书(需要有已解析到服务器的域名)
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
# 按照提示操作,Certbot 会自动配置 Nginx 支持 HTTPS
# 6.3 设置证书自动续期
sudo certbot renew --dry-run
# ============ 第七阶段:故障排除 ============
# 7.1 如果遇到 502 Bad Gateway
# 检查 Next.js 是否在运行
pm2 status
# 检查端口占用
sudo netstat -tulpn | grep :3000
sudo netstat -tulpn | grep :80
# 7.2 如果遇到权限问题
sudo chown -R www-data:www-data /var/log/nginx/
sudo chmod -R 755 /var/www/my-nextjs-app
# 7.3 重启所有服务
pm2 restart my-nextjs-app
sudo systemctl restart nginx
# 7.4 查看系统资源
htop
free -h
df -h
# ============ 第八阶段:创建部署脚本(简化后续更新) ============
# 8.1 创建部署脚本
cat > /var/www/my-nextjs-app/deploy.sh << 'EOF'
#!/bin/bash
echo "🚀 开始部署 Next.js 应用..."
cd /var/www/my-nextjs-app
echo "1. 拉取最新代码..."
git pull origin main
echo "2. 安装依赖..."
npm ci
echo "3. 构建应用..."
npm run build
echo "4. 重启应用..."
pm2 restart my-nextjs-app
echo "5. 检查状态..."
pm2 status
echo "✅ 部署完成!"
EOF
# 8.2 给脚本执行权限
chmod +x /var/www/my-nextjs-app/deploy.sh
# 以后更新应用只需运行:
# cd /var/www/my-nextjs-app && ./deploy.sh
# ============ 完成! ============
echo "========================================"
echo "部署完成!请访问您的服务器IP地址或域名"
echo "========================================"
echo "PM2 管理命令:"
echo " pm2 status # 查看状态"
echo " pm2 logs my-nextjs-app # 查看日志"
echo " pm2 restart my-nextjs-app # 重启应用"
echo " pm2 stop my-nextjs-app # 停止应用"
echo ""
echo "Nginx 管理命令:"
echo " sudo systemctl status nginx"
echo " sudo systemctl restart nginx"
echo " sudo nginx -t # 测试配置"![[衡天云]爆款云服务器 低至12元/月](/hty.png)