这是一个很好的blog entry,它涵盖了使用 Nginx 和 Gunicorn 部署 Django。我将简要介绍一下所有不同技术的重要性:
Git
Git 或任何其他版本控制系统当然不是必需的。为什么它适合部署 Django 项目是因为您通常按源代码分发您的应用程序,即您不编译它或将其打包为鸡蛋。通常你会组织你的 Git 存储库,这样在服务器上更新你的应用程序只需要你检查最新的源——没有别的。
virtualenv 和 pip
这又不是一个严格的要求,但我强烈建议您花时间熟悉 virtualenv 和 pip(如果您还没有这样做的话),因为这将使您的 Python 应用程序跨不同的部署运行时环境,本地或远程,轻而易举。
基本上,您的项目需要在 Python 路径上至少有 Django 和 Gunicorn,甚至可能需要一个数据库驱动程序。这意味着每次您尝试将应用程序部署到某个地方时,您都必须安装 Python 并跳遍easy_install。
virtualenv 将重新分发 Python 安装,这反过来意味着新的 Python 实例默认情况下将拥有与安装相关的自己的 Python 路径配置。 pip 就像类固醇上的easy_install,因为它支持直接从代码存储库中检查 Python 依赖项,并支持一种需求文件格式,您可以使用它一举安装和配置所有依赖项。
使用 virtualenv 和 pip,您需要做的就是拥有一个简单的文本文件,其中包含可以用 pip 解析的所有依赖项,并在机器上安装 Python 发行版。从那里你只需做git checkout repo /app/path; easy_install virtualenv; virtualenv /app/path; ./app/path/scripts/activate; pip install -r /app/path/requirements.txt。瞧,Gunicorn,Django 和所有其他依赖项都将安装并立即可用。当您使用/app/path/scripts 中的 Python 实例运行 Gunicorn Django 脚本时,该脚本将立即可以访问 Gunicorn 源代码,并且它将能够找到您的 Django 项目,该项目也可以访问 Django 和其他依赖项。
Nginx
Web 服务器将主要用于服务器静态媒体。其他一切都被代理到管理 Django 实例的 Gunicorn 实例,因为它的主要目的是托管 Python WSGI 应用程序,而不是充当通用 Web 服务器,相反,您的 Web 服务器不需要能够处理 Python 应用程序.
为什么经常使用 Nginx 是因为它是轻量级的,并且非常适合服务静态媒体和代理请求。与 Apache 相比,它的花里胡哨的东西要少得多,这使得它更容易配置和维护,更不用说如果你已经紧张了,它会更有效地利用资源。
独角兽
这是实际的 Python 应用程序,它将管理您的 Django 实例并提供一个将其公开给 HTTP 客户端的 HTTP 接口。它将启动几个工作进程,这些进程都是不同的 Python 虚拟机,加载了应用程序的源代码及其依赖项。主 Gunicorn 进程将依次负责管理哪些工作进程管理哪些请求以获得最大吞吐量。
Nginx 和 Gunicorn 接线的基本原理
需要注意的最重要的一点是,Nginx 和 Gunicorn 是您独立管理的独立进程。
Nginx Web 服务器将公开,即可以通过 Internet 直接访问。对于静态媒体的请求,例如实际图像、CSS 样式表、JavaScript 源代码和可通过文件系统访问的 PDF 文件,Nginx 将负责将它们在响应正文中返回给 HTTP 客户端,如果您将其配置为查找路径上的文件您将项目配置为收集静态媒体。
任何其他请求都应代理到您的 Gunicorn 实例。它将被配置为在环回接口上的某个端口上侦听 HTTP 请求,因此您将使用 Nginx 作为 http://127.0.0.1:8080 的反向代理来处理对您的 Django 实例的请求。
这是将 Django 项目部署到生产环境的基本纲要,应该可以满足 95% 的 Django 项目的需求。虽然我确实参考了 Nginx 和 Gunicorn,但在设置任何 Web 服务器以充当 Python WSGI 服务器的反向代理时,这是常用的方法。