django部署之前的检查清单

Posted by grt1stnull on 2018-08-13

在部署django在线上环境时,我们都要考虑些什么呢?本文不关注域名的配置、服务器的购买使用、wsgi和web服务器的选择配置等等,而是从部署角度来讲,要考虑哪些安全性因素。

0x00.部署步骤

无论你怎么使用django,至少以下步骤肯定是你要做的

  1. 确定开发版本。比如我的环境是python3,django版本是2.0
  2. 安装项目依赖。最常见的,比如requirments.txt
  3. 从git仓库或使用scp来拉取自己的代码

而考虑到这些因素后,下面是我考虑的、关注的几点。

0x01.我关注的问题

1.debug开关与静态文件

关于django关闭debug后,找不到静态资源的问题在网上一抓一大把。关闭debug模式后,静态资源的解析就要交给web服务器了,比如nginx通过配置static目录来解析静态资源。甚至可以使用cdn。

2.guicorn/uwsgi

单纯使用django + nginx/apache的模式很少见,更常见的方法是再套一层guicorn/uwsgi,关于使用前者还是后者,差异不是很大。我站guicorn,但是uwsgi也可以,用哪个无所谓啦。

3.日志问题

部署到线上之后,需要对服务状态做记录的。可以配置logger进行日志的记录,甚至django还支持邮件进行告警。

4.allowed_host

settings.py的一项配置,叫allowed_hosts,就是用来限制http请求头部的Host的值。为了方便一点可以填个*,要是为了安全性(其实没啥必要),可以使用['127.0.0.1', 'www.example.com']的形式

5.secret_key

secret_key是很重要的东西,一定要保管好,不能暴露给别人知道,比如上传到github仓库啊,那都是不可以的。所以可以使用如下的方式,通过环境变量的方式来取secret_key,这里我怕环境变量没有设置,导致取不到值,所以我加了if做判断,以免取不到值。

1
2
3
SECRET_KEY = os.environ.get("SECRET_KEY")
if not SECRET_KEY:
SECRET_KEY = 'q1bzh7id($$i)2xwi^cr6y6jbz5c+0f5pmi$r1ieb_0#k_fsb0'

(关于secret_key的泄漏会产生哪些危害,总觉得口说无凭,等哪天啃一下源码,再说

6. 补充 requestments

部署到开发环境,可能需要安装一些依赖,或者版本上有冲突。为了应对这种情况,一般都会使用requirments.txt这个文件来存放依赖,或是直接使用pip安装,或是使用虚拟环境安装这个文件中的依赖。

为了生成这个文件,我们可以直接在目录下运行pip freeze > requirements.txt

但是这样生成会包含比较多无用的包,为了更细致化的生成,可以使用pipreqs。使用如下:

pip install pipreqs
pipreqs ./

参考


查找python项目依赖并生成requirements.txt

Django Deployment checklist