线上环境如何部署 Django - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shiziwen
V2EX    Django

线上环境如何部署 Django

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

    考虑到安全和运维方面,
    请问大家是如何在线上部署 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     Solana     2217 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:51 PVG 09:51 LAX 17:51 JFK 20:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86