 
           
				
    
    云服务器部署前后端分离项目 Nginx怎么配置
- 优惠教程
- 14热度
你在用云服务器部署前后端分离项目时,是否遇到过页面刷新404、API请求跨域、静态资源加载失败?这些问题根本不是代码的锅,而是Nginx配置没踩对坑。
作为每天处理几十个部署问题的技术顾问,我可以明确告诉你:90%的前端访问异常,都出在Nginx反向代理和location路径匹配规则上。下面这些配置细节,决定了你的项目是“一次上线,稳定运行”,还是“反复调试,夜不能寐”。
前后端分离项目的Nginx核心配置逻辑
前后端分离架构下,前端(Vue/React)和后端(Spring Boot/Node.js)分别独立部署。Nginx的核心任务有两个:
- 静态资源服务:直接响应前端打包后的、JS、CSS等文件
- 反向代理:将带/api等前缀的请求,转发到后端服务所在端口
很多人的配置一上来就错在根路径location /的处理上。
前端路由history模式下的404问题怎么破
Vue或React项目一旦启用history路由模式,刷新页面就会报404。这是因为服务器找不到对应的路径资源。
解决方案不是改回hash模式,而是让Nginx“兜底”:
location / {
    root   /usr/share/nginx/;
    index  index.;
    try_files $uri $uri/ /index.;
}这行try_files是关键。它告诉Nginx:
- 先找有没有$uri这个文件(比如/about)
- 没有就找有没有$uri/这个目录
- 都没有,就返回/index.,交给前端路由处理
这才是真正的“单页应用”支持方案。你如果只配了root和index,刷新必挂。
API请求跨域?用Nginx反向代理彻底解决
开发环境靠前端配置proxy解决跨域,但生产环境必须用Nginx做统一代理入口。
假设你的后端服务运行在8080端口,前端通过/api前缀调用接口,标准配置如下:
location /api/ {
    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;
    proxy_set_header X-Forwarded-Proto $scheme;
}注意proxy_pass末尾的斜杠/:
- 有斜杠:/api/user→http://127.0.0.1:8080/user(路径去掉/api)
- 无斜杠:/api/user→http://127.0.0.1:8080/api/user(保留完整路径)
大多数Spring Boot项目不需要/api前缀,所以必须加斜杠,否则404。
多前端项目共存的Nginx配置方案
如果你要在同一台云服务器部署多个前端项目(比如PC端、移动端、管理后台),不能简单用root指向一个目录。
正确做法是使用alias指令做路径映射:
location /admin/ {
    alias /opt/project/admin/dist/;
    index index.;
    try_files $uri $uri/ /admin/index.;
}
location /mobile/ {
    alias /opt/project/mobile/dist/;
    index index.;
    try_files $uri $uri/ /mobile/index.;
}这里的关键是:
- alias会完全替换location匹配的路径
- try_files中的兜底路径要写完整子路径,比如- /admin/index.
这种结构让你可以无限扩展子项目,而不需要开多个端口或买多台服务器。一台高配腾讯云服务器就能扛住中小型业务流量,点击领取优惠,成本比分散部署低得多。
后端服务带context-path怎么办
有些Spring Boot项目在application.yml里配置了server.servlet.context-path=/prod,意味着所有接口都要加/prod前缀。
这时Nginx代理要明确传递路径:
location /api/ {
    proxy_pass http://127.0.0.1:8080/prod/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}这样/api/login就会被转发到/prod/login,完美兼容。
如果你的后端用了Maven插件配置了<path>/survey</path>,处理方式也一样。关键是搞清后端实际暴露的访问路径,而不是盲目照搬教程。
HTTPS配置:Let's Encrypt免费证书实战
HTTP站点会被浏览器标记“不安全”,影响用户信任。必须上HTTPS。
使用Certbot申请Let's Encrypt免费证书,配置如下:
server {
    listen 443 ssl;
    server_name yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    location / {
        root /usr/share/nginx/;
        try_files $uri $uri/ /index.;
    }
    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}再加一个80端口的重定向:
server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}这样所有HTTP请求都会自动跳转HTTPS,安全又省心。证书每90天自动续期,完全免费。
在腾讯云上部署这套方案,网络质量稳定,DNS解析快,现在点击还能领新人优惠,性价比极高。
性能优化:超时设置与大文件上传
默认Nginx配置对大文件上传或慢接口不友好,容易504超时。
在location块中增加以下参数:
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
proxy_connect_timeout 30s;
client_max_body_size 2048m;这些参数的意义是:
- proxy_send_timeout:后端接收数据超时时间
- proxy_read_timeout:后端响应数据超时时间
- proxy_connect_timeout:连接后端超时时间
- client_max_body_size:允许客户端上传的最大文件体积
特别是做文件上传、Excel导入等功能时,这些配置必不可少。别等线上出问题才想起来改。
部署流程标准化建议
一个高效的部署流程应该是:
- 前端执行npm run build生成dist
- 将dist打包上传到云服务器指定目录
- 解压并替换Nginx的目录
- 后端jar包通过nohup java -jar后台运行
- 修改Nginx配置,nginx -s reload重载生效
整个过程5分钟内完成。你不需要每次都手动传文件,可以用scp或rsync脚本自动化。一台配置得当的腾讯云服务器,点这里查看最新活动,能让你的部署效率提升3倍以上。
FAQ
- Q:Nginx配置修改后不生效怎么办?
- A:先检查语法nginx -t,再重载nginx -s reload。不要直接restart,避免服务中断。
- Q:前端能访问,但API提示404?
- A:90%是proxy_pass末尾斜杠的问题。检查后端是否需要/api前缀,按需添加或删除斜杠。
- Q:如何让多个域名指向不同前端项目?
- A:用
server_name区分。配置多个server块,每个绑定不同域名,指向不同root目录即可。
- Q:Nginx和后端服务必须在同一台服务器吗?
- A:不必。proxy_pass可以指向内网或外网IP,实现前后端物理分离。但同机房部署延迟更低,推荐初期用同一台云服务器。
- A:用