Debian 服务器上部署 JavaScript 应用的最佳实践
一 基础运行环境与进程管理
- 使用 NodeSource 或 nvm 安装并管理 Node.js 与 npm,便于多版本并存与回滚;部署前执行 node -v / npm -v 验证版本。
- 以非 root 用户运行应用,代码置于 /var/www/ 等专用目录,权限最小化。
- 使用 PM2 管理进程:支持集群模式、崩溃自启、零停机重启;通过 ecosystem.config.js 管理多环境(如 env_production),并启用 pm2 startup / pm2 save 保证开机自启与进程恢复。
- 示例要点:
- 安装 PM2:sudo npm install -g pm2
- 启动:pm2 start app.js --name myapp 或 pm2 start ecosystem.config.js --env production
- 自启:pm2 startup 后按提示执行输出命令,pm2 save 持久化进程列表。
二 反向代理与静态资源
- 使用 Nginx 作为反向代理与静态资源服务器,提升并发、压缩与缓存能力,并简化 TLS/HTTPS 配置。
- 基本反向代理配置示例:
- 安装:sudo apt install nginx
- 配置片段:
- 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; }
- 启用:建议将配置放入 /etc/nginx/sites-available/,用软链到 /etc/nginx/sites-enabled/,执行 sudo nginx -t && sudo systemctl reload nginx。
- 启用 HTTPS:使用 Certbot 自动获取并配置 Let’s Encrypt 证书:sudo certbot --nginx -d your-domain.com。
三 安全加固与网络访问控制
- 启用 UFW 防火墙,仅开放必要端口:建议仅允许 Nginx Full(80/443),避免直接暴露 Node.js 端口(如 3000) 到公网。
- 仅开放必要端口(如 22/80/443),禁用不必要的服务与端口转发。
- 使用 SSH 密钥登录,禁用 root 远程登录与密码登录;定期 apt update/upgrade 与安全补丁。
- 应用层最小化暴露:通过 Nginx 终止 TLS、设置安全响应头(如 X-Frame-Options、X-Content-Type-Options、Strict-Transport-Security),并限制请求速率与并发连接(Nginx 限流/连接数)。
- 建议将应用运行在 非特权端口(>1024),由 Nginx 反向代理到该端口。
四 性能与资源优化
- 充分利用多核:在 PM2 使用 cluster 模式(exec_mode: ‘cluster’) 启动与 CPU 核心数相当的实例数,提升吞吐。
- 代码与运行时:优先 异步 I/O、避免 阻塞事件循环 与 长同步任务;处理大文件/大数据使用 流(Streams) 降低内存峰值。
- 内存与 GC:监控 process.memoryUsage(),必要时通过 –max-old-space-size 调整堆上限;使用 Heapdump/内存分析 排查泄漏;仅在明确收益时手动触发 global.gc()(需启动时启用 –expose-gc)。
- 系统层面:合理设置 交换空间(swap),关闭不必要服务,保持 Node.js 与依赖为最新稳定版 获取性能修复与优化。
五 部署流程与可观测性
- 标准化流程:使用 Git 拉取代码至 /var/www/your-project,执行 npm ci --only=production 安装生产依赖,使用 .env.production 管理密钥与配置,执行数据库迁移(如 npm run migrate),通过 PM2 重启应用并校验端口与健康检查。
- 零停机发布:采用 PM2 reload(配合集群)或 蓝绿/金丝雀发布(Nginx 权重/路由切换)降低发布风险。
- 日志与监控:集中收集 PM2/应用日志(JSON 格式便于检索),使用 Prometheus + Grafana 监控 HTTP 延迟、吞吐、错误率、内存/CPU,必要时接入 Sentry 等错误追踪。
- 备份与回滚:定期备份 代码、配置、数据库与证书;保留最近 N 个可回滚版本与 PM2 进程快照,异常可快速回退。