在一个服务器上部署多个项目是常见的需求,尤其是在资源有限或需要集中管理的情况下。以下是几种常见的方式和最佳实践:
一、使用不同的端口运行多个项目
每个项目监听不同的端口,通过反向X_X(如 Nginx)对外提供服务。
示例:
- 项目A:Node.js 应用 → 监听
3000端口 - 项目B:Python Flask 应用 → 监听
5000端口 - 项目C:Java Spring Boot 应用 → 监听
8080端口
然后使用 Nginx 做反向X_X:
# /etc/nginx/sites-available/project-a
server {
listen 80;
server_name project-a.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# /etc/nginx/sites-available/project-b
server {
listen 80;
server_name project-b.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
✅ 优点:简单直接
❌ 缺点:需管理多个端口,容易冲突
二、使用域名区分项目(推荐)
通过不同域名访问不同项目,Nginx 根据 server_name 转发请求。
例如:
blog.example.com→ 指向博客项目api.example.com→ 指向 API 项目admin.example.com→ 指向后台管理系统
配置方式同上,使用 server_name 区分即可。
✅ 优点:用户无感知,URL 友好,易于扩展
三、使用 Docker 隔离项目(强烈推荐)
为每个项目创建独立的 Docker 容器,实现环境隔离、依赖独立、便于部署。
步骤:
- 为每个项目编写
Dockerfile - 使用
docker-compose.yml统一管理多个服务
# docker-compose.yml
version: '3'
services:
web-blog:
build: ./blog
ports:
- "3000:80"
restart: unless-stopped
web-api:
build: ./api
ports:
- "5000:3000"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web-blog
- web-api
再配合 Nginx 做反向X_X,实现域名路由。
✅ 优点:环境隔离、易于维护、可移植性强
❌ 缺点:学习成本略高
四、使用 PM2 管理多个 Node.js 项目
如果你部署的是多个 Node.js 项目,可以使用 PM2 进程管理器:
pm2 start app1.js --name "blog"
pm2 start app2.js --name "api"
pm2 start app3.js --name "admin"
pm2 save
pm2 startup # 开机自启
然后用 Nginx 反向X_X到对应的本地端口。
五、目录结构建议
合理组织文件结构,便于管理:
/srv
├── blog/
│ ├── app.js
│ └── package.json
├── api/
│ ├── server.py
│ └── requirements.txt
├── admin/
│ └── dist/ (静态文件)
└── docker-compose.yml
六、安全与维护建议
- 使用非 root 用户运行应用
- 配置防火墙(ufw / firewall-cmd),只开放必要端口(如 80, 443)
- 启用 HTTPS(Let’s Encrypt + Certbot)
- 日志集中管理(如使用
journalctl或 ELK) - 定期备份数据和代码
总结:推荐方案
| 方案 | 适用场景 |
|---|---|
| Nginx 反向X_X + 不同端口 | 小型项目,快速上线 |
| Nginx + 多域名 | 多个正式对外服务 |
| Docker + Nginx | 中大型项目,追求可维护性 |
| PM2(Node.js) | 多个 Node 项目 |
? 推荐组合:Docker + Nginx + 域名 + HTTPS
如果你告诉我你项目的类型(如:Node.js、Python、Java、静态网站等),我可以给出更具体的部署示例。
CDNK博客