WSGI和uWSGI与Nginx的区别

100

请问有人能解释一下使用WSGIuWSGI与Nginx配合使用的优缺点吗?

我正在为Django网站构建生产服务器,但无法决定是应该选择WSGI还是uWSGI。您能详细说明每种配置的区别吗?哪种配置能够最好地扩展?

先行致谢。


1
这篇博客文章是对很多Python WSGI服务器进行了非常详细的比较,并在最后进行了总结和一些推荐。 - Lowe Thiderman
而且还使用了一些服务器的配置,这些配置非常不稳定,使它们看起来比它们实际上更糟糕。人们必须小心地理解这种比较所表达的意思。 - Graham Dumpleton
27
WSGI是一个规范。uWSGI提供了WSGI规范的实现。它们不能相互比较,只能比较不同的实现。 - Graham Dumpleton
3个回答

112

好的,大家之所以感到困惑是因为多个来源缺乏细节说明,以及这些协议的命名以及WSGI的实际含义。

总结:

  1. WSGI和uWSGI都是协议,而不是服务器。它用于与Web服务器通信以进行负载平衡,特别是利用纯HTTP无法提供的额外功能。目前,Nginx和Cherokee已经实现了此协议。
  2. uWSGI是一个服务器,它实现的协议之一是WSGI(不要将uwsgi协议与uWSGI服务器混淆)。WSGI是一个Pythonspecification。有几种实现WSGI规范的方法,它旨在用于应用程序服务器/ Web服务器等方面,但是有相当多的WSGI应用程序服务器(例如CherryPy,如果您还不够困惑,它还具有可用于生产的符合WSGI的Web服务器!)。
  3. 将uwsgi与WSGI进行比较就像将橙子与苹果进行比较。

3
  1. WSGI 是一种协议而不是服务器。
- Aman
9
实际上,我在第一点写的是正确的,但是WSGI和uWSGI都是协议,所以你写的两个声明都是正确的 :). 当然,这只是第一点缺少其他背景信息的部分。它是uWSGI服务器使用的协议。http://wiki.nginx.org/HttpUwsgiModule,“不要将uwsgi协议与说话uwsgi协议的uWSGI服务器混淆”。 - Derek Litz
4
啊,好的。我原以为你是在试图区分语句1:“wsgi是一种协议…”和语句2:“uwsgi是实现该协议的服务器”。 - Aman
3
当我们运行python manage.py runserver时,Django会在本机计算机上启动一个开发服务器并在本地主机的端口上监听HTTP请求。 - Piyush S. Wanare
python manage.py runserver 是 Django 内置的内部服务器。它不是 Apache、Nginx、Gunicorn 或其他任何服务器。django-extensions 提供了一个 runserver_plus,它使用 Werkzeug 框架,但这是最接近服务器的 runserver - Mike DeSimone
2
什么是“Python规范”? - Armen Michaeli

35

通常最好将Python与主要的Web服务器分开运行,以便Web服务器可以拥有许多小线程,快速提供静态内容,而单独的Python进程将是庞大而沉重的,并且每个进程都会运行自己的Python解释器。因此,纯WSGI不太好,因为它会使每个nginx线程膨胀,带上一个庞大的Python解释器。使用flupgunicornuWSGInginx后面运行要好得多,因为这样可以释放nginx来简单地提供内容,并让你选择运行多少个小型轻量级nginx线程,而不受你选择启动多少个沉重的Python线程来提供动态内容的影响。目前人们似乎对gunicorn非常满意,但这三个选项中的任何一个都应该可以正常工作。

此外,当负载开始变得严重时,这也可以使你将Python移动到另一台服务器上。


1
我有点困惑你的回答。我没看到他提到在nginx内运行任何类型的WSGI实现。他引用了主要的wsgi.org网站。因此,他最初比较WSGI和uWSGI有点愚蠢,因为uWSGI是WSGI规范的一种实现。你自己在使用通用的WSGI术语时也有些混淆,比如说“它会用一个大的Python解释器使每个nginx线程变得臃肿”。WSGI规范本身不可能做到这一点,只有实现可以。 - Graham Dumpleton
1
如果我们比较nginx + mod_wsgi(可插拔模块)和nginx + uWSGI(应用程序服务器容器),那么这将是有意义的。 - clime
所以,当涉及使用Nginx运行Python Web应用程序时,由于Manlio Perillo的mod_wsgi已经停止维护并不推荐使用,因此好的解决方案是使用gunicorn或uWSGI的WSGI,或者使用Flup的FastCGI? - Gulbahar
NGINX不能将静态内容请求与其他请求分开吗?这不是Web服务器的职责之一吗? - Magnus Lind Oxlund

20

我相信这里 http://flask.pocoo.org/docs/deploying/uwsgi/ 是解决混淆的好答案。这个问题并不傻,任何没有关于mod_PHP世界之外如何工作的先前信息的人都会遇到这个问题(例如,不反对PHP或开发人员)。

该网站很好地解释了实际需要做什么以及差异以及nginx的良好部署示例。


为方便起见,从Flask wiki中引用了以下解释:

uWSGI是像nginx、lighttpd和cherokee这样的服务器上的部署选项;请参阅FastCGI 和 Standalone WSGI Containers 了解其他选项。要使用uWSGI协议运行WSGI应用程序,您首先需要一个uWSGI服务器。uWSGI既是协议,也是应用程序服务器;应用程序服务器可以服务于uWSGI、FastCGI和HTTP协议。

最流行的uWSGI服务器是uwsgi,在本指南中我们将使用它。确保已安装它以跟随操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接