如何并行运行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,各自安装对应分支的依赖,避免版本冲突。
- 给生产版和Beta版分别创建目录:比如生产版放在
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:
Beta版的服务文件类似,修改路径和端口即可。[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版安全:即使是测试环境,也不要完全放开权限,比如可以限制访问IP,关闭不必要的DEBUG功能,设置强密码。
总结一下:你提到的双项目目录+Nginx分流的方案是完全可行的,也是非常成熟的实践,只要做好环境隔离和配置,就能稳定运行两个版本的站点。
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

