使用gunicorn来部署django应用

第一次注意到gunicorn这个django部署工具是在instagram的技术报告里,主要吸引我的地方就两个:

  1. 部署与扩展都非常容易
  2. 与nginx集成良好

下面实际的记录可能包含gunicorn和django以外的其他软件包的安装,是我顺手记录下得,基本环境并不包含这些。

准备工作

1.安装django

python不说了,linux基本自带。django可以向下面部分一样选择使用easy_install或者pip来安装,但是在我的环境下pipy的服务器下载django非常的慢,经常连不上,因此还是下载源码安装: 目前的版本是Django-1.6.1

cd到解压目录,执行:

2.django项目运行的依赖项

依赖项主要是数据库,以及django有关的各类插件或模块,以我自己的部署为例:

PostgreSQL

我的django使用PostgreSQL为主要数据库,所以这个逃不掉。下载与安装说明请戳这里。尽管有种种不建议,我还是使用了官方提供的Graphic Installer

psycopg2

PostgreSQL的python语言接口

空间数据支持

由于依赖PostgreSQL的空间数据扩展PostGIS,而读写空间数据需要其他额外的库资源。因此,安装完具体需要安装:

  • GEOS
  • PROJ.4
  • PostGIS

这个在OSX、Linux和Windows环境下差异较大,具体查看官方文档的说明

3.安装gunicorn

下载源码安装

由于生产环境和开发环境不一样,实际上我用到了如下两个:

easy_install安装

pip安装

让gunicorn跑起来

1. gunicorn命令方式

gunicorn_django的写法

如果不指定[SETTINGS_PATH],将在当前文件夹查找settings.py。

gunicorn的写法

根据官方文档的提示,建议Django1.4以上版本,直接使用gunicorn命令,而不是gunicorn_django命令,在这里暂时不去追究原因。

其实很简单,cd到manage.py所在目录,从wsgi所在app启动(我的app叫mserv)。

这就是纯WSGI写法。现在再多写一点,绑定ip和端口:

好了,可以在客户机上查看你的服务了。那么可以再多一点点,多一个工人帮你搬东西,会快一些:

这样启动的时候你会看到两个worker:

多么体贴!

更多命令参数可看官方文档的Settings部分

2. django manage.py方式

好吧,确实有更简单的方式,我们真的可以使用django的manage.py来跑gunicorn服务,我叫它植入式。

首先修改django的settings.py:

然后命令行到django项目目录,可以做很神奇的事情:

小结

这是一个功能强大、易于配置的,对django友好的部署环境,这里是一个开始。个人而言,后面可以讨论的内容包括但不限于:

  • 性能测试与参数调优
  • 与nginx部署环境的整合
  • 合理处理消息,研究真实生产环境中如何管理服务
  • 对gunicorn运行状况的监控
  • 整合django的自动化部署

django如何处理request

当用户请求页面时,系统的算法会选择哪一个python代码会被执行:

1、检查root URLconf模块,一般来说,这个值是ROOT_URLCONF设置,但是如果HttpRequest对象有一个叫做urlconf的属性(通过request processing这个中间件进行设置),这个值就会替代ROOT_URLCONF的设置。
2、Django加载那个python模块,并且查找urlpatterns这个变量,这个变量是一个python list,遵循函数django.conf.urls.patterns()返回的格式。
3、Django按顺序执行每一条URL pattern,然后在第一条与请求的url相匹配的记录处停下。
4、一旦某一个正则表达式匹配了,Django imports并且调用所给定的view(一个简单的python函数)。这个view将HttpRequest作为它的第一个参数,然后从正则表达式中捕获的其他值作为剩下的参数。
5、如果没有表达式被匹配,或者在任何环节由异常被出发,django将出发一个适当的错误处理视图(error-handling view)
当然,也可以使用python的制定参数名的方式。
内容来自官方文档