基于Django构建Blog(13)-部署

到目前为止,一个简单的blog系统就完成了,下一步的工作就是想办法将这个系统部署到生产环境。主要有三个步骤:1. 配置生产环境;2. 配置待部署的Django工程;3. 把配置好的Django工程部署到生产环境(上线)。

配置生产环境

Django 1.7版的官方文档中提到了WSGIFastCGISCGIAJP技术。另外,还指出了在线电子书《The Django Book (2nd Edition)》第12章中提到的Apache + mod_python方案。

要注意的是:官方不推荐使用FastCGI,且1.9版的Django将不再对其提供支持;对于mod_python,从Django 1.5版开始就不再支持了;官方的建议是使用Apache + mod_wsgi的方案,理由是快速,稳定且配置相对便捷。

我们这里使用官方推荐的方案:"Apache+mod_wsgi”。

首先,安装所需依赖,所需依赖项都放在了"xblog/requirements.txt"文件中,执行下面的命令进行安装:

pip install -r requirements.txt

requirements.txt文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
django==1.7.1
pygments==2.0.2
django-pygments==0.1
markdown==2.6.2
django-markdown==0.8.4
django-haystack==2.4.0
Whoosh==2.7.0
jieba==0.37
django-adminfiles==1.0.1
sorl-thumbnail==12.2
pillow==2.8.1

注意:上面的django-adminfiles,sorl-thumbnail和pillow是为实现文件上传功能所需的依赖,除此之外还需要手动安装其它的一些依赖,请参考《基于Django构建Blog(12):其它》进行安装。

MySQL的安装和配置方法参考:《CentOS6.3部署MySQL》

Apache和mod_wsgi的配置方法参考:《配置Django生产环境(Apache+mod_wsgi)》

配置工程

· 秘钥(SECRET_KEY)在创建Django工程的时候,会自动生成一个SECRET_KEY,这个Key将被用作随机函数的Seed、Hash的Salt。Cookie等敏感信息的安全都将基于SECRET_KEY,因此,要对其进行妥善的保管。不要把这个Key放到工程(默认放在settings.py文件中)或其它容易获得的地方。可以将其添加到系统环境变量,在settings.py文件中读取:

· 关闭"DEBUG"模式DEBUG模式是为方便调试而存在的,该模式下会在必要的时候(运行出现问题时)在页面中给出包括工程配置,源码片段等一系列敏感信息。对于生产环境来说,打开DEBUG显然是不合理的。

· 配置"ALLOWED_HOSTS"一旦关闭DEBUG模式,域确认机制就被开启了。服务端会查看到来的HTTP请求首部中的Host是否是"ALLOWED_HOSTS"列表中指定的主机域名,不是的话,将不予响应。可以把"ALLOWED_HOSTS"列表视为一个白名单。 ‘.xus.io'可以匹配:www.xus.io和xus.io及二者的子域。

· CSRF_COOKIE_HTTPONLY为CSRF Cookie添加"HttpOnly"标记。浏览器会禁止JavaScript脚本访问带有"HttpOnly"标记的Cookie:

· X_FRAME_OPTIONS用来应对“点击劫持”攻击,设置为'DENY'后,浏览器将拒绝当前页面加载任何frame页面:

· HTTPS如果使用HTTPS的话,那么就可以启用SESSION_COOKIE_SECURECSRF_COOKIE_SECURE来增强Cookie的安全:
启用后将不再允许使用HTTP进行Cookie的传输。


settings.py中的可配置项非常多,大部分不需要我们配置,使用默认值即可。除上面列出的几个配置之外,执行下面这条命令可以知道还需要进行哪些配置:

python manage.py check --deploy

部署(全新部署)

假设已将配置好了的xblog工程复制到了生产环境的"/home"目录下(因为在配置生产环境的时候就是假设目标工程放在"/home"下)。执行下面这条命令完成对静态文件的部署,执行成功后,"xblog/static"目录中的内容,以及工程启用的第三方App要用到的静态内容都会被部署到"/data/static"目录中:

python manage.py collectstatic

迁移数据库:

python manage.py makemigrations 
python manage.py migrate


Prev-基于Django构建Blog(12)-其它
Next-基于Django构建Blog(14)-部署续