使用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的自动化部署