Django服务器比较:开发服务器、Mod WSGI、uWSGI和Gunicorn
介绍
当谈到 Django 服务器时,有很多选择。 可能很难知道哪种设置适合您。 虽然每种设置都不同,但它们都有自己的优点和缺点。 在本文中,我们将尝试探索最常见的 Django 服务器,并指出与它们相关的优缺点。
一 - Django 开发服务器
Django 开发服务器与 Django 一起打包,可以使用以下命令运行:
django-admin.py runserver
这将启动一个轻量级 Web 服务器,默认情况下使用 localhost 在端口 8000 上运行。 您可以通过将以下内容作为附加参数传递来修改它:
django-admin.py runserver 10.0.0.150:8001
这将使 Web 服务器使用端口 8001 上的 IP 10.0.0.150 为您的 Django 应用程序提供服务。 虽然您可以传递各种其他选项,但以上是最常见的。
Django 开发服务器就是这样,一个开发服务器。 正如官方 Django 文档 here 中所述,它不适用于生产环境。 然而,它的目的是用作在开发环境中测试应用程序的简单方法,而不会增加安装/配置完整的 Web 服务器的开销。
Django 开发服务器的亮点在于它重量轻且使用简单。 它提供您的静态文件,而无需将它们收集到任何特定位置。 每次保存文件时,开发服务器也会重新启动。 这很有帮助,因为大多数 Python 的 Web 服务器都会缓存您的应用程序以消除启动时间的需要,但如果代码更改则需要重新启动,以便可以缓存新副本。
Django 开发服务器的明显缺点是它不能用于生产,只能用于开发目的。 它不能在任何给定时间处理大量请求或负载。 除此之外,对于那些寻求快速启动和运行 Django 的人来说,它是一个很好的选择。
二 - Mod_WSGI
Mod_wsgi 是最流行的用于 Apache 的 Python WSGI 适配器模块,如果您使用 Apache 作为您的 Web 服务器,这是一个强烈推荐的方法。
一旦你安装了 mod_wsgi,它的实现就相当简单了。 只需将以下行添加到您的 Apache VirtualHost 条目中:
WSGIScriptAlias /yourapp /opt/yourenv/yourapp.wsgi
您给 WSGIScriptAlias 指令的第一个参数是 URL 挂载点。 因此,如果此 VirtualHost 条目用于域 mydomain.com,那么您的应用程序将显示在 http://mydomain.com/yourapp。
如果您的 Django 应用程序位于 Apache 配置为可供 Apache 访问的目录之外,那么您还需要将以下内容添加到您的 VirtualHost 条目中:
<Directory /opt/yourenv> Order allow,deny Allow from all </Directory>
请注意,如果您想将 WSGI 应用程序挂载到您的域的根目录,您可以使用“/”,但这有一个小警告。 当您这样做时,您在 DocumentRoot 中找到的静态文件不再由 Apache 提供,而是由 WSGI 应用程序提供。 要解决这个问题,只需使用“别名”指令映射您的静态文件,如下所示:
Alias /static/ /opt/yourenv/static/
就像 WSGIScriptAlias 指令一样,第一个参数是挂载点。 第二个选项是文件所在的静态目录的路径。
mod_wsgi 的优点是它可以与 Apache 无缝集成。 这对于使用 Apache 作为主要 Web 服务器的任何人来说都非常有用。
mod_wsgi 的缺点是它只适用于 Apache。 因此,如果您更喜欢或需要其他 Web 服务器,例如 NGINX、Lighttpd、Cherokee 等。 那你就不走运了。 它也不像我们将讨论的其他一些选项那么轻。
三 - uWSGI
uWSGI 是实现 WSGI 协议的服务器,以便与其他 Web 服务器(如 NGINX、Apache、Cherokee 等)进行通信。 它的最终目标是处理 Python 代码的解释,而前一句中提到的 Web 服务器则处理静态文件和其他请求。 uWSGI 是为 Python 编写的,因此安装就像运行以下命令一样简单:
sudo pip install uwsgi
用于 Django 的 uWSGI 的实现相当简单。 Django 项目站点有关于这个主题的大量文档,可以在 here 中找到。
一旦按照 Django 文档中所示安装并运行 uWSGI,剩下的就是从主 Web 服务器代理到 uWSGI。 如何执行此操作取决于您的 Web 服务器,但通常非常简单。
使用 uWSGI 的好处是它的重量很轻,与您的 Web 服务器分开运行(以免使您的 Web 服务器进程过载),并且相对容易设置。
一些缺点是必须在您的 Web 服务器之外设置另一台服务器的开销,并且需要从您的主 Web 服务器代理到 uWSGI。 但是,如果您不介意在配置方面有点脏,那么 uWSGI 是一个不错的选择。
四 - 独角兽
Gunicorn 是一个 Python WSGI HTTP 服务器,很像 uWSGI。 我个人使用 Gunicorn,但这并不一定意味着它是最好的。 我使用 Gunicorn 是因为它的简单设置和与 Django 的轻松集成。 它的安装与 uWSGI 非常相似,使用以下命令:
sudo pip install gunicorn
你可以在这里找到实现说明。
与 uWSGI 一样,您必须从主 Web 服务器代理到 Gunicorn。 这对 Gunicorn 来说并不比对 uWSGI 更容易。
Gunicorn的重量也很轻。 它是否比 uWSGI 更快还有待商榷。 这在很大程度上与您如何配置 Gunicorn 或 uWSGI 有关。 两者都可以达到非常令人印象深刻的性能水平,尽管有些人提到 Gunicorn 在高负载下工作得更好。
Gunicorn 的缺点与 uWSGI 大致相同,尽管我个人发现 Gunicorn 比 uWSGI 更容易配置。 它仍然不像在 Apache 中使用 mod_wsgi 那样快速或简单地配置和设置,但在性能水平上没有可比性。
概括
还有许多其他选项我们没有涉及,例如 Flup、FastCGI、mod_python 等。
Flup 的使用不是很广泛,所以我不推荐它。 FastCGI 更适用于共享托管环境,而不是像 DigitalOcean 这样您不共享 Web 服务器或资源的环境。 Apache 的 Mod_python 确实可以工作,但在您发现的大多数文档中, mod_wsgi 将是推荐的路线,因为它工作得更好。
那么哪种方法是赢家呢? 嗯,老实说,这取决于你所追求的。 如果您喜欢 Apache 以及简单的设置和集成,那么请务必使用 mod_wsgi。 如果您不使用 Apache,那么我会推荐 uWSGI 或 Gunicorn。 两者都有其优点,并且适用于任何 Django 应用程序。 当然,在开发环境中,根本没有理由不使用内置的 Django 开发服务器!