在同一台服务器上部署前后端代码可以通过以下方式实现,具体步骤取决于技术栈和需求。以下是常见的几种方案及详细步骤:
方案1:前后端分离部署(推荐)
适用场景:前端是静态资源(如React/Vue打包后的文件),后端是Node.js/Java/Python等服务。
步骤:
-
前端部署:
- 构建前端静态文件(如
npm run build),生成dist或build目录。 - 将静态文件放到Web服务器(如Nginx/Apache)的静态资源目录:
# 例如Nginx默认目录 cp -r dist/* /var/www/html/
- 构建前端静态文件(如
-
后端部署:
- 启动后端服务(如Node.js/Python/Java),监听某个端口(如
3000)。 - 确保后端服务常驻(可用
pm2、systemd等工具守护进程):# Node.js示例(使用pm2) pm2 start server.js
- 启动后端服务(如Node.js/Python/Java),监听某个端口(如
-
配置Nginx反向X_X:
-
修改Nginx配置,将前端请求指向静态文件,API请求转发到后端:
server { listen 80; server_name your-domain.com; # 前端静态文件 location / { root /var/www/html; index index.html; try_files $uri $uri/ /index.html; } # 后端APIX_X location /api { proxy_pass http://localhost:3000; proxy_set_header Host $host; } } - 重启Nginx:
sudo systemctl restart nginx
-
方案2:前后端同进程部署
适用场景:后端直接托管前端文件(如Express/Koa集成静态资源)。
步骤(以Node.js为例):
- 将前端构建文件(如
dist)放入后端项目目录。 -
在后端代码中配置静态资源路由:
const express = require('express'); const app = express(); // 托管前端静态文件 app.use(express.static('dist')); // 后端API路由 app.get('/api/data', (req, res) => { res.json({ message: "Hello from backend!" }); }); // 所有其他路由返回前端HTML(支持前端路由) app.get('*', (req, res) => { res.sendFile(path.join(__dirname, 'dist', 'index.html')); }); app.listen(3000, () => console.log('Server running on port 3000')); - 启动服务并守护进程(如用
pm2):pm2 start server.js
方案3:使用Docker容器化
适用场景:需要隔离环境或简化依赖管理。
步骤:
- 编写
Dockerfile分别构建前后端镜像,或使用docker-compose.yml编排。 -
示例
docker-compose.yml:version: '3' services: frontend: image: nginx:alpine ports: - "80:80" volumes: - ./dist:/usr/share/nginx/html backend: image: your-backend-image ports: - "3000:3000" - 启动服务:
docker-compose up -d
关键注意事项
- 端口分配:确保前后端端口不冲突(如前端80,后端3000)。
- 跨域问题:若前端直接访问后端端口,需在后端配置CORS(开发阶段常见)。
- HTTPS:使用Let’s Encrypt为Nginx配置SSL证书提升安全性。
- 性能优化:
- 开启Nginx静态文件缓存。
- 后端服务启用压缩(如Gzip)。
总结
- 推荐方案:前后端分离 + Nginx反向X_X(灵活、易维护)。
- 快速方案:后端直接托管前端文件(适合小型项目)。
- 高级方案:Docker容器化(适合复杂环境)。
根据实际需求选择部署方式,并确保服务器防火墙开放对应端口(如80、443、3000)。
轻量云Cloud