月度归档:2026年01月

使用 PM2 + Nginx 部署 Nuxt 应用

一、服务器环境准备

1. 安装 Node.js 和 NPM

bash

# Ubuntu/Debian
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

# CentOS/RHEL
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs

# 验证安装
node -v
npm -v

2. 安装 PM2

bash

sudo npm install -g pm2

3. 安装 Nginx

bash

# Ubuntu/Debian
sudo apt update
sudo apt install -y nginx

# CentOS/RHEL
sudo yum install -y nginx

# 启动 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

二、部署 Nuxt 应用

1. 上传文件到服务器

确保 /www/root/test 目录包含以下结构:

text

/www/root/test/
├── .output/
│   ├── server/
│   │   └── index.mjs
│   └── public/
│       └── _nuxt/
└── package.json

2. 安装生产依赖

bash

cd /www/root/test
npm install --production

三、配置 PM2 启动 Nuxt

1. 创建 PM2 配置文件 ecosystem.config.js

javascript

module.exports = {
  apps: [{
    name: 'nuxt-app',
    script: '.output/server/index.mjs',
    instances: 'max', // 使用所有CPU核心
    exec_mode: 'cluster',
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 3000,
      HOST: '0.0.0.0'
    }
  }]
}

2. 启动应用

bash

cd /www/root/test

# 使用配置文件启动
pm2 start ecosystem.config.js

# 或直接启动
pm2 start .output/server/index.mjs --name nuxt-app --watch --time

# 设置开机自启
pm2 startup
# 按照提示执行生成的命令
pm2 save

3. 管理 PM2 进程

bash

# 查看所有应用
pm2 list

# 查看日志
pm2 logs nuxt-app
pm2 logs nuxt-app --lines 100

# 监控
pm2 monit

# 重启应用
pm2 restart nuxt-app

# 停止应用
pm2 stop nuxt-app

# 删除应用
pm2 delete nuxt-app

# 保存当前进程列表
pm2 save

四、配置 Nginx 反向代理

1. 创建 Nginx 配置文件

bash

sudo nano /etc/nginx/sites-available/nuxt-app

2. 配置内容如下:

nginx

server {
    listen 80;
    server_name your-domain.com www.your-domain.com; # 修改为你的域名
    root /www/root/test;
    
    # 设置日志
    access_log /var/log/nginx/nuxt-app-access.log;
    error_log /var/log/nginx/nuxt-app-error.log;
    
    # 反向代理到 Nuxt
    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_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
    
    # 直接提供静态文件(提高性能)
    location /_nuxt/ {
        alias /www/root/test/.output/public/_nuxt/;
        expires 365d;
        add_header Cache-Control "public, immutable";
        access_log off;
    }
    
    # 阻止访问敏感文件
    location ~ /\. {
        deny all;
    }
    
    # 压缩配置
    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;
}

3. 启用站点配置

bash

# 创建软链接
sudo ln -s /etc/nginx/sites-available/nuxt-app /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重新加载 Nginx
sudo systemctl reload nginx

五、防火墙配置

bash

# 开放 80 端口(HTTP)
sudo ufw allow 80/tcp

# 如果使用 SSL,开放 443 端口
sudo ufw allow 443/tcp

# 启用防火墙
sudo ufw enable

六、SSL 证书配置(可选,推荐)

1. 安装 Certbot

bash

# Ubuntu/Debian
sudo apt install -y certbot python3-certbot-nginx

# CentOS/RHEL
sudo yum install -y certbot python3-certbot-nginx

2. 获取 SSL 证书

bash

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

3. 自动续期测试

bash

sudo certbot renew --dry-run

七、部署脚本

创建 deploy.sh 脚本:

bash

#!/bin/bash

set -e  # 遇到错误立即退出

echo "=== 开始部署 Nuxt 应用 ==="

# 进入项目目录
cd /www/root/test

echo "1. 停止当前应用..."
pm2 stop nuxt-app || true

echo "2. 安装依赖..."
npm ci --production

echo "3. 重启应用..."
pm2 restart nuxt-app || pm2 start .output/server/index.mjs --name nuxt-app --time

echo "4. 等待应用启动..."
sleep 5

echo "5. 检查应用状态..."
pm2 list

echo "6. 查看应用日志..."
pm2 logs nuxt-app --lines 10

echo "=== 部署完成 ==="

# 测试访问
echo "测试访问..."
curl -f http://localhost:3000 || echo "应用启动失败,请检查日志"

给脚本执行权限:

bash

chmod +x deploy.sh
./deploy.sh

八、常用维护命令

bash

# 查看 PM2 状态
pm2 status

# 查看实时日志
pm2 logs nuxt-app --lines 100

# 查看 CPU/内存使用
pm2 monit

# 重启所有应用
pm2 restart all

# 重新加载 Nginx
sudo systemctl reload nginx

# 查看 Nginx 错误日志
sudo tail -f /var/log/nginx/nuxt-app-error.log

九、故障排除

1. 如果应用无法启动

bash

# 查看详细错误
cd /www/root/test
node .output/server/index.mjs

# 检查端口占用
netstat -tlnp | grep :3000

# 使用不同端口
PORT=3001 pm2 start ecosystem.config.js

2. 如果 Nginx 返回 502 错误

bash

# 检查 PM2 是否运行
pm2 list

# 检查应用是否监听端口
curl http://localhost:3000

# 查看 PM2 日志
pm2 logs nuxt-app

3. 更新 Nginx 配置后

bash

# 测试配置
sudo nginx -t

# 重新加载
sudo systemctl reload nginx

# 重启
sudo systemctl restart nginx

这样就完成了使用 PM2 + Nginx 的完整部署流程。应用将通过 Nginx 在 80 端口提供服务,PM2 负责管理 Node.js 进程。