在一台云服务器上部署多个项目是常见的需求,比如同时运行多个网站、API 服务或应用。以下是几种主流的实现方式和最佳实践:
一、常见部署方式
1. 使用 Nginx 反向X_X(推荐)
通过 Nginx 配置多个虚拟主机,将不同域名或端口的请求转发到不同的后端服务。
适用场景:多个 Web 项目(如多个网站、API)
示例配置:
# 项目1:example1.com
server {
listen 80;
server_name example1.com www.example1.com;
location / {
proxy_pass http://127.0.0.1:3000; # Node.js 项目1
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 项目2:example2.com
server {
listen 80;
server_name example2.com www.example2.com;
location / {
proxy_pass http://127.0.0.1:8080; # Java/Spring Boot 项目2
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 项目3:静态网站
server {
listen 80;
server_name static.example.com;
root /var/www/project3;
index index.html;
}
优点:统一入口,支持 HTTPS、负载均衡、缓存等。
2. 使用不同端口直接访问
每个项目监听不同的端口,通过 IP:端口 访问。
示例:
- 项目1:
http://your-server-ip:3000 - 项目2:
http://your-server-ip:8080 - 项目3:
http://your-server-ip:5000
优点:简单快捷
缺点:暴露端口不安全,不易管理,不适合生产环境。
3. 使用 Docker 容器化部署
为每个项目创建独立的 Docker 容器,通过 Docker Compose 管理。
目录结构示例:
/projects
/project1
Dockerfile
app.js
/project2
Dockerfile
main.py
docker-compose.yml
docker-compose.yml 示例:
version: '3'
services:
project1:
build: ./project1
ports:
- "3000:3000"
restart: unless-stopped
project2:
build: ./project2
ports:
- "8080:8080"
restart: unless-stopped
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- project1
- project2
优点:环境隔离、易于扩展、便于迁移。
4. 使用 PM2 管理多个 Node.js 项目
如果你部署的是多个 Node.js 应用,可以用 PM2 进程管理器。
# 启动项目1
pm2 start app1.js --name "project1"
# 启动项目2
pm2 start app2.js --name "project2"
# 查看所有进程
pm2 list
配合 Nginx 做反向X_X,实现域名分流。
5. 使用子目录部署(较少用)
将多个项目打包后,通过 Nginx 的路径匹配部署在同一个域名下不同路径。
location /app1/ {
proxy_pass http://127.0.0.1:3000/;
}
location /app2/ {
proxy_pass http://127.0.0.1:8080/;
}
注意:后端项目需支持子路径(如设置
baseURL或publicPath)
二、域名与 SSL 配置
- 使用不同的域名或子域名(如
api.example.com,admin.example.com) - 使用 Let’s Encrypt 免费证书(配合 Certbot)为每个站点启用 HTTPS
sudo certbot --nginx -d example1.com -d www.example1.com
三、最佳实践建议
| 建议 | 说明 |
|---|---|
| ✅ 使用 Nginx 反向X_X | 统一管理入口,提升安全性和性能 |
| ✅ 使用 Docker | 隔离环境,避免依赖冲突 |
| ✅ 每个项目独立运行 | 不同端口或容器,避免相互影响 |
| ✅ 使用进程管理器(PM2、systemd) | 保证服务常驻后台 |
| ✅ 配置防火墙 | 只开放 80、443 端口,关闭其他不必要的端口 |
| ✅ 日志分离 | 每个项目独立日志文件,便于排查问题 |
四、总结
| 方法 | 适合场景 | 推荐度 |
|---|---|---|
| Nginx 反向X_X | 多个 Web 项目共用 80/443 端口 | ⭐⭐⭐⭐⭐ |
| Docker 容器化 | 多语言、多环境项目 | ⭐⭐⭐⭐⭐ |
| 多端口直接访问 | 测试/开发环境 | ⭐⭐ |
| PM2 管理 Node 项目 | 多个 Node.js 服务 | ⭐⭐⭐⭐ |
| 子目录部署 | 单域名多应用 | ⭐⭐⭐ |
如果你提供具体的技术栈(如:Node.js + Python + Vue),我可以给出更详细的部署方案。欢迎补充!
云知识