在 Linux 上使用 Nginx 和 PM2 部署 Node.js — 实用入门指南

发布: (2025年12月20日 GMT+8 21:53)
7 min read
原文: Dev.to

Source: Dev.to

引子:为什么这个技术栈重要

如果你已经构建了一个 Node.js 应用,并希望它在生产环境中可靠运行,仅仅执行 node app.js 并祈祷是不够的。使用 Linux + Nginx + PM2 这一务实的技术栈可以为你提供:

  • 稳定性(Linux)
  • 性能与 SSL 终止(Nginx)
  • 自动进程管理与监控(PM2)

本文将带你了解其背后的原理,并提供一条简洁、实用的路径,帮助你快速部署真实的应用。

背景:大多数开发者面临的问题

新应用在生产环境中因简单原因而失败:进程崩溃、端口暴露、缺少 SSL,或没有为服务器重启设置自动重启。你需要一种可预测的部署模式,以实现:

  • 在崩溃和重启后保持应用运行
  • 将内部端口隐藏在公共互联网之外
  • 处理 HTTPS、静态资源以及负载高峰

Nginx + PM2 on a Linux VPS 能在不使用繁重编排工具的情况下解决所有这些问题。

解决方案概述

  1. Nginx 监听 80/443 端口,并将请求代理到内部端口(例如 3000)的 Node 进程。
  2. PM2 运行并监控 Node 进程,失败时自动重启,并且可以在系统重启后恢复进程。
  3. PM2 ecosystem file 对进程配置进行版本管理。

这些都是标准且得到广泛支持的工具,可在常见发行版(如 Ubuntu 和 CentOS)上使用。

开始前的快速检查清单

  • 为小型应用准备一台 Linux 服务器(1–2 GB RAM 足够)。
  • 使用 SSH 登录服务器并更新软件包。
  • 安装 Node.js(通过 NodeSource 或 nvm)、Nginx 和 PM2。
  • 在申请 SSL 证书之前,确保 DNS 已指向你的域名。
  • 将代码和生态系统配置保存在 Git 中。

实现:关键步骤(简短且可操作)

  1. 安装 Node.js(NodeSource 或 nvm)并验证版本:

    node -v
    npm -v
  2. 上传或克隆你的应用到专用文件夹(例如 /home/youruser/my-app),并安装生产依赖:

    cd /home/youruser/my-app
    npm install --production
  3. 全局安装 PM2 并使用友好的名称启动你的应用:

    npm install -g pm2
    pm2 start app.js --name my-app
    pm2 startup               # 生成 init 脚本
    pm2 save                  # 保存进程列表
  4. 安装 Nginx 并创建一个将请求代理到 Node 端口(例如 3000)的 server block。示例文件 /etc/nginx/sites-available/my-app

    server {
        listen 80;
        server_name example.com www.example.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;
        }
    
        # 可选:直接提供静态资源
        # location /static/ {
        #     alias /home/youruser/my-app/public/;
        # }
    }

    测试并重新加载:

    sudo nginx -t
    sudo systemctl reload nginx
  5. 使用 Let’s Encrypt 为站点加密

    sudo apt-get install certbot python3-certbot-nginx   # Ubuntu 示例
    sudo certbot --nginx -d example.com -d www.example.com

    certbot 插件会自动获取证书并配置 HTTPS。

注意: 不要将 Node 端口直接暴露到公网。让 Nginx 处理所有进入的流量和 SSL。

PM2:使其可重复

创建一个 ecosystem.config.js(或 .json)来描述你的应用及环境变量:

module.exports = {
  apps: [
    {
      name: "my-app",
      script: "./app.js",
      instances: "max",          // 启用集群
      exec_mode: "cluster",
      env: {
        NODE_ENV: "development",
        PORT: 3000
      },
      env_production: {
        NODE_ENV: "production",
        PORT: 3000
      }
    }
  ]
};

使用以下命令启动所有内容:

pm2 start ecosystem.config.js --env production
pm2 save

最佳实践: 在生产环境中避免使用 watch: true;请通过 CI/CD 触发重启。

Nginx:反向代理基础与技巧

  • 代理目标:http://127.0.0.1:3000(根据你的应用端口进行调整)。

  • 常用请求头:X-Forwarded-ForHostX-Forwarded-Proto

  • 在重新加载之前使用 nginx -t 测试配置。

  • 为静态资源启用 gzip 并设置合适的缓存头。

  • 添加基础安全头:

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header X-XSS-Protection "1; mode=block";
  • 对于多个应用,针对每个域名创建独立的 server 块,并指向各自的内部端口。

安全、监控与验证

  • 防火墙: 启用 UFW(Ubuntu)或 firewalld(CentOS),只允许 SSH 和 Nginx Full(端口 22、 80、 443)。

    sudo ufw allow OpenSSH
    sudo ufw allow 'Nginx Full'
    sudo ufw enable
  • HTTPS: 使用带 Nginx 插件的 Certbot 实现自动签发和续期。

  • 日志与监控:

    pm2 logs
    pm2 monit

    安装日志轮转以防止日志无限增长:

    pm2 install pm2-logrotate
  • 负载测试: 使用 ab 或类似工具快速测试,并观察 pm2 monittop/htop 以及 Nginx 日志。

快速最佳实践

  • 在非 root 用户下运行 Node。
  • 切勿提交机密信息;使用环境变量或 PM2 env 块。
  • 定期运行 npm audit 并保持依赖更新。

在哪里了解更多并获取帮助

如需快速参考和更详细的说明,请参阅完整指南:

公司及其他资源:

结论

在 Linux 上使用 Nginx 和 PM2 部署 Node.js,可为您提供可靠、易于维护的基础,而无需 Docker 或完整编排的复杂性。先从小做起:

  1. 让 Node + PM2 运行。
  2. 在前面放置 Nginx。
  3. 添加 HTTPS。
  4. 稍后使用 ecosystem 文件和 CI 自动化。

这种模式能够满足独立项目、MVP 和早期 SaaS 的大多数生产需求。

Back to Blog

相关文章

阅读更多 »

仓库利用的权威指南

引言 仓库本质上只是一个 3‑D 盒子。利用率只是衡量你实际使用了该盒子多少的指标。虽然物流 c...