2016-08-10 58 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來緩解。