有无WSGI


关于我在技术社区Slack中谈论的内容的摘要。

请小心,因为它可能包含猜测。

使用或不使用WSGI

的奥秘

在用Python开发Web应用程序时,我通常使用aiohttp Server。

main.py

1
2
3
4
from aiohttp import web
from app import app

web.run_app(app)

我几乎总是创建这样的文件,并且在生产环境中运行它时,我只运行了python main.py(在Docker容器中)。没什么困难,它只是运行一个Web应用程序。

但是当我以前用Flask开发Web应用程序时,我使用了一个名为uWSGI的服务器在生产环境中运行它。

那是什么?
为什么在那时而不是这次需要uWSGI?

不,我知道" WSGI是Web应用程序的接口,而uWSGI是其实现之一"。

很久以前,当我用Perl(Amon2)编写Web应用程序时,我使用Plack(PSGI服务器),而当我用Ruby(Sinatra)编写它时,则使用Unicorn(机架服务器)。我过去接触过的语言具有类似的机制。但是它不在Node.js Express中。 1 Node.js与其他语言有什么区别?

总结问题,看起来像这样。

  • 为什么Perl Amon2和Ruby Sinatra使用Plack和Unicorn,而Node.js Express不使用?
  • 为什么Flask在同一Python Web应用程序框架中使用uWSGI但不使用aiohttp Server?

应用程序本身是否使用HTTP

据我了解,结论是:"因为某些Web应用程序框架说或不说HTTP。"

具体来说:

  • 用Amon2实现的应用程序不会使用HTTP(仅支持PSGI)
  • 用Sinatra实现的应用程序不会使用HTTP(仅支持Rack)
  • 在Express中实现的应用程序会说HTTP 2

  • Flask中实现的应用程序不会说HTTP 3(仅支持WSGI)
  • 由aiohttp Server实现的应用程序说HTTP 4

不使用HTTP的应用程序无法按原样运行,因此必须与兼容的Web服务器结合使用。 5

那么,为什么框架在

中说或不说HTTP?

似乎是因为" Web服务器和Web应用程序应该分开(Web应用程序本身不必说HTTP)"。

Web服务器需要高速处理大量HTTP请求,并且每个框架要实现服务器来实现它都是昂贵且浪费的。一旦创建了类似WSGI的界面,就可以分离Web服务器和Web应用程序,并以任意组合使用它们。 (考虑到这一点,想法是"无论如何都要说HTTP,请确保可以使用Nginx进行所有操作,包括SSL终止和静态内容分发。"但是我认为Nginx部门就是出于这个想法。 )

如果可以并行处理,则不需要理论

那么为什么Node.js Express和Python aiohttp Server不使用WSGI之类的接口直接说HTTP?

两者有一些共同点,并且都支持带有事件循环的非阻塞IO。

Node.js是运行时本身的事件循环,并且是无阻塞的IO,与框架无关。

Python是一种阻塞的IO语言,因此,直接说HTTP的实现可能根本没有性能,例如,在处理一个请求时,它会阻塞所有其他请求。因此,我们将考虑在线程和事件循环中进行并行处理,但是如果在存在GIL的约束下执行并行处理,则在事件循环中进行处理可能比在线程(?)中进行处理更好。 aiohttp服务器是这种类型的非阻塞IO,因为它依赖于asyncio(事件循环)。

如果应用程序本身可以处理并行处理会怎样?即使您通过简单地讲HTTP来实现它,也可以正常并行处理请求。之后,您可以通过简单地启动多个进程和负载平衡来处理大量请求。因此,您不必使用WSGI将Web服务器与Web应用程序分开。

摘要

  • 在Ruby和Python之类的Web应用程序框架中,很难实现并行处理HTTP请求的机制,因此在制定了类似WSGI的接口之后,将其扔给其他机制以分离角色(我认为))
  • 最初基于无阻塞IO Node.js Express和Python的asyncio实现的aiohttp Server可以由应用程序本身执行并行处理,因此即使您直接讲HTTP而无需使用类似WSGI的机制也没有问题(我认为是)
  • 我曾经使用过every和pm2进行过程监视,但是这次忽略它们,因为它们是不同的吗?

  • 确切地说,Express应用程序带有标准的Node.js http模块,但是由于它没有定义像WSGI这样的唯一接口,因此可以说它直接说HTTP。这不是夸张的(我认为)?

  • Flask似乎使用HTTP是因为它具有内置的服务器功能(app.run()),但是它也是WSGI服务器的实现,并且它是一个简单的实现,因此不适合用于生产环境?

  • aiohttp Server是一个"使用asyncio处理HTTP的模块",而不是" Web应用程序框架",所以如果您必须讲HTTP,这并不奇怪吗?

  • 您是否误解了上面列出的所有框架都可以使用HTTP并支持WSGI等接口?