在一台云服务器上同时运行多个 Web 项目,核心思路是:每个项目监听不同的端口或域名,并通过反向X_X(如 Nginx)统一对外提供服务。以下是几种主流方案及具体步骤:
✅ 推荐方案:使用 Nginx 作为反向X_X(最灵活、生产环境首选)
1. 安装 Nginx
# Ubuntu/Debian
sudo apt update && sudo apt install nginx
# CentOS/RHEL
sudo yum install epel-release && sudo yum install nginx
2. 为每个项目配置独立的上游服务
假设你有两个项目:
- 项目 A:Node.js 应用,监听
localhost:3000 - 项目 B:Python Flask 应用,监听
localhost:5000
分别启动它们(可用 PM2、systemd、Docker 等管理进程,避免直接 node app.js 阻塞终端)。
💡 建议用 systemd 管理后台服务(示例):
# /etc/systemd/system/my-node-app.service [Unit] Description=My Node App After=network.target [Service] User=www-data WorkingDirectory=/var/www/my-node-app ExecStart=/usr/bin/node app.js Restart=always Environment="NODE_ENV=production" [Install] WantedBy=multi-user.target启用并启动:
sudo systemctl enable my-node-app sudo systemctl start my-node-app
3. 配置 Nginx 虚拟主机(多域名或子路径)
方式一:按域名区分(推荐)
创建 /etc/nginx/sites-available/project-a.conf:
server {
listen 80;
server_name project-a.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
创建 /etc/nginx/sites-available/project-b.conf:
server {
listen 80;
server_name project-b.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# ...同上头信息
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/project-a.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/project-b.conf /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置
sudo systemctl reload nginx
✅ 访问效果:
http://project-a.example.com→ 项目 Ahttp://project-b.example.com→ 项目 B
方式二:按路径区分(适合子目录部署)
修改默认站点 /etc/nginx/sites-available/default:
server {
listen 80;
server_name example.com;
location /app1/ {
rewrite ^/app1/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
# ...
}
location /app2/ {
rewrite ^/app2/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
# ...
}
}
访问:
example.com/app1/→ 项目 Aexample.com/app2/→ 项目 B
⚠️ 注意:后端应用需能处理相对路径(如设置
BASE_URL=/app1),否则静态资源可能加载失败。
🔁 其他可行方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Nginx + 多端口 | 灵活、支持 HTTPS、负载均衡 | 需配置 SSL 证书(Let’s Encrypt 可自动化) | 生产环境首选 |
| Docker Compose | 隔离性好、一键部署、易扩展 | 学习曲线稍高;需 Docker 环境 | 微服务、CI/CD 集成 |
| Apache + mod_proxy | 类似 Nginx,PHP 生态友好 | 性能略逊于 Nginx | 传统 LAMP 栈迁移 |
直接暴露不同端口(如 :80, :8080, :8081) |
最简单,无需X_X | 不安全(需防火墙限制)、用户体验差(用户需记端口) | 开发测试阶段 |
🔒 安全与运维建议
- 防火墙开放必要端口:
sudo ufw allow 'Nginx Full' sudo ufw allow OpenSSH sudo ufw enable - 启用 HTTPS(免费):
sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d project-a.example.com -d project-b.example.com - 日志分离:在 Nginx 中为每个 site 配置独立 access/error log。
- 进程守护:务必用 systemd/PM2/Docker 管理,避免进程退出后服务不可用。
需要我为你生成一个完整的项目模板(含 Dockerfile + docker-compose.yml + Nginx 配置)吗?或者你当前用的是哪种技术栈(Java/Spring、Node.js、PHP 等)?我可以提供针对性配置。
CLOUD技术博