在单台服务器上部署多个项目,核心目标是实现资源隔离、端口冲突规避、进程管理与安全控制。这不仅仅是简单的“把代码放上去”,而是一套标准的工程化实践。
以下是基于 Linux 环境(主流云服务器 OS)的标准化配置方案:
1. 网络层:端口规划与反向X_X
这是最直接的冲突点。默认情况下,Web 服务通常占用 80/443 等标准端口。多台应用不能同时监听同一端口。
- 非标准端口映射:将各项目的后端服务绑定到不同的内部高端口(如 8080, 8081, 3000, 5000),避免直接暴露给公网。
- 引入反向X_X:使用 Nginx 或 Caddy 作为入口网关。
- 域名分流:通过
server_name将api.example.com转发到项目 A,web.example.com转发到项目 B。 - 路径分流:如果域名相同,可通过 URL 路径区分,如
/app1/*转发到项目 A,/app2/*转发到项目 B。 - HTTPS 终结:在 Nginx 层统一处理 SSL 证书,后端服务只需关注 HTTP,简化证书管理。
- 域名分流:通过
2. 运行层:容器化或进程守护
不要直接在终端用 node app.js 或 python main.py 跑,一旦终端关闭进程即终止,且难以监控。
-
方案 A:Docker 容器化(推荐)
- 优势:环境隔离最彻底,依赖不冲突,迁移方便。
- 配置:为每个项目编写独立的
Dockerfile和docker-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文件,配置ExecStart、Restart=always、User(限制权限)、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),防止某个项目出现内存泄漏拖垮整台服务器。
- 如果是生产环境,建议在 Docker 中限制 CPU 和内存上限(
- 健康检查:
- 配置 Nginx 的
upstream健康检查,或 Docker Compose 的healthcheck,确保自动重启故障服务。
- 配置 Nginx 的
总结建议
对于国内云计算环境(如阿里云 ECS、腾讯云 CVM),最佳实践路径是:
- 基础环境:安装 Nginx + Docker + Docker Compose。
- 部署方式:所有业务容器化,通过 Docker Compose 编排。
- 流量入口:Nginx 负责域名解析、SSL 卸载和端口分发。
- 安全加固:云控制台安全组只开 80/443,SSH 修改默认端口并禁用密码登录。
这种架构既保证了多项目运行的稳定性,又便于后续扩容(当单机资源不足时,可轻松将容器迁移至集群或新机器)。
CLOUD云枢