You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置NGINX适配Vue与Django?生产部署遇404问题求助

问题解决与替代方案

咱们先搞定当前的Nginx配置问题,这是你现在最核心的痛点,之后再聊聊Vue和Django结合的其他可行路子。

一、修复Nginx配置,让Vue正常运行

你的Nginx配置里,location /dist段存在两个核心问题,直接导致了404错误和Django admin异常:

  1. alias路径指向错误:应该直接指向dist文件夹本身,而非它的父目录
  2. try_files的 fallback 路径未对应到dist下的index.html,路由优先级冲突还干扰了Django的请求处理

方案1:保持Vue在/dist路径下访问

如果仍希望通过kruglovks.xyz/dist访问Vue,修改后的完整配置如下:

server {
    server_name kruglovks.xyz www.kruglovks.xyz;
    client_max_body_size 100m;

    # 忽略favicon的日志输出
    location = /favicon.ico { access_log off; log_not_found off; }

    # 处理Django静态文件(collectstatic后的产物)
    location /static {
        root /home/kirill/myprojectdir/myproject;
        # 给静态文件加缓存,提升生产环境性能
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 处理Django媒体文件(你上传的图片等资源)
    location /media {
        root /home/kirill/myprojectdir/myproject;
        expires 30d;
        add_header Cache-Control "public";
    }

    # 正确配置Vue的dist文件夹
    location /dist {
        alias /home/kirill/myprojectdir/myproject/dist; # 指向实际的dist文件夹
        try_files $uri $uri/ /dist/index.html; # 适配Vue history模式,找不到路径就返回入口文件
    }

    # 所有其他请求(包括Django admin、API)转发给Gunicorn
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

方案2:让Vue作为网站根路径(更常用的生产模式)

如果想让用户访问kruglovks.xyz直接打开Vue,仅用Django处理API和admin,可调整配置用/api前缀区分Django请求:

server {
    server_name kruglovks.xyz www.kruglovks.xyz;
    client_max_body_size 100m;

    location = /favicon.ico { access_log off; log_not_found off; }

    # Django静态文件
    location /static {
        root /home/kirill/myprojectdir/myproject;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # Django媒体文件
    location /media {
        root /home/kirill/myprojectdir/myproject;
        expires 30d;
        add_header Cache-Control "public";
    }

    # 处理Django的API和admin请求
    location /api {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
        # 如果Django路由无/api前缀,重写路径去掉/api
        rewrite ^/api/(.*)$ /$1 break;
    }

    # Vue作为根路径,适配history模式
    location / {
        root /home/kirill/myprojectdir/myproject/dist;
        try_files $uri $uri/ /index.html;
    }
}

注意:用此方案时,需在Vue项目中将axios的baseURL设置为/api,确保所有API请求转发到Django。

修改配置后,务必执行sudo nginx -t检查语法,无误后执行sudo systemctl reload nginx重启Nginx生效。

二、Vue与Django结合的替代方案

除了你当前用的前后端分离部署,还有几种适配不同场景的结合方式:

1. 将Vue打包文件嵌入Django模板

  • 操作方式:Vue打包后,把dist里的index.html改为Django模板文件(如vue_home.html),将js、css等静态资源复制到Django的static目录,再在Django的urls.py中添加路由指向该模板。
  • 优点:部署简单,无需单独配置Vue的Nginx规则,前后端同域无跨域问题。
  • 缺点:前后端耦合度高,Vue每次更新都需重新打包并复制文件到Django项目。

2. 开发环境用Vue CLI代理转发API

  • 操作方式:在Vue项目的vue.config.js中配置代理,将/api开头的请求转发到Django开发服务器:
    module.exports = {
      devServer: {
        proxy: {
          '/api': {
            target: 'http://localhost:8000',
            changeOrigin: true,
            pathRewrite: { '^/api': '' }
          }
        }
      }
    }
    
  • 优点:开发时可同时运行Vue和Django,无需处理跨域,调试便捷。
  • 缺点:仅适用于开发环境,生产环境仍需部署dist文件。

3. Docker容器化部署

  • 操作方式:将Django和Vue分别打包为Docker镜像,用Docker Compose管理,Nginx作为反向代理转发请求到两个容器。
  • 优点:部署环境完全一致,避免本地与生产环境差异问题,扩展性强。
  • 缺点:需掌握基础Docker知识,配置相对复杂。

4. 用Django Channels实现实时功能(按需选择)

  • 操作方式:若项目需要实时聊天、通知等功能,可使用Django Channels配合Vue的WebSocket客户端实现双向通信。
  • 优点:无需额外搭建实时服务,可在Django生态内完成开发。
  • 缺点:需配置Redis或其他通道层,复杂度较高,适合有明确实时需求的项目。

内容的提问来源于stack exchange,提问作者Kirill Kruglov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:22:41