在单服务器环境下配置前后端共存,可以采用以下几种常见方案:
一、基础部署方案
1. 静态文件分离部署
# Nginx 配置示例
server {
listen 80;
server_name yourdomain.com;
# 前端静态文件
location / {
root /var/www/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html; # 支持前端路由
}
# 后端APIXX
location /api/ {
proxy_pass http://localhost:3000; # 后端服务端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态资源缓存
location /static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
2. 目录结构示例
/var/www/
├── frontend/ # 前端构建文件
│ ├── dist/
│ │ ├── index.html
│ │ ├── static/
│ │ └── assets/
├── backend/ # 后端源码
│ ├── src/
│ ├── package.json
│ └── server.js
└── nginx/
└── sites-available/yourdomain.conf
二、技术栈选择
前端技术栈
- 框架: React/Vue/Angular
- 构建工具: Vite/Webpack
- 部署: 静态文件构建(
npm run build)
后端技术栈
- Node.js: Express/Koa/NestJS
- Python: Django/Flask/FastAPI
- Java: Spring Boot
- Go: Gin/Echo
三、详细配置步骤
方案A:Nginx反向XX(推荐)
# 1. 安装Nginx
sudo apt update
sudo apt install nginx
# 2. 部署前端
cd frontend
npm run build
sudo cp -r dist/* /var/www/frontend/
# 3. 启动后端服务(以Node.js为例)
cd backend
npm install
# 使用PM2管理进程
sudo npm install -g pm2
pm2 start server.js --name backend
# 4. 配置Nginx
sudo nano /etc/nginx/sites-available/yourdomain
# 粘贴上面的Nginx配置
sudo ln -s /etc/nginx/sites-available/yourdomain /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
方案B:后端服务直接托管静态文件
// Express示例
const express = require('express');
const path = require('path');
const app = express();
// 托管前端静态文件
app.use(express.static(path.join(__dirname, '../frontend/dist')));
// API路由
app.use('/api', require('./routes/api'));
// 处理前端路由(返回index.html)
app.get('*', (req, res) => {
if (!req.path.startsWith('/api')) {
res.sendFile(path.join(__dirname, '../frontend/dist/index.html'));
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
四、环境变量配置
前端环境变量
// .env.production
VITE_API_URL=/api
VITE_BASE_URL=/
后端环境变量
# .env
PORT=3000
NODE_ENV=production
DATABASE_URL=your_database_url
五、安全配置
Nginx安全加固
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# CSP策略
add_header Content-Security-Policy "default-src 'self';" always;
# 限制请求大小
client_max_body_size 10M;
HTTPS配置
# 使用Certbot获取SSL证书
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com
六、性能优化
1. 前端优化
# 开启Gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1000;
# 浏览器缓存
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
2. 后端优化
// Node.js集群模式
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
// 启动应用
app.listen(3000);
}
七、监控与维护
日志配置
# Nginx访问日志
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 日志轮转
# /etc/logrotate.d/nginx
进程管理
# 使用PM2管理
pm2 startup # 设置开机自启
pm2 save # 保存当前进程列表
pm2 monit # 监控面板
八、常见问题解决
1. 跨域问题
// 后端CORS配置
const cors = require('cors');
app.use(cors({
origin: 'https://yourdomain.com',
credentials: true
}));
2. 路径冲突
- 前后端路由使用不同前缀
- API使用
/api/前缀 - 静态资源使用
/static/前缀
3. 端口冲突
- 前端:80/443(通过Nginx)
- 后端:3000/8080等
- 数据库:3306/5432等
九、自动化部署脚本
#!/bin/bash
# deploy.sh
echo "开始部署..."
# 拉取最新代码
git pull origin main
# 前端构建
cd frontend
npm install
npm run build
sudo cp -r dist/* /var/www/frontend/
# 后端重启
cd ../backend
npm install
pm2 restart backend
echo "部署完成!"
十、推荐架构
对于生产环境,建议采用:
- Nginx作为反向XX – 处理静态文件和负载均衡
- PM2管理Node进程 – 保证服务高可用
- 独立数据库服务 – 使用云数据库或Docker容器
- 配置SSL证书 – 启用HTTPS
- 设置防火墙 – 只开放必要端口
这种配置方案简单高效,适合中小型项目,同时保持了良好的可维护性和扩展性。
CLOUD技术笔记