V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
97world
V2EX  ›  Python

Django 项目部署方案的讨论和疑问

  •  
  •   97world · 2017-01-14 15:05:08 +08:00 · 3679 次点击
    这是一个创建于 2900 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在同学的介绍下接了两个做公司网站的外单, 都只是简单的公司官网, 访问量不大对性能没有太大的要求. 经过一番调查发现 Django 用来做这种类型的网站很快速方便, 目前两个网站已经开发完毕并且部署到服务器上稳定运行了一段时间. 但是个人并没有运营任何 Python/Django 的经验, 部署方案都是自己参考网上一些文章摸索出来的. 部署方案是没什么复杂的, 但是很好奇正规 Django 项目的部署方案是什么样的? 怎么做负载均衡? 我现在的部署方案是否存在一些显而易见的错误或者不合适的地方? 想跟大家讨论一下. 总得来说就是想知道正规的线上 Django 项目都是怎么部署的.

    下面是我正在使用的部署方案

    • Nginx: 处理 http 请求, 静态文件让 Nginx 来处理, 动态请求交给后面的 uWSGI;
    • uWSGI: uWSGI 相对于其他同类在性能和功能上好一些, 网上关于部署 Django 项目的文章基本上都是以 uWSGI 做例子;
    • Supervisor: 进程管理工具, 这里的作用只是让 uWSGI 的进程挂掉或者重启系统之后能自动启动. 这里听到一个说法, SuperVisor 适用于开发环境, 正式环境用 pm2 更合适, pm2 是提供了一些监控的功能, 但是我没这个需求用 SuperVisor 也是没问题的吧?
    • 发布版本: 手动到服务器上跑git pull命令更新代码, 然后执行supervisor restart xxx, 这里用 Jenkins 是不是可以减少一些工作?
    • ~~Virtualenv: 暂时没用, 因为两个网站都使用相同的依赖包, 没有这个需求.~~

    关于迁移 Django 项目网站

    之前服务器并不是很稳定, 所以导致经常更换服务器. 迁移的步骤都是手动的, 首先迁移相关的源码和静态文件, 然后再迁移数据库, 有点繁琐. 这里用 Docker 是不是可以减少迁移的重复工作?

    11 条回复    2017-01-16 09:34:56 +08:00
    neoblackcap
        1
    neoblackcap  
       2017-01-14 15:35:18 +08:00
    uwsgi 并没有特别快, bjoern + gunicron 也很快,关键是 gunicron 的配置简单多了。使用 uwsgi 的前提是你用了很多 uwsgi stack 。若是没有特别要求,我觉得 gunicron 更好。
    lzjun
        2
    lzjun  
       2017-01-14 15:42:04 +08:00   ❤️ 1
    JasperYanky
        3
    JasperYanky  
       2017-01-14 16:14:08 +08:00   ❤️ 1
    每次都忍不住发一遍 http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/ 另外 可以在 git hooks post-update 里面写脚本 git check 和重启 supervisor
    akinoniku
        4
    akinoniku  
       2017-01-14 16:23:02 +08:00
    把你的程序单独放到 docker container 里面运行设成 restart always 就好,不需要 supervisor 和 virtualenv 。

    把 nginx 和 db 一类的都做成另外的 container ,最后用 docker-compose 设定关系。

    Jenkins 用来跑测试和 build 和 push docker image
    maikcn
        5
    maikcn  
       2017-01-14 17:40:26 +08:00
    我们是 django + uwsgi + nginx 一个 docker 容器, db 另一个容器,用 compose 来 run

    代码是将 容器 1 中的一个目录 如 /codebase 做成一个 Volume ,更新代码 restart 就好了
    gamexg
        6
    gamexg  
       2017-01-14 20:15:39 +08:00
    @akinoniku docker +1
    这种小站点,直接每个 django 网站一个 docker ,里面跑 gunicron 。建议每个站点一个 docker-compose 。
    另外对外可以用 https://github.com/jwilder/nginx-proxy 做反代,能够自动扫面运行中的 docker 容器自动反代。
    每上线一个新站点直接启动一个新的 docker 容器,在 docker 容器环境变量里面注明域名,是否需要自动申请 https 证书, nginx-proxy 会自动反代及申请证书。
    chenqh
        7
    chenqh  
       2017-01-14 22:16:29 +08:00
    @akinoniku 就几台服务器也需要用 docker 吗?
    chenqh
        8
    chenqh  
       2017-01-14 22:20:49 +08:00
    @maikcn 那 celery 那种 task 怎么办,crontab 怎么办,怎么调试呢
    akinoniku
        9
    akinoniku  
       2017-01-15 05:28:24 +08:00
    @chenqh 就一台服务器也可以用 docker
    fengclient
        10
    fengclient  
       2017-01-15 13:55:03 +08:00 via iPhone
    总体差不多 另外还用了 fabric
    maikcn
        11
    maikcn  
       2017-01-16 09:34:56 +08:00
    @chenqh 我们的 task 是在 docker 外做的, django 只提供入口...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1325 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 17:33 · PVG 01:33 · LAX 09:33 · JFK 12:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.