如何在Ubuntu 20.04上使用Apache啟用HTTP / 2協議

本教程將向您展示如何在Ubuntu 20.04上啟用HTTP / 2協議以及在Apache上使用服務器推送。 您可能知道,HTTP / 2比HTTP / 1.1協議快得多,這主要是因為前者使Web瀏覽器可以在單個TCP連接(多路復用)上同時向Web服務器發送多個請求並接收亂序的響應。

如今,互聯網用戶的平均帶寬已經大大高於以前,這有助於更快地加載網頁。 但是,帶寬達到5Mbps後,對頁面加載時間幾乎沒有影響。 無論您使用的是5Mbps還是10Mbps,網頁加載的時間幾乎都是相同的。 這些天來,可以極大地影響頁面加載時間的是延遲和往返次數。 這是HTTP / 2復用解決的問題之一。

先決條件

HTTP / 2規範允許使用純文本HTTP,但是實際上,所有主流Web瀏覽器都以需要HTTPS的方式實現HTTP / 2。 因此,在啟用HTTP / 2協議之前,您需要在網站上啟用HTTPS。 您可以閱讀以下詳細指南以啟用HTTPS

  • 如何在Ubuntu上使用Let’s Encrypt在Apache上正確啟用HTTPS。

從版本2.4.26開始,Apache中的HTTP / 2可以投入生產。 因此,您將需要使用的Apache 2.4.26或更高版本 mod_http2,Apache HTTP / 2模塊。 Ubuntu 20.04隨附Apache 2.4.41,可以使用以下命令進行檢查:

apache2 -v

樣本輸出:

Server version: Apache/2.4.41 (Ubuntu)
Server built: 2020-04-13T17:19:17

滿足以上兩個要求後,請按照以下說明在Apache中啟用HTTP / 2。

在Apache虛擬主機上啟用HTTP / 2協議

首先,您需要啟用HTTP / 2模塊。

sudo a2enmod http2

然後編輯您的Apache虛擬主機文件。 如果通過“加密”啟用了HTTPS,則SSL虛擬主機將創建為一個單獨的文件,結尾為 le-ssl.conf

sudo nano /etc/apache2/sites-enabled/your-site-le-ssl.conf

在打開後放置以下指令 <VirtualHost *:443> 標籤。

Protocols h2 http/1.1

保存並關閉文件。 然後重新啟動Apache,以使更改生效。

sudo systemctl restart apache2

如果您使用的是mod_php

如果您使用 mod_php 與Apache一起使用,則您正在使用prefork MPM模塊。 不幸 Mod_http2 不支持前叉。 您可以使用事件MPM模塊來支持HTTP / 2,這需要您使用FastCGI運行PHP,因為事件MPM與 mod_php。 請按照以下步驟從前叉切換到事件MPM。

禁用PHP7模塊。

sudo a2dismod php7.4  

禁用前叉MPM模塊。

sudo a2dismod mpm_prefork

啟用事件MPM,Fast_CGI和setenvif模塊。

sudo a2enmod mpm_event proxy_fcgi setenvif

安裝PHP-FPM

sudo apt install php7.4-fpm 

啟動PHP-FPM

sudo systemctl start php7.4-fpm

啟用PHP-FPM在啟動時啟動。

sudo systemctl enable php7.4-fpm

使用以下命令將PHP-FPM設置為Apache的PHP處理程序,這將啟用 /etc/apache2/conf-available/php7.4-fpm .conf 文件。

sudo a2enconf php7.4-fpm

重新啟動Apache,以使更改生效。

sudo systemctl restart apache2

測試

您如何知道您的站點實際上正在使用HTTP2協議?

  • 在Firefox或Google Chrome瀏覽器中,加載您的網站頁面,然後按 Ctrl+Shift+I 打開 開發者工具, 點擊 網絡 標籤。 您可以看到您的域使用的協議。
  • 您也可以在Google Chrome瀏覽器中安裝HTTP / 2和SPDY Indicator擴展。
  • 在Firefox中安裝HTTP / 2 Indicator擴展。
  • KeyCDN的在線HTTP / 2測試工具可以告訴您您的站點是否支持HTTP / 2和ALPN。

請注意,您可能需要清除瀏覽器的緩存,因為緩存的對象可能被錯誤地標記為HTTP / 1.1協議。

http2 apache ubuntu

如何啟用服務器推送

HTTP / 2帶有一個稱為“服務器推送”的功能,該功能允許Web服務器發送Web瀏覽器不需要的資源,但該資源是加載Web頁面所必需的。 例如,如果Web瀏覽器請求HTML文檔,則Web服務器知道客戶端將需要關聯的CSS文件並將其與HTML文檔一起發送,從而消除了Web瀏覽器發送CSS請求的需要,因此行程減少。

在這裡,我以WordPress為例。 WordPress網站通常需要以下資源。

  • style.css:主樣式表,位於主題目錄的根目錄中。
  • jquery.js:jQuery庫
  • jquery-migrate.min.js:舊的JQuery
  • wp-embed.min.js:用於嵌入視頻

要將這些資源推送給客戶端,請在中添加以下指令 <VirtualHost> 塊。 用您自己的WordPress主題名稱替換“ 17”。

Header add Link "</wp-content/themes/twentyseventeen/style.css>;rel=preload"
Header add Link "</wp-includes/js/jquery/jquery.js>;rel=preload"
Header add Link "</wp-includes/js/jquery/jquery-migrate.min.js>;rel=preload"
Header add Link "</wp-includes/js/wp-embed.min.js>;rel=preload"

保存並關閉文件。 然後重新啟動Apache,以使更改生效。

sudo systemctl restart apache2

請注意,您需要在以下代碼中添加以下代碼 functions.php 文件以從WordPress CSS和JavaScript文件中刪除版本號。 WordPress更新時,如果將版本號添加到這些文件中,則服務器推送將不起作用。

// Remove WP Version From Styles        
add_filter( 'style_loader_src', 'sdt_remove_ver_css_js', 9999 );
// Remove WP Version From Scripts
add_filter( 'script_loader_src', 'sdt_remove_ver_css_js', 9999 );

// Function to remove version numbers
function sdt_remove_ver_css_js( $src ) {
        if ( strpos( $src, 'ver=" ) )
                $src = remove_query_arg( "ver', $src );
        return $src;
}

測試服務器推送

在Google Chrome瀏覽器中,加載頁面,然後按 Ctrl+Shift+I 打開開發人員工具,然後單擊“網絡”選項卡。 按F5重新加載。 從下面的屏幕快照中可以看到,服務器推送正在我的一個網站上進行。 如果看到“來自內存緩存”,請右鍵單擊它,清除瀏覽器緩存並重新加載。

Ubuntu 16.04 Apache http2

而已! 我希望本教程可以幫助您在Ubuntu 20.04上的Apache中啟用HTTP / 2並使用服務器推送。 與往常一樣,如果您發現此帖子有用,請訂閱我們的免費新聞通訊。

Sidebar