1. 不使用Nginx(直接访问)
前端(Vue) → 直接请求 → Spring Boot后端
特点:
- 简单直接:开发阶段方便调试
- 端口暴露:后端端口直接对外暴露(如8080)
- 跨域问题:需要后端配置CORS解决跨域
- 无负载均衡:只能连接单一后端实例
- 静态资源服务:Spring Boot需要自己服务静态资源(如配置WebMvc)
- 安全性:缺少额外的安全层保护
2. 使用Nginx(反向代理)
前端(Vue) → Nginx → Spring Boot后端
↑ ↑
静态资源 反向代理
主要区别和优势:
| 维度 | 不使用Nginx | 使用Nginx |
|---|---|---|
| 架构 | 前后端直接通信 | 增加中间层代理 |
| 跨域处理 | 需后端配置CORS | Nginx代理自动解决跨域 |
| 负载均衡 | 不支持 | 支持多实例负载均衡 |
| 静态资源 | 需单独配置或CDN | Nginx高性能静态服务 |
| 性能 | 后端直接处理所有请求 | 静态资源由Nginx处理,减少后端压力 |
| 安全性 | 较低 | 隐藏后端端口、防DDoS、限流等 |
| SSL/HTTPS | 需Spring Boot配置 | Nginx统一管理SSL证书 |
| 部署灵活性 | 灵活性低 | 前后端分离更彻底 |
3. 典型应用场景对比
场景A:开发环境(常不使用Nginx)
javascript
// vue.config.js
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080', // 直接连Spring Boot
changeOrigin: true
}
}
}
场景B:生产环境(推荐使用Nginx)
nginx
# nginx.conf
server {
listen 80;
server_name example.com;
# 1. 服务Vue静态文件
location / {
root /var/www/vue-app;
index index.html;
try_files $uri $uri/ /index.html; # 支持Vue Router history模式
}
# 2. 反向代理API请求
location /api/ {
proxy_pass http://backend-server: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;
# 跨域配置
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,Content-Type';
# 缓存配置
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
}
# 3. 负载均衡配置
upstream backend-server {
server 192.168.1.101:8080 weight=3; # 权重负载
server 192.168.1.102:8080 weight=2;
server 192.168.1.103:8080 backup;# 备用服务器
}
# 4. 性能优化
gzip on;# 开启压缩
gzip_types text/plain application/javascript application/json;
}
4. 具体差异示例
差异1:跨域处理
nginx
# Nginx解决跨域(无需修改后端代码)
location /api/ {
proxy_pass http://localhost:8080/api/;
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Credentials true always;
add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,OPTIONS' always;
# 处理OPTIONS预检请求
if ($request_method = 'OPTIONS') {
return 204;
}
}
差异2:静态资源服务
nginx
# Nginx高效服务静态资源(优于Spring Boot)
location /static/ {
root /var/www/vue-app;
expires 30d;# 缓存30天
access_log off;
# 启用gzip压缩
gzip_static on;
}
差异3:安全加固
nginx
# 安全配置(Nginx层面)
server {
# 隐藏服务器信息
server_tokens off;
# 限制请求大小
client_max_body_size 10m;
# 限流
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend:8080;
}
}
5. 建议方案
开发环境:
- 直接连接:Vue devServer代理到Spring Boot
- 简单快速,便于调试
生产环境(推荐使用Nginx):
- Nginx + Vue:服务静态文件
- Nginx → Spring Boot集群:反向代理API请求
- 优点 :
- 前后端完全解耦
- 高性能静态资源服务
- 负载均衡和高可用
- 统一的安全策略
- 易于水平扩展
6. 性能对比数据
| 指标 | 直接连接 | Nginx代理 |
|---|---|---|
| 静态资源QPS | ~1000 | ~5000+ |
| 内存占用 | 较低 | 额外占用(约10-50MB) |
| 并发连接数 | 受Spring Boot限制 | Nginx高性能处理 |
| 响应时间 | 直接 | 增加约1-5ms延迟 |
总结建议
- 小型项目/原型阶段:可不使用Nginx,简化部署
- 中大型项目/生产环境 :强烈推荐使用Nginx,获得:
- 更好的性能(静态资源服务)
- 更高的安全性
- 更强的扩展性(负载均衡)
- 更灵活的部署架构