加油
努力

在同一个服务器上部署不同项目的最佳实践有哪些?

在同一个服务器上部署多个项目是常见的做法,尤其是在资源有限或初期阶段。为了确保系统的稳定性、安全性和可维护性,遵循一些最佳实践非常重要。以下是部署多个项目的最佳实践:


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)。
  • 使用防火墙(如 ufwfirewalld)限制访问。
  • 启用 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)

核心原则隔离、安全、可观测、可维护

通过上述实践,即使多个项目部署在同一台服务器,也能保持良好的稳定性和运维效率。随着业务增长,可逐步迁移到多服务器或云原生架构。

云服务器