f1b9fe6a-c497-49c1-bdde-b526a8d1fbbe.png

# ============================================
# 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              # 测试配置"