通过HTTP2提供Python(Flask)REST API

时间:2016-08-10 16:25:29

标签: python rest nginx gunicorn http2

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

  • 是否可以使用HTTP2提供Python(Flask)应用程序?如果是,哪些服务器支持它?
  • 在我的情况下(一个反向代理服务器和一个服务于实际的API),哪个服务器必须支持HTTP2?

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

最后,我要提一下,对于客户端,我使用带有Hyper http2适配器的Python请求。

2 个答案:

答案 0 :(得分:12)

  

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

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

  

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

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

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

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

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

由此产生的担忧分离在我看来是件好事。

你的80毫秒响应时间可能与你正在使用的HTTP协议没什么关系,但如果那些80毫秒大部分花在等待输入/输出上,那么当然并行运行是一件好事。

Gunicorn将使用线程或进程来处理每个请求(除非你已经花了额外的英里来配​​置greenlets后端),所以考虑让Gunicorn产生成千上万的任务是否可行。

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

答案 1 :(得分:2)

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

您的实际问题,

  

以HTTP1.0和Python请求作为客户端,每个请求需要大约80毫秒

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