跳到主要內容

Ubuntu Apache 啟用 http/2


何謂 http/2
(摘錄自「你的網站升級到 HTTP/2 了嗎?」)

隨著網頁內容越來越複雜,造成了要完成一個網頁載入(Page Load)的動作,除了要下載 HTML 之外,還需要下載 CSS 檔案、JavaScript 檔案、各種圖片檔案,零零總總加起來需要已經多達上百個對伺服器的 Request 請求資源,大大影響了網頁載入的速度。在這一秒鐘幾十萬上下的時代,Amazon 的網頁載入時間每多一秒,該公司的年度營收就減少 16 億美元、Google 的搜尋時間每多 0.4 秒,每天的搜尋次數就會減少 8 百萬網頁、KISSmetric 分析報告指出等待時間超過 4 秒,Bounce Rate 就會增加 25%。人的思緒在等 1 秒後就開始飄移,如果需要等 10 秒,就會感覺這東西是不是壞了。

這個問題的最大原因在於, HTTP/1.1 有一個非常大的缺陷是每個對伺服器的 Request 資源請求,都必須佔用一個網路連線(TCP connection),傳完一個檔案才能再傳下一個,瀏覽器無法同時下載。因此在 HTTP/1.1 時代,瀏覽器為了加速下載的時間,只好同時允許六個網路連線(TCP connection)併發去連接伺服器,好可以達成同時下載六個資源。但是極限也是如此了,並不是說無限制增加網路連線就可以解決這個瓶頸,因為每一次的網路連線,都必須經過三次握手的初始網路連線程序,而且每次初始連線因為流量控制的關係,一開始的網路封包會傳輸比較慢,後來才逐漸加快。

那麼,HTTP/2 是如何改良的呢?它採用的解法包括:

  • 只需要單一網路連線(Single TCP connection),就可以連接網站伺服器,下載所有需要的資源。大大節省 HTTP/1.1 需要一直建立多個網路連線時的啟動時間浪費。
  • 連線多工(Multiplexing),在單一網路連線上,就可以同時傳輸多個 HTTP Request 和 Response,併發請求 CSS/JS/Images 等等資源。它的原理是將 Requests/Responses 都拆碎成小 frames 進行傳輸,而這些 frames 是可以交錯的,因此檔案再多也不怕,不會發生佔用網路連線(TCP connection)的情況。這就是為什麼在圖檔多的情況下,HTTP/2 特別有優勢。
  • 優先權設計(Prioritization),伺服器可以決定例如 CSS 或 JavaScript 檔案,哪些要優先傳送。
  • Header 壓縮,在 HTTP/1.1 的 Headers 其實是沒有壓縮的,大小佔了約 200 bytes 到 2KB 不等,而且同一瀏覽器的每個 Requests 其實絕大部份的 Headers 都是重複的。HTTP/2 用了 HPACK 壓縮技術,大大減少每次都要重複傳輸一樣的 Headers。
  • Binary 二進位的封包結構設計,對伺服器和瀏覽器來說,可以更快的解析這些資料。冷知識:在 HTTP/1.1 定義了四種解析訊息的方式,在 HTTP/2 只需要一種。
  • 伺服器主動推送資源(Server Push),允許伺服器除了 HTML 之外,連同需要的 CSS/JavaScript/Images 檔案,主動推到瀏覽器的快取之中。不過,這個功能比較有爭議,一來他需要 Web 開發者額外描述有哪些檔案需要隨著 HTML 一起推送給瀏覽器,不是 Web 伺服器升級 HTTP/2 就自動會有。二來它不管瀏覽器是不是已經有快取這個資源,都會推送而造成頻寬浪費。因此實務上筆者認為可以改用瀏覽器的 Prefetch 功能,讓客戶端的瀏覽器自己處理即可。

透過這些技術,讓瀏覽器的網頁下載時間大大降低。而我們網站主需要做的,就是升級 Web 伺服器到支援 HTTP/2。

Ubuntu Apache 升級 http/2

Apache 網頁伺服器要使用 http/2,必須要是 TLS 也就是 https:// 模式,這一點學校大多數的網頁均已使用 Let's Encrypt SSL 進行加密了。還必須將預設的 mpm_prefork 模式改成 mem_event。PHP 也需要變成 fastcgi 模式執行 php-fpm

實際安裝情形:
sudo apt-get install php7.2-fpm
sudo a2enmod proxy_fcgi
sudo a2enconf php7.2-fpm
sudo a2dismod php7.2
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod http2
sudo service apache2 restart
sudo service php7.2-fpm restart

還要在 site-enable 中關於 SSL 的網站設定檔中,在 <VirtualHost *:443> 後面加上一行「Protocols h2 h2c http/1.1」

Apache 和 php-fpm 重啟之後,用 phpinfo(); 檢查,出現 HTTP/2.0 便成功了。






參考資料:

留言

這個網誌中的熱門文章

IPv6系統(三):伺服器手動設定 & Fortigate SLAAC 設定

一、伺服器手動設定 機房的伺服分為 Ubuntu 及 Windows Server 系列兩種。Windows Server 具有圖形介面(GUI),且與 Win7、Win10 作業系統操作相似,相當容易設定。只要把 IP 相關資訊輸入即可。 Ubuntu linux 系統需要修改系統設定檔(/etc/network/interface) 二、Fortigate SLAAC 設定 以學校中 vlan192 為例,IPv6區段為 2001:288:102b:a5::/64 最主要是 config ipv6 之後的區段,set ip6-address 設定本機作為這個 vlan 的 IPv6 的 IP,set ip6-send-adv、set ip6-other-flag 開啟RA功能,並設定成 DHCP+SLAAC 動態 IPv6 環境。 因為採用 DHCP+SLAAC 的緣故,必須要有 DHCPv6 來發放 DNS 資訊,否則要每一台手動設定才能正確連接網路。 除此之外,Fortigate 上還需要針對 IPv6 做 Routing table 和 IPv6 Firewall Rule 的設定。

IPv6 系列(五):KEA DHCP SERVER

學校在純 IPv4 的環境時,採用 ISC-DHCP Server 來發放教學區域的私有 IP(10.10.xxx.xxx),並使用閘道 Fortigate 作 NAT 連接到 Internet。 採用 IPv6 後,原本是要使用 ISC-DHCPv6 來作為 IPv6 發放,結果 ISC-DHCPv6 架不起來。不過在查詢 DHCPv6 的過程中,發現 ISC(Internet System Consortium)已開發出下一代的 DHCP Server:Kea Dhcp Server。 Kea Dhcp Server 官網: https://www.isc.org/kea/ 摘錄  https://www.itread01.com/content/1548712273.html  對 Kea DHCP Server 的介紹: Kea DHCP Server 由 Internet Systems Consortium(ISC) 開發的開源 DHCPv4/DHCPv6 伺服器。Kea DHCP Server 是一個高效能的,可擴充套件的DHCP伺服器引擎。通過hooks library可以很容易的修改和擴充套件。 Kea包含的功能元件 keactrl — kea伺服器啟動,停止,配置重置和狀態查詢元件 kea-dhcp4 — DHCPv4伺服器程式,用於響應客戶端的DHCPv4查詢。 kea-dhcp6 — DHCPv6伺服器程式,用於響應客戶端的DHCPv6查詢。 kea-dhcp-ddns — DHCP動態DNS程式.這個程式在DHCP伺服器和DNS伺服器之間扮演者調解者。它接收來自DHCP伺服器域名更新請求和傳送DNS更新訊息給DNS伺服器。也就是說DDNS捕獲使用者每次變化的IP地址,然後將其與域名相對應,這樣其他上網使用者就可以通過域名來進行交流。而最終客戶所要記憶的全部,就是記住動態域名商給予的域名即可,而不用去管他們是如何實現的。 軟體執行環境 加密庫Botan或者OpenSSL log4cplus 1.0.3+ 如果有需要mysql,需要MySQL headers and libraries。可選(postgresql、cassandra類同) 選用 Kea DHCP Server 的原因,第一,提供 DHC

幾個 Linux command

搜尋 n 天前有修改的檔案 find -mtime -n 刪除 n 天前建立的檔案 find -mtime +n -exec rm {} \; 以檔名規則搜尋檔案並刪除 find . -name "abc*" -delete 同步排除某些資料夾或檔案 rsync -r -q --exclude "dir*" --exclude "file*.txt" [source] [distination]