在同一个服务器上部署多个项目是常见的做法,尤其是在资源有限或初期阶段。为了确保系统的稳定性、安全性和可维护性,遵循一些最佳实践非常重要。以下是部署多个项目的最佳实践:
1. 使用容器化技术(推荐)
使用 Docker 或 Podman 等容器技术隔离各个项目。
-
优点:
- 每个项目运行在独立的容器中,互不干扰。
- 易于管理依赖和环境配置。
- 可通过 Docker Compose 快速编排多个服务。
- 便于迁移和扩展。
-
实践建议:
# docker-compose.yml 示例 version: '3' services: project-a: image: myapp/project-a ports: - "8080:80" environment: - NODE_ENV=production project-b: image: myapp/project-b ports: - "8081:80" depends_on: - db-b db-b: image: postgres:14 environment: POSTGRES_DB: project_b_db
2. 使用反向X_X统一入口
使用 Nginx、Caddy 或 Traefik 作为反向X_X,将不同域名或路径路由到对应项目。
-
优点:
- 统一 HTTPS 配置(SSL 证书集中管理)。
- 支持虚拟主机(如
project1.example.com,project2.example.com)。 - 提高安全性与性能(缓存、压缩等)。
-
Nginx 示例配置:
server { listen 80; server_name project1.example.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; } } server { listen 80; server_name project2.example.com; location / { proxy_pass http://localhost:3001; } }配合 Let’s Encrypt 自动签发 HTTPS 证书(使用 Certbot)。
3. 端口隔离
为每个项目分配不同的端口,避免端口冲突。
- 建议使用非标准端口(如 3000, 3001, 5000 等)。
- 在防火墙中只开放必要的端口(如 80/443),内部服务端口对外不可见。
4. 用户与权限隔离
为每个项目创建独立的系统用户,避免以 root 运行应用。
- 使用
adduser project-a创建专用用户。 - 应用文件权限设置合理(如
chown -R project-a:project-a /var/www/project-a)。 - 使用 systemd 服务时指定运行用户。
5. 日志管理
每个项目应有独立的日志目录和日志轮转策略。
- 日志路径示例:
/var/log/myapp/project-a.log - 使用
logrotate或容器日志驱动管理日志大小。 - 避免日志写入根分区导致磁盘满。
6. 数据库隔离
- 每个项目使用独立的数据库(或 schema)。
- 不同项目不要共用数据库用户,避免权限越界。
- 考虑使用 Docker 容器运行数据库,便于隔离。
7. 环境变量与配置管理
- 使用
.env文件或环境变量管理配置(避免硬编码)。 - 敏感信息(如数据库密码)不要提交到代码仓库。
- 推荐使用
dotenv、Vault 或云密钥管理服务。
8. 监控与告警
- 使用 Prometheus + Grafana 或 Netdata 监控资源使用。
- 设置 CPU、内存、磁盘告警。
- 对每个项目的关键接口进行健康检查。
9. 自动化部署与 CI/CD
- 使用 Git Hooks、Jenkins、GitHub Actions 等实现自动部署。
- 部署脚本应具备幂等性,支持回滚。
- 示例脚本结构:
#!/bin/bash cd /var/www/project-a git pull origin main npm install pm2 restart project-a
10. 备份策略
- 定期备份数据库和关键配置文件。
- 测试恢复流程。
- 备份文件异地存储(如云存储)。
11. 资源限制(可选)
- 使用 cgroups 或 Docker 的资源限制功能控制 CPU、内存使用。
docker run -d --memory="512m" --cpus="1.0" myapp/project-a
12. 安全加固
- 定期更新系统和软件包。
- 关闭不必要的服务(如 FTP、Telnet)。
- 使用防火墙(如
ufw或firewalld)限制访问。 - 启用 fail2ban 防止暴力破解。
总结:推荐架构
Internet
↓
[Nginx] ← HTTPS, 路由, SSL
↓
[Project A] (Docker or PM2, port 3000)
[Project B] (Docker or PM2, port 3001)
[Database A] (PostgreSQL in container)
[Database B] (MySQL in container)
✅ 核心原则:隔离、安全、可观测、可维护
通过上述实践,即使多个项目部署在同一台服务器,也能保持良好的稳定性和运维效率。随着业务增长,可逐步迁移到多服务器或云原生架构。
云小栈