线上环境如何部署 Django

2015-09-24 10:07:48 +08:00
 shiziwen

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

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

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

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

fabric + git
Kilerd
2015-09-24 11:36:02 +08:00
楼上 正解,
至少我现在就是这种部署方法
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
2015-09-24 12:26:04 +08:00
ansible
111111111111
2015-09-24 14:46:42 +08:00
@julyclyde 启动一个非 80 端口的实例 浏览器打开也看一看
qq12365411
2015-09-24 15:04:17 +08:00
docker
maemual
2015-09-24 15:11:07 +08:00
顺路问个问题,为什么这么多人推荐 gunicorn ?和 uwsgi 相比好在哪里?
clino
2015-09-24 15:23:50 +08:00
virtualenv
realityone
2015-09-24 19:05:12 +08:00
@maemual 因为有一个 --max-requests 23333
maemual
2015-09-24 19:51:53 +08:00
@realityone 。。。。。。。 uwsgi 也有啊。
gamexg
2015-09-24 21:22:02 +08:00
@maemual 更省事了,不需要考虑 web 服务器的兼容性,直接转发即可。
maemual
2015-09-24 21:27:20 +08:00
@gamexg ?什么兼容性?
111111111111
2015-09-24 23:08:06 +08:00
@gamexg 请问能否稍微详细说一下?
max-requests 有兼容性问题吗
julyclyde
2015-09-26 14:10:13 +08:00
@maemual uwsgi 的文档写的不知所云……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/223266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX