在单台服务器上运行多个项目需要做哪些配置?

在单台服务器上部署多个项目,核心目标是实现资源隔离、端口冲突规避、进程管理与安全控制。这不仅仅是简单的“把代码放上去”,而是一套标准的工程化实践。

以下是基于 Linux 环境(主流云服务器 OS)的标准化配置方案:

1. 网络层:端口规划与反向X_X

这是最直接的冲突点。默认情况下,Web 服务通常占用 80/443 等标准端口。多台应用不能同时监听同一端口。

  • 非标准端口映射:将各项目的后端服务绑定到不同的内部高端口(如 8080, 8081, 3000, 5000),避免直接暴露给公网。
  • 引入反向X_X:使用 Nginx 或 Caddy 作为入口网关。
    • 域名分流:通过 server_nameapi.example.com 转发到项目 A,web.example.com 转发到项目 B。
    • 路径分流:如果域名相同,可通过 URL 路径区分,如 /app1/* 转发到项目 A,/app2/* 转发到项目 B。
    • HTTPS 终结:在 Nginx 层统一处理 SSL 证书,后端服务只需关注 HTTP,简化证书管理。

2. 运行层:容器化或进程守护

不要直接在终端用 node app.jspython main.py 跑,一旦终端关闭进程即终止,且难以监控。

  • 方案 A:Docker 容器化(推荐)

    • 优势:环境隔离最彻底,依赖不冲突,迁移方便。
    • 配置:为每个项目编写独立的 Dockerfiledocker-compose.yml
    • 网络模式:使用 Docker 自定义网络(Bridge Network),容器间通过服务名通信,外部通过端口映射访问。
    • 示例逻辑
      services:
        project-a:
          image: my-project-a:v1
          ports: ["8080:80"] # 宿主机 8080 -> 容器 80
          networks: [my-net]
        project-b:
          image: my-project-b:v1
          ports: ["8081:80"] # 宿主机 8081 -> 容器 80
          networks: [my-net]
      networks:
        my-net:
  • 方案 B:Systemd 进程守护

    • 适用于不需要容器化的轻量级脚本或 Go/C++ 编译型程序。
    • 创建 .service 文件,配置 ExecStartRestart=alwaysUser(限制权限)、WorkingDirectory
    • 确保不同项目由不同用户运行,防止文件权限混乱。

3. 数据层:目录与存储隔离

  • 目录结构规范:严禁所有项目共用一个根目录。建议采用 ~/projects/{project-name} 的结构。
  • 挂载点分离
    • 如果涉及数据库,尽量在本地安装独立实例(如 MySQL 多实例配置),或者使用 Docker 挂载不同的数据卷(Volume)。
    • 对于静态资源(图片、日志),使用不同的挂载路径,避免磁盘空间被单个项目占满导致其他服务不可用。
  • 环境变量隔离:每个项目应拥有独立的 .env 文件或 Systemd/Docker 的环境变量配置,严禁硬编码敏感信息。

4. 安全层:防火墙与权限控制

单台服务器风险集中,必须做好边界防御。

  • 安全组(云厂商层面)
    • 仅开放 Nginx 的 80/443 端口。
    • 严禁直接对数据库(3306, 6379)、Redis(6379)或应用内部端口(8080+)开放公网 IP。这些端口仅在云服务器的内网或 localhost 可见。
  • 系统防火墙(iptables/firewalld)
    • 配合 Nginx 配置,进一步限制来源 IP。
  • 最小权限原则
    • 应用运行账户不应是 root。创建专用用户(如 user_a, user_b),限制其对其他项目目录的读写权限。
    • 定期更新系统补丁,安装 Fail2Ban 防止暴力破解 SSH。

5. 运维层:日志与监控

  • 日志分离
    • 每个项目输出独立的日志文件(如 /var/log/project-a/access.log)。
    • 使用 journalctl (Systemd) 或 Docker 的 json-file 驱动统一管理,配合 ELK 或简单的日志轮转工具(logrotate)防止磁盘爆满。
  • 资源限制(Cgroups)
    • 如果是生产环境,建议在 Docker 中限制 CPU 和内存上限(--memory, --cpus),防止某个项目出现内存泄漏拖垮整台服务器。
  • 健康检查
    • 配置 Nginx 的 upstream 健康检查,或 Docker Compose 的 healthcheck,确保自动重启故障服务。

总结建议

对于国内云计算环境(如阿里云 ECS、腾讯云 CVM),最佳实践路径是:

  1. 基础环境:安装 Nginx + Docker + Docker Compose。
  2. 部署方式:所有业务容器化,通过 Docker Compose 编排。
  3. 流量入口:Nginx 负责域名解析、SSL 卸载和端口分发。
  4. 安全加固:云控制台安全组只开 80/443,SSH 修改默认端口并禁用密码登录。

这种架构既保证了多项目运行的稳定性,又便于后续扩容(当单机资源不足时,可轻松将容器迁移至集群或新机器)。

未经允许不得转载:CLOUD云枢 » 在单台服务器上运行多个项目需要做哪些配置?