在同一个云服务器上部署两个不同的应用是完全可行且常见的做法。核心思路是:通过端口隔离、域名路由或容器化技术实现多应用共存。以下是几种主流方案及操作要点:
✅ 方案一:使用不同端口 + Nginx 反向X_X(推荐,简单高效)
适用场景:两个应用均为 Web 服务(如 Node.js、Python Flask/Django、Java Spring Boot 等)
步骤:
-
启动两个应用监听不同端口
- 应用 A:
http://localhost:3000 - 应用 B:
http://localhost:8080
- 应用 A:
-
安装并配置 Nginx(作为统一入口)
sudo apt update && sudo apt install nginx -y # Ubuntu/Debian # 或 sudo yum install nginx -y # CentOS/RHEL -
创建 Nginx 配置文件
/etc/nginx/sites-available/multi-appserver { listen 80; server_name example.com www.example.com; # 应用 A:访问 /app-a 或子域名 a.example.com location /app-a/ { 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; } # 应用 B:访问 /app-b 或子域名 b.example.com location /app-b/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 可选:用子域名区分 # server_name a.example.com; # location / { proxy_pass http://127.0.0.1:3000; } } -
启用配置并重启 Nginx
sudo ln -s /etc/nginx/sites-available/multi-app /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置 sudo systemctl restart nginx -
开放防火墙端口(仅允许 80/443)
sudo ufw allow 'Nginx Full' # 或手动放行 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload
✅ 优势:轻量、灵活、支持 HTTPS、易于扩展
🔒 建议:后续可结合 Let’s Encrypt 自动申请 SSL 证书
✅ 方案二:Docker 容器化部署(隔离性强,便于管理)
适用场景:应用依赖复杂、需环境隔离、希望快速迁移
示例:
# 构建并运行应用 A
docker run -d --name app-a -p 3000:3000 your-image-a
# 构建并运行应用 B
docker run -d --name app-b -p 8080:8080 your-image-b
再通过 Nginx 反向X_X(同上)统一暴露 80 端口,或直接让外部通过 http://ip:3000 / http://ip:8080 访问。
💡 进阶:使用 docker-compose.yml 统一管理:
version: '3'
services:
app-a:
build: ./app-a
ports: ["3000:3000"]
networks: [frontend]
app-b:
build: ./app-b
ports: ["8080:8080"]
networks: [frontend]
nginx:
image: nginx:alpine
ports: ["80:80", "443:443"]
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on: [app-a, app-b]
networks: [frontend]
networks:
frontend:
✅ 方案三:进程守护 + systemd 服务(生产环境推荐)
为避免应用崩溃后无法自动重启,将每个应用注册为独立 systemd 服务:
示例:/etc/systemd/system/app-a.service
[Unit]
Description=Application A
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/app-a
ExecStart=/usr/bin/node index.js
Restart=always
Environment="NODE_ENV=production"
[Install]
WantedBy=multi-user.target
激活:
sudo systemctl daemon-reload
sudo systemctl enable app-a
sudo systemctl start app-a
对应用 B 同理创建 app-b.service。
🔐 安全与运维建议
| 项目 | 建议 |
|---|---|
| 权限控制 | 避免以 root 运行应用;使用专用用户(如 www-data, appuser) |
| 日志管理 | 配置 journald 或 rsyslog 集中收集日志;可用 journalctl -u app-a 查看 |
| 监控告警 | 集成 Prometheus + Grafana 监控 CPU/内存/请求延迟 |
| 备份策略 | 定期备份代码、数据库、配置文件(如用 borg 或云厂商快照) |
| DDoS 防护 | 前端加 Cloudflare 或 WAF 层,限制单 IP 频率 |
🚫 不推荐的做法
- ❌ 两个应用同时监听
80端口(除非用高级负载均衡器) - ❌ 硬编码 IP 地址(应使用域名 + DNS 解析)
- ❌ 无防火墙规则直接开放所有端口
需要我根据你的具体技术栈(例如:一个 Python Django + 一个 Go 微服务?或一个 Vue 前端 + 一个 Java 后端?)提供定制化部署脚本吗?欢迎补充细节 😊
云小栈