Linux中國

一個 HTTP/2 的故事

被詛咒的 HTTP/1.1

當我第一次看到如何在 Apache 上啟用 HTTP/2 時,這似乎是一項非常簡單的任務。文檔提到載入 http2 模塊並通過如下配置文件確保新協議優先:

Protocols h2 h2c http/1.1

H2Push          on
H2PushPriority  *                       after
H2PushPriority  text/css                before
H2PushPriority  image/jpeg              after   32
H2PushPriority  image/png               after   32
H2PushPriority  application/javascript  interleaved

這當然很容易。即使 Apache 中的所有內容都已正確設置,網站仍然使用的是 HTTP/1.1。不過,顯然我做得沒錯,因為我的網站現在發送了一個新的 HTTP 頭:Upgrade: h2, h2c

在浪費了大量時間調試 TLS 密鑰(HTTP/2 與 TLS 1.1 不兼容)之後,我終於發現問題是沒有使用正確的 Apache 多進程處理模塊。

事實證明,在使用 mpm_prefork(默認 MPM)時,Apache 不會使用 HTTP/2,因為 mod_http2 不支持它。儘管 Apache 還有兩個其他的 MPM,但只有 mpm_prefork 支持 mod_php。突然之間,添加對 HTTP/2 的支持意味著我們將要把所有的 PHP 網站切換到 PHP-FPM。

掉進兔子洞

在很長一段時間裡,一位好友一直試圖讓我相信 PHP-FPM 的優點。雖然表面上看起來很好,但我從來沒有真正試過。它看起來很複雜。常規的 mod_php 做得很好,還有其他事情需要我注意。

事實上,這次的 HTTP/2 事件是讓我鑽研它的一個契機。在我理解了 FPM 池的工作原理後,它實際上很容易設置。由於我不得不重寫我們用於部署網站的 Puppet 配置文件,我也藉此機會鞏固了一堆東西。

PHP-FPM 允許你在不同的 Unix 用戶下運行網站來增加隔離性。最重要的是,我決定是時候讓我們伺服器上的 PHP 代碼以只讀模式運行,並且不得不為我們的 WordPress、Nextcloud、KanBoard 和 Drupal 實例調整一些東西來減少報錯。

過了很長時間通過 Puppet 的自動任務後,我終於能夠全部關閉 mod_phpmpm_prefork 並啟用 mpm_eventmod_http2。PHP-FPM 和 HTTP/2 帶來的速度提升不錯,但更讓我感到高興的是這次磨練增強了我們的 Apache 處理 PHP 的能力。

via: https://veronneau.org/a-tale-of-http2.html

作者:Louis-Philippe Véronneau 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國