V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shiziwen
V2EX  ›  Django

线上环境如何部署 Django

  •  
  •   shiziwen · 2015-09-24 10:07:48 +08:00 · 7953 次点击
    这是一个创建于 3377 天前的主题,其中的信息可能已经有所发展或是发生改变。

    考虑到安全和运维方面,
    请问大家是如何在线上部署 Django 项目的?( nginx + uwsgi + Django )
    编译成 pyc 文件?

    另外,结合 git ,如何做到自动化部署和回退?

    有没有相关的解决方案可以参考,多谢。

    第 1 条附言  ·  2015-11-17 00:28:08 +08:00
    另外,在使用 git 的时候,一般会有 dev 和 pro 分支,一个开发一个生产。
    一般这两种情况下, setting.py 的内容会有所不同。
    这样情况如何处理,才能更好的实现自动化部署?
    29 条回复    2016-04-07 22:24:14 +08:00
    111111111111
        1
    111111111111  
       2015-09-24 10:43:16 +08:00 via Android
    期待大神分享,另外 pyc 不是第一次执行的时候自动编译吗?
    我现在 git 是手动部署和回退,一般 pull 好代码先用 runserver 开一个实际看一下有没有错误,再重启 uwsgi 进程正式上线
    ethego
        2
    ethego  
       2015-09-24 10:52:44 +08:00
    我们目前项目小,就直接用 git 来实现部署, master 用来发布,是最终的生产环境版本,开发工作在 dev 分支中进行,这个分支用来发布内部测试版。远程就这两个分支,本地拉下仓库以后自己新建一个个人分支,在自己的分支上开发好以后 merge 到 dev ,经过测试以后再 merge 到 master ,最后主机拉 master 的版本。严禁个人直接合并代码到 master 。
    ethego
        3
    ethego  
       2015-09-24 10:54:52 +08:00
    直接发布.py 文件就好了啊,这是常识性问题。。
    lovedboy
        4
    lovedboy  
       2015-09-24 10:55:39 +08:00
    pull request .
    webhook ,当 merge 到 master 的时候,自动重启 uwsgi 。
    julyclyde
        5
    julyclyde  
       2015-09-24 10:55:57 +08:00
    @111111111111 django 开头的时候好像只加载 Models 吧?很多 View 错误都是运行时才出来的
    zbing3
        6
    zbing3  
       2015-09-24 11:08:20 +08:00
    用 gunicorn 啊
    virusdefender
        7
    virusdefender  
       2015-09-24 11:21:31 +08:00
    nginx + gunicorn

    fabric + git
    Kilerd
        8
    Kilerd  
       2015-09-24 11:36:02 +08:00 via Android
    楼上 正解,
    至少我现在就是这种部署方法
    shenqi
        9
    shenqi  
       2015-09-24 11:43:45 +08:00
    说一下我厂之前一个工程的部署方式吧。

    项目结构:
    该工程下面 n 个 git 仓库,发布到外边的网站是该工程其中的一个单独的应用仓库。

    机器环境:
    内网: git 服务器。一台部署机器 A 。
    外网(和内网网络,需要 vpn 连接内网):一台生产环境机器 C (跑几个实例进行负载均衡),一台测试机 D (跑两个测试环境),数据服务器 n 个 M 。一台部署机器 B 。

    SSH 管理:
    B 能 SSH 到所有机器。在上面一堆 TMUX session 连接着进行监控等等。
    开发 /运维只能直接连接到 A/B 部署机器。

    运行方式:
    nginx + django + uwsgi + supervisor (apt-get 安装的靠谱, pip 安装的自启动有问题)

    部署方式:
    1 、部署脚本,使用 fabric 进行编写。在 B 机器上面进行运行。
    2 、部署时候, B 机器和 A 机器建立 VPN 连接,然后克隆 /更新仓库的生产分支,到 B 的代码部署临时目录。克隆完毕,进行 RSYNC (需要参数: --delete --exclude 一堆)到 C/D 不同环境的生产 /测试环境的目录。同步完毕就触发各种重启 uwsgi 等等指令。


    git branch :
    理论上只有两个分支。由于部分新加入开发人员,按照其他团队旧的方式协助,可能有时候造成多几个。
    dev 为主开发分支
    master 为主生产分支, Protected 形式。
    各种 tag 用于方便历史管理。

    怎么 git 协助?
    开发人员 fork 仓库,在自己的分支上(和其他人协助)开发,开发完毕,就创建 mr 合并到 dev 分支。这个 mr 只能使用 gitlab 的 Accept Merge Request 来合并,不能直接 push upstream 分支,使用 rebase 自己的分支进行冲突处理。

    发布测试:
    1 、 dev 是一个开发分支,每次合并了新 mr 之后都要进行测试,才能发布生产。这个第一个测试环境,为生产测试环境。
    2 、开发人员每次创建 mr ,都需要进行 mr 测试。这个第二个测试环境,为 mr 测试环境。(外界分享的所有 git 协助,基本上没有这个测试方式。)

    发布生产:
    创建 mr 将 dev 同步到 master ,通过 fab 写好的部署脚本,发布 master 到生产环境,重启进程(重启过程注意 502 问题,因此需要多个实例)

    就酱,之前写过一篇 git 协助的文章, http://blog.shenqh.com/2015/01/29/best-practices-of-git/ 贴下链接。
    huson
        10
    huson  
       2015-09-24 12:26:04 +08:00
    ansible
    111111111111
        11
    111111111111  
       2015-09-24 14:46:42 +08:00 via Android
    @julyclyde 启动一个非 80 端口的实例 浏览器打开也看一看
    qq12365411
        12
    qq12365411  
       2015-09-24 15:04:17 +08:00
    docker
    maemual
        13
    maemual  
       2015-09-24 15:11:07 +08:00
    顺路问个问题,为什么这么多人推荐 gunicorn ?和 uwsgi 相比好在哪里?
    clino
        14
    clino  
       2015-09-24 15:23:50 +08:00
    virtualenv
    realityone
        15
    realityone  
       2015-09-24 19:05:12 +08:00
    @maemual 因为有一个 --max-requests 23333
    maemual
        16
    maemual  
       2015-09-24 19:51:53 +08:00
    @realityone 。。。。。。。 uwsgi 也有啊。
    gamexg
        17
    gamexg  
       2015-09-24 21:22:02 +08:00 via Android
    @maemual 更省事了,不需要考虑 web 服务器的兼容性,直接转发即可。
    maemual
        18
    maemual  
       2015-09-24 21:27:20 +08:00
    @gamexg ?什么兼容性?
    111111111111
        19
    111111111111  
       2015-09-24 23:08:06 +08:00
    @gamexg 请问能否稍微详细说一下?
    max-requests 有兼容性问题吗
    julyclyde
        20
    julyclyde  
       2015-09-26 14:10:13 +08:00
    @maemual uwsgi 的文档写的不知所云……
    maemual
        21
    maemual  
       2015-09-26 14:38:10 +08:00 via iPhone
    @julyclyde 这个确实值得吐槽
    wushuiyong
        22
    wushuiyong  
       2015-10-30 15:42:53 +08:00
    看来大家都还不知道 Walle-瓦力,一个 web 部署系统工具,可能也是个持续发布工具,配置简单、功能完善、界面流畅、开箱即用!

    支持 git 、 svn 版本管理,支持各种 web 代码发布,静态的 HTML ,动态 PHP ,需要编译的 JAVA 等。主要功能列表:
    1.用户分身份注册、登录
    2.开发者发起上线任务申请、部署
    3.管理者审核上线任务
    4.支持多项目部署
    5.支持多项目多任务并行
    6.快速回滚
    7.项目的用户权限管理
    8.部署前准备任务 pre-deploy (前置检查)
    9.代码检出后处理任务 post-deploy (如 vendor )
    10.同步后更新软链前置任务 pre-release
    11.发布完毕后收尾任务 post-release (如重启)
    12.执行 sql 构建(不要担心忘记测试环境 sql 同步)
    13.线上文件指纹确认
    14.支持 git 、 svn 版本管理

    详见 github 项目地址: https://github.com/meolu/walle-web ,官方主页介绍: http://www.huamanshu.com/walle.html
    shiziwen
        23
    shiziwen  
    OP
       2015-11-13 19:19:06 +08:00
    @shenqi
    感谢分享经验。

    我这里有一个问题, dev 分支和 pro 分支,如果存在几个文件不同的情况应该如何处理?最典型的应该是配置文件。 dev 环境下和 pro 环境下的配置文件往往是不同的。

    这种情况应该处理比较好,从而结合 git 做到自动化部署和回退?
    shenqi
        24
    shenqi  
       2015-11-14 12:27:45 +08:00
    @shiziwen

    product_settings.py 定义所有的 setting ,
    dev_settings.py 进行覆盖,并且这个加入 ignore ,开发时候在进行写一个出来。
    __init__.py 里面进行设置,引入 pro 的, 然后 try 引入 dev 的。
    shiziwen
        25
    shiziwen  
    OP
       2015-11-17 00:26:34 +08:00
    @virusdefender
    gunicorn 的优势是什么?
    shiziwen
        26
    shiziwen  
    OP
       2015-11-17 00:31:06 +08:00
    @shenqi
    多谢,
    但是这样还是会经常在两个分支上进行 setting 文件的修改呀。
    shenqi
        27
    shenqi  
       2015-11-18 00:16:25 +08:00 via iPhone
    @shiziwen dev 配置本地开发的, pro 配置产品的,都很简单,你只是走歪路了
    zonghua
        28
    zonghua  
       2016-03-18 00:57:56 +08:00 via iPhone
    @shiziwen 配置 jian   dan
    zonghua
        29
    zonghua  
       2016-04-07 22:24:14 +08:00 via iPhone
    @shenqi 启动的时候可以设置环境变量,指定设置模块
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:56 · PVG 02:56 · LAX 10:56 · JFK 13:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.