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

如何并行运行Django项目的Beta版与生产版?含Nginx多站点部署方案咨询

并行运行Django生产版与Beta版的最佳实践

这是个非常常见的Django部署需求,完全可以实现,而且有几种成熟的方案,我来给你详细拆解一下:

一、你提到的双项目目录+Nginx分流方案:完全可行,且是主流选择

你说的创建第二个项目文件夹拉取Beta分支,通过Nginx把请求分流到两个项目的思路,是很多中小团队的首选,操作清晰、隔离性强,步骤如下:

  • 1. 搭建独立的项目环境

    • 给生产版和Beta版分别创建目录:比如生产版放在 /var/www/myproject/prod,拉取你的主分支(main/master);Beta版放在 /var/www/myproject/beta,拉取Beta分支(比如dev/beta)。
    • 给每个目录配置独立的虚拟环境:比如生产版用 prod/env,Beta版用 beta/env,各自安装对应分支的依赖,避免版本冲突。
  • 2. 启动独立的WSGI服务
    每个项目用Gunicorn或uWSGI启动,监听不同的端口(或Unix套接字,性能更好):

    • 生产版启动命令:gunicorn --bind 127.0.0.1:8000 myproject.wsgi
    • Beta版启动命令:gunicorn --bind 127.0.0.1:8001 myproject.wsgi
      记得给每个项目配置独立的settings文件:比如生产版用 prod/settings/prod.py(关闭DEBUG、配置生产数据库),Beta版用 beta/settings/beta.py(可开启DEBUG方便调试、配置独立测试数据库)。
  • 3. Nginx配置实现域名分流
    Nginx作为反向代理,根据请求的域名转发到对应的服务。下面是简化的配置示例:

    # 生产版站点配置
    server {
        listen 80;
        server_name mydomain.com www.mydomain.com;
    
        # 处理静态文件
        location /static/ {
            root /var/www/myproject/prod/static;
            expires 30d;
        }
    
        location /media/ {
            root /var/www/myproject/prod/media;
        }
    
        # 转发Django请求
        location / {
            proxy_pass http://127.0.0.1:8000;
            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;
        }
    }
    
    # Beta版站点配置
    server {
        listen 80;
        server_name beta.mydomain.com;
    
        location /static/ {
            root /var/www/myproject/beta/static;
            expires 30d;
        }
    
        location /media/ {
            root /var/www/myproject/beta/media;
        }
    
        location / {
            proxy_pass http://127.0.0.1:8001;
            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;
        }
    }
    

    配置完成后,重启Nginx生效:sudo systemctl restart nginx

二、更简洁的替代方案:单项目多配置+独立服务

如果不想维护两个完全独立的目录,可以用同一个代码库,通过多套配置文件区分环境:

  • 1. 调整项目配置结构
    在Django项目里创建多套配置:

    myproject/
    ├── settings/
    │   ├── __init__.py
    │   ├── base.py       # 通用基础配置(比如INSTALLED_APPS、中间件)
    │   ├── prod.py       # 生产版配置,继承base.py,覆盖DEBUG、数据库等
    │   └── beta.py       # Beta版配置,继承base.py,开启DEBUG、配置测试数据库
    └── ...
    
  • 2. 启动不同环境的服务
    启动Gunicorn时指定不同的配置文件:

    • 生产版:gunicorn --bind 127.0.0.1:8000 myproject.wsgi:application --env DJANGO_SETTINGS_MODULE=myproject.settings.prod
    • Beta版:gunicorn --bind 127.0.0.1:8001 myproject.wsgi:application --env DJANGO_SETTINGS_MODULE=myproject.settings.beta
      不过要注意:如果Beta分支和主分支代码差异大,这种方式可能会有冲突,还是推荐用独立目录更稳妥。

三、容器化方案(推荐中大型团队)

如果你们团队有Docker使用经验,用容器化部署会更高效:

  • 为生产版和Beta版分别构建镜像,或者用同一个镜像但指定不同的环境变量(加载不同配置)。
  • 用Docker Compose管理两个容器,各自暴露不同端口,Nginx再转发到对应容器。
  • 这种方式环境隔离彻底,更新和回滚都很方便,不会出现依赖污染问题。

四、必须注意的关键细节

  • 数据库隔离:Beta版一定要用独立的数据库(或同一个数据库的不同schema),绝对不能和生产版共用,避免测试数据污染生产环境。
  • 静态文件分离:两个版本的静态文件要分别执行 python manage.py collectstatic 到不同目录,避免混淆。
  • 服务守护:用systemd或supervisor管理WSGI服务,确保服务崩溃后自动重启。比如给生产版创建 /etc/systemd/system/prod-django.service:
    [Unit]
    Description=Production Django Service
    After=network.target
    
    [Service]
    User=www-data
    Group=www-data
    WorkingDirectory=/var/www/myproject/prod
    ExecStart=/var/www/myproject/prod/env/bin/gunicorn --bind 127.0.0.1:8000 myproject.wsgi
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
    Beta版的服务文件类似,修改路径和端口即可。
  • Beta版安全:即使是测试环境,也不要完全放开权限,比如可以限制访问IP,关闭不必要的DEBUG功能,设置强密码。

总结一下:你提到的双项目目录+Nginx分流的方案是完全可行的,也是非常成熟的实践,只要做好环境隔离和配置,就能稳定运行两个版本的站点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:32:44