在 Linux 上使用 Nginx 和 PM2 部署 Node.js — 实用入门指南
Source: Dev.to
引子:为什么这个技术栈重要
如果你已经构建了一个 Node.js 应用,并希望它在生产环境中可靠运行,仅仅执行 node app.js 并祈祷是不够的。使用 Linux + Nginx + PM2 这一务实的技术栈可以为你提供:
- 稳定性(Linux)
- 性能与 SSL 终止(Nginx)
- 自动进程管理与监控(PM2)
本文将带你了解其背后的原理,并提供一条简洁、实用的路径,帮助你快速部署真实的应用。
背景:大多数开发者面临的问题
新应用在生产环境中因简单原因而失败:进程崩溃、端口暴露、缺少 SSL,或没有为服务器重启设置自动重启。你需要一种可预测的部署模式,以实现:
- 在崩溃和重启后保持应用运行
- 将内部端口隐藏在公共互联网之外
- 处理 HTTPS、静态资源以及负载高峰
Nginx + PM2 on a Linux VPS 能在不使用繁重编排工具的情况下解决所有这些问题。
解决方案概述
- Nginx 监听 80/443 端口,并将请求代理到内部端口(例如 3000)的 Node 进程。
- PM2 运行并监控 Node 进程,失败时自动重启,并且可以在系统重启后恢复进程。
- PM2 ecosystem file 对进程配置进行版本管理。
这些都是标准且得到广泛支持的工具,可在常见发行版(如 Ubuntu 和 CentOS)上使用。
开始前的快速检查清单
- 为小型应用准备一台 Linux 服务器(1–2 GB RAM 足够)。
- 使用 SSH 登录服务器并更新软件包。
- 安装 Node.js(通过 NodeSource 或 nvm)、Nginx 和 PM2。
- 在申请 SSL 证书之前,确保 DNS 已指向你的域名。
- 将代码和生态系统配置保存在 Git 中。
实现:关键步骤(简短且可操作)
-
安装 Node.js(NodeSource 或 nvm)并验证版本:
node -v npm -v -
上传或克隆你的应用到专用文件夹(例如
/home/youruser/my-app),并安装生产依赖:cd /home/youruser/my-app npm install --production -
全局安装 PM2 并使用友好的名称启动你的应用:
npm install -g pm2 pm2 start app.js --name my-app pm2 startup # 生成 init 脚本 pm2 save # 保存进程列表 -
安装 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 -
使用 Let’s Encrypt 为站点加密:
sudo apt-get install certbot python3-certbot-nginx # Ubuntu 示例 sudo certbot --nginx -d example.com -d www.example.comcertbot 插件会自动获取证书并配置 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-For、Host、X-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 monit、top/htop以及 Nginx 日志。
快速最佳实践
- 在非 root 用户下运行 Node。
- 切勿提交机密信息;使用环境变量或 PM2
env块。 - 定期运行
npm audit并保持依赖更新。
在哪里了解更多并获取帮助
如需快速参考和更详细的说明,请参阅完整指南:
公司及其他资源:
结论
在 Linux 上使用 Nginx 和 PM2 部署 Node.js,可为您提供可靠、易于维护的基础,而无需 Docker 或完整编排的复杂性。先从小做起:
- 让 Node + PM2 运行。
- 在前面放置 Nginx。
- 添加 HTTPS。
- 稍后使用 ecosystem 文件和 CI 自动化。
这种模式能够满足独立项目、MVP 和早期 SaaS 的大多数生产需求。