·运维与云·5 分钟阅读

PM2 + Nginx 部署 Next.js:从构建到开机自启

分享X微博

架构一览

用户 → :80 Nginx → 127.0.0.1:3000 → PM2 → next start

公网只开 80/443;不要把 3000 直接暴露到公网(防火墙 + 安全组双保险)。

服务器准备

# OpenCloudOS / CentOS 系
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs nginx
sudo npm install -g pm2

部署目录

sudo mkdir -p /var/www/zhubook
sudo chown $USER:$USER /var/www/zhubook
cd /var/www/zhubook
# 上传代码或 git pull
npm ci
npm run build

生产环境变量写入 /var/www/zhubook/.env.production(勿提交 Git):

ADMIN_USERNAME=admin
ADMIN_PASSWORD=强密码
JWT_SECRET=随机长字符串

PM2 配置

ecosystem.config.cjs

module.exports = {
  apps: [
    {
      name: "zhubook",
      cwd: "/var/www/zhubook",
      script: "node_modules/next/dist/bin/next",
      args: "start -p 3000",
      instances: 1,
      exec_mode: "fork",
      env: { NODE_ENV: "production" },
      max_memory_restart: "600M",
    },
  ],
};
pm2 start ecosystem.config.cjs
pm2 save
pm2 startup   # 按提示执行 systemd 命令

Nginx 站点

/etc/nginx/conf.d/zhubook.conf

server {
    listen 80;
    server_name 49.235.182.194;  # 备案后改为 zhubook.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;
    }
}
sudo nginx -t && sudo systemctl reload nginx

更新发布流程

cd /var/www/zhubook
git pull   # 或 rsync 新包
npm ci && npm run build
pm2 restart zhubook

日志与监控

pm2 logs zhubook --lines 100
pm2 monit

磁盘占满时 PM2 可能写不动日志;可配置 pm2-logrotate

备案后

  1. 域名 A 记录指向服务器 IP
  2. server_name 改为 zhubook.com www.zhubook.com
  3. 申请免费 SSL(Let's Encrypt 或腾讯云证书)
  4. 强制 HTTPS 跳转

小结

轻量个人站 PM2 + Nginx 足够稳定;关键是内网反代、环境变量与 pm2 startup 三件套,避免进程挂了就 502 无人知。

相关阅读

本站评论 (0)

  • 暂无评论,来说第一句吧。