【问题标题】:Serving Python (Flask) REST API over HTTP2通过 HTTP2 提供 Python (Flask) REST API
【发布时间】:2016-12-17 03:51:36
【问题描述】:

我有一个 Python REST 服务,我想使用 HTTP2 来提供它。我当前的服务器设置是nginx -> Gunicorn。换句话说,nginx(端口 443 和 80 重定向到端口 443)作为反向代理运行并将请求转发到 Gunicorn(端口 8000,无 SSL)。 nginx 以 HTTP2 模式运行,我可以通过使用 chrome 并在向服务器发送简单的 GET 后检查“协议”列来验证这一点。但是,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 请求。

【问题讨论】:

    标签: python rest nginx gunicorn http2


    【解决方案1】:

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

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

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

    现在我要如履薄冰,发表意见。

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

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

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

    在我看来,由此产生的关注点分离是一件好事。


    您的 80 毫秒响应时间可能与您使用的 HTTP 协议关系不大,但如果这 80 毫秒主要用于等待输入/输出,那么并行运行当然是一件好事。

    Gunicorn 将使用一个线程或一个进程来处理每个请求(除非您付出了额外的努力来配置 greenlets 后端),因此请考虑让 Gunicorn 生成数千个任务在您的情况下是否可行。

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

    【讨论】:

    • 我开发了一个直接与 HTTP/2 通信的应用程序,我同意它对大多数应用程序没有价值。除非您知道自己需要它,否则假设使用 HTTP/1.1 而不是 HTTP/2 就可以了。
    • @Yehosef 在您的 1.1 over 2 建议的背景下,这个黑帽演示似乎与这种方法的陷阱/漏洞有关:youtube.com/watch?v=KmKA2Eq-1tQ
    【解决方案2】:

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

    你的实际问题,

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

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

    【讨论】:

    • 感谢您将我引向 Quart,之前没见过这个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多