2016-08-10 60 views
10

我有一个Python REST服务,我想使用HTTP2提供服务。我目前的服务器设置是nginx -> Gunicorn。换句话说,nginx(重定向到端口443的端口443和80)作为反向代理运行,并将请求转发给Gunicorn(端口8000,无SSL)。 nginx运行在HTTP2模式下,我可以通过使用chrome并在向服务器发送一个简单GET之后检查“协议”列来验证。但是,Gunicorn报告说它收到的请求是HTTP1.0。另外,我coulnt't发现它在这个名单: https://github.com/http2/http2-spec/wiki/Implementations 所以,我的问题是:通过HTTP2提供Python(Flask)REST API

  • 是否有可能成为与HTTP2一个Python(瓶)应用程序?如果是,哪些服务器支持它?
  • 在我的情况下(一个反向代理服务器和一个服务实际的API),哪个服务器必须支持HTTP2?

我想使用HTTP2的原因是因为在某些情况下,我需要一起执行数千个请求,而且我很想看看HTTP2的多路复用请求功能是否可以加快速度。以HTTP1.0和Python请求作为客户端,每个请求需要约80ms,这是不可接受的。另一种解决方案是批量/批量处理REST资源,并使用单个请求发送多个请求。是的,这个想法听起来不错,但我真的很感兴趣,看看HTTP2是否可以加快速度。

最后,我应该提到,对于客户端,我使用Python http请求和Hyper http2适配器。

回答

9

是否可以使用HTTP/2提供Python(Flask)应用程序?

是的,根据您提供的信息,您做得很好。

在我的情况下(一个反向代理服务器和一个服务于实际的API),哪个服务器必须支持HTTP2?

现在我要踩在薄冰上并发表意见。

到目前为止,部署HTTP/2的方式是通过一个会话HTTP/2(如ShimmerCat或NginX)的边缘服务器。该服务器终止TLS和HTTP/2,并从那里使用HTTP/1,HTTP/1.1或FastCGI与内部应用程序交谈。

至少在理论上,边缘服务器可以与HTTP应用程序对话吗?是的,但HTTP/2很复杂,对于内部应用程序来说,它并没有得到很好的回报。

这是因为大多数Web应用程序框架都是为处理内容请求而构建的,而且这对HTTP/1或FastCGI来说已经足够好了。虽然也有例外,但Web应用程序对HTTP/2的微妙之处几乎没有用处:多路复用,优先级排序,所有无数安全预防措施等等。

由此产生的问题分离在我看来是一件好事。


你的80毫秒的响应时间可能有一点做与您所使用的HTTP协议,但如果这些80毫秒大多花在等待输入/输出,那么当然并行运行的东西是个好东西。

Gunicorn将使用一个线程或进程来处理每个请求(除非你已经花了额外的时间来配置g​​reenlets后端),所以考虑让Gunicorn在你的情况下产生数千个任务是否可行。

如果请求的内容允许,也许可以创建临时文件并使用HTTP/2边缘服务器提供它们。

0

现在可以直接从Python应用程序服务HTTP/2,例如使用Twisted。您特别询问Flask应用程序,在这种情况下,我会(推荐)推荐Quart这是在asyncio之上重新实现的Flask API(支持HTTP/2)。

您的实际问题,

随着HTTP1.0和Python的要求作为客户端,每个请求需要80毫秒〜

建议,我认为你可能会遇到的问题是,每个请求打开一个新的连接。这可以通过使用connection pool而不需要HTTP/2来缓解。