在 Debian 上部署 Node.js 应用的实用步骤
一 准备与安装
- 更新系统并安装基础工具:sudo apt update && sudo apt install -y curl wget git build-essential
- 安装 Node.js 与 npm(两种常用方式,择一即可):
- 使用系统仓库:sudo apt install -y nodejs npm
- 使用 NodeSource 指定版本(示例为 18.x,可按需替换为 20.x 等):
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
- 验证版本:node -v 与 npm -v 均应输出版本号。
二 部署与运行
- 准备代码与依赖:
- 建议将应用放在专用目录(如:/opt/myapp 或 /home/nodeapp/apps/myapp),避免使用 root 直接运行
- 安装依赖:npm ci --production(或 npm install),如有构建步骤执行 npm run build
- 使用 PM2 管理进程(推荐):
- 全局安装:sudo npm install -g pm2
- 启动应用:
- 直接启动:pm2 start app.js --name myapp
- 按 package.json 脚本启动:pm2 start npm --name “myapp” – run start
- 常用管理:pm2 status、pm2 logs、pm2 restart myapp、pm2 reload myapp
- 设置开机自启:pm2 startup(按提示执行生成命令),随后 pm2 save。
三 反向代理与 HTTPS(Nginx)
- 安装 Nginx:sudo apt install -y nginx
- 配置站点(示例将域名或服务器 IP 的 80 端口转发到本地 3000 端口):
- 新建配置:sudo nano /etc/nginx/sites-available/myapp
- 内容示例:
server {
listen 80;
server_name your_domain_or_ip;
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_cache_bypass $http_upgrade;
}
}
- 启用站点并生效:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
- 防火墙放行(如使用 UFW):sudo ufw allow ‘Nginx Full’
- 启用 HTTPS(可选,使用 Let’s Encrypt):
- 安装 Certbot:sudo apt install -y certbot python3-certbot-nginx
- 获取并自动配置证书:sudo certbot --nginx -d your_domain_or_ip
- 按提示选择是否重定向 HTTP 到 HTTPS。
四 生产环境最佳实践
- 运行用户与目录:为应用创建专用系统用户(如 nodeapp),将代码与日志归属该用户,避免使用 root
- 环境变量:使用 .env 或环境声明(如 NODE_ENV=production),敏感信息不要硬编码
- 进程守护与自启:优先使用 PM2 的集群与自动重启能力,并配置开机自启
- 日志与监控:集中日志(PM2 logs / 文件轮转)、健康检查、内存与 CPU 告警
- 安全加固:限制端口访问、及时更新 Node.js 与依赖、最小权限原则、启用 HTTPS。
五 常见问题与替代方案
- 使用 systemd 替代 PM2(不使用 PM2 时可选):
- 新建服务:sudo nano /etc/systemd/system/nodeapp.service
- 示例要点:
[Unit]
Description=Node.js App
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/app.js
Restart=always
User=nodeapp
Group=nodeapp
Environment=NODE_ENV=production
WorkingDirectory=/path/to/app
[Install]
WantedBy=multi-user.target
- 启用:sudo systemctl daemon-reload && sudo systemctl enable --now nodeapp
- 使用 NVM 管理多版本 Node.js(适合开发与多项目):
- 安装:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
- 加载:source ~/.bashrc
- 安装与切换:nvm install node(或指定版本);nvm use node
- 外部依赖与进程管理器的注意事项:当项目依赖 FFmpeg 等外部二进制时,使用 PM2 通常更容易继承系统环境与 PATH,减少 supervisor/systemd 下的路径与权限问题。