Django 1.6 最佳实践: django项目的服务器部署

在我们的博客中, 记录了我们在开发过程中所使用的技术和遇到的问题, 希望作为其他开发和设计者的一个学习交流平台.

Django 1.6 最佳实践: django项目的服务器部署


如果详细说明django项目的不熟的话,可能需要整本书才能说明清楚, 这里我们只从较高角度讨论.

1. 使用一台服务器

如果django项目较小, 也不会有太多用户访问的话, 我们可以使用一台服务器来部署. 此时我们需要以下部件:

  • 关系型数据库: PostgreSQL 或 MySQL
  • HTTP 服务器: Nginx + uWSGI, Nginx + gunicore 或 Apache + mod_wsgi
  • 进程管理: Supervisord 或 init scripts
  • NoSQL数据库 (为短时间数据存在): Redis用于cache和消息列队, Memcached用于cache, RabbitMQ为消息列队

2. 使用多台服务器

简单情景

如下图, 你需要至少两台服务器, 一台是数据库服务器, 另一台则是 WSGI application 服务器. 如果可能还可以增加CDN用于储存媒体文件, cache服务器用于储存缓存, 任务服务器用于单独运行CPU敏感的任务.

复杂情景

如下图, 你需要software-based或hardware-based 的 loading balancer, software-based的有HAPProxy, Varnish, Nginx. hardware-based的有Foundry, Juniper, DNS load balancer. 当然还可以使用cloud-based的, 例如Amazon Elastic Load Balancer, Rackspace Cloud Load Balancer.

3. WSGI Application 服务器

首先需要说明的是, 永远使用WSGI部署django项目.

django 的 startproject 会为我们设置好wsgi.py文件, 这一文件中包含了部署django项目到wsgi服务器的默认设置. 最常见的WSGI服务器配置包括:

  • Nginx + uWSGI
  • Nginx + Gunicorn
  • Apache + mod_wsgi

以下是这三者的一个简单对比表:

配置优势劣势
Nginx + uWSGI 使用纯C语言构造; 拥有许多优秀的特性和选项; 声称具有更好的性能 文档不够完整; 没有经过长时间测试
Nginx + Gunicorn Gunicorn使用纯Python构造; 声称具有更好的内存管理能力 Gunicorn和Nginx的文档不足; 没有经过长时间测试
Apache + mod_wsgi 存在已经, 经过长时间测试; 非常稳定; 在windows下可运行; 文档丰富 不提供 environment variable 支持; 设置较复杂

虽然现在有许多测试表明哪个组合更快, 但不要盲目的相信这些测试结果, 因为大多数的测试可能都是基于测试小页面而得到的结果, 因此与实际的情况可能相差甚远.

则三种组合在现实环境中都有大量的使用案例. 要想使任何一种配置达到高通量的要求都需要我们投入时间和精力来测试获得.

使用自己的服务器的缺点就是我们需要额外的系统管理员, 而不像使用PaaS平台那么简便.

4. 自动化部署

当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了.

服务器设置应当自动化, 并写成文档. 在django用户中, Ansible, SaltStack, Puppet和Chef是最流行的四款自动化部署工具. 这些工具似乎都需要长时间学习才能使用, 因为这些工具不是为一台服务器设置的, 而是针对多台服务器的. 以下是这些工具的基本功能:

  • 远程通过apt-get或其他包管理系统安装软件包
  • 远程运行命令
  • 远程启动, 重启各项服务
  • 记录远程运行的命令和其结果
  • 创建或更新服务配置文件
  • 为不同服务器载入不同的配置文件
  • 部署和更新项目代码

比较表:

工具优势劣势
SaltStack 主要用push模式; 使用0mq传输快; 许多例子; 庞大的社区支持; 开源; 由Python写成 较复杂
Ansible 主要用push模式; 可使用Fireball模式加速传输; 不需要远程进程运行; 使用YAML语言设置; 开源; 由Python写成 新项目, 例子较少, 没有官方WSGI和Django配置例子
Chef 有许多例子; 庞大的社区支持; 开源 难学; 由ruby写成, 配置也是ruby语言;
Puppet 庞大的社区支持; 开源 较难学; 由ruby写成; 配置文件由自定义DSL设置
     

Fabric和Invoke则是专注于远程运行命令, 常可以和以上四个工具配合使用.

现在的趋势是更多的使用SaltStack或Ansible, 因为使用Python写成的, 所以更利于Python用户深入了解. 但需要注意的是, 这些趋势会变化, 如果想了解最新的趋势, 需要我们多关注相关的博客.


原文链接: http://weiguda.com/blog/41/