通過在 Apache 中配置 Web 緩衝策略,可以指示瀏覽器及中間代理(如 CDN)複用已下載的資源,減少不必要的網路請求。這可以提升頁面載入速度,同時減少伺服器壓力和頻寬消耗。
免責聲明:本文檔可能包含第三方產品資訊,該資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
策略選型
Apache模組 | 優點 | 缺點 | 使用情境 |
mod_expires | 文法簡單,可快速為不同類型檔案設定到期時間。 | 功能有限,無法設定 | 僅適用於非常簡單的、只需設定 |
mod_headers | 可以設定完整的HTTP頭,支援所有 | 文法相對 | 需要精細化、完整化緩衝策略的生產環境。 |
操作步驟
步驟一:啟用所需模組
在配置緩衝策略前,請確保 headers 和 expires 模組已在 Apache 中啟用。
檢查模組是否已載入執行
apachectl -M或httpd -M命令,檢查輸出資料行表中是否包含headers_module和expires_module。啟用模組(如果未載入):
對於 Debian/Ubuntu 系統:
sudo a2enmod headers expires sudo systemctl restart apache2對於 CentOS/RHEL/Alibaba Cloud Linux 系統:模組通常預設編譯或載入。如果確實缺失,請檢查
/etc/httpd/conf.modules.d/目錄下的設定檔,確保對應的LoadModule行沒有被注釋。
步驟二:選擇設定檔位置
推薦將緩衝相關的配置集中存放在一個專用的設定檔中,或直接寫入網站的虛擬機器主機(VirtualHost)配置塊。
推薦位置:在
/etc/httpd/conf.d/(CentOS/RHEL)或/etc/apache2/conf-available/(Debian/Ubuntu)目錄下建立一個新檔案,例如cache.conf。不推薦位置:避免在
.htaccess檔案中進行配置。Apache 需要在每次請求時讀取並解析.htaccess,會帶來不必要的效能開銷。
步驟三:按情境配置緩衝策略
設定全域預設緩衝到期時間
mod_expires
<IfModule mod_expires.c>
# 啟用mod_expires功能
ExpiresActive On
# 所有資源預設緩衝時間為 1 周
ExpiresDefault "access plus 1 week"
</IfModule>mod_headers
<IfModule mod_headers.c>
# 設定 Cache-Control 頭,緩衝時間為 1 天
Header set Cache-Control "max-age=86400, public"
</IfModule>按指定類型設定緩衝策略
mod_expires
<IfModule mod_expires.c>
# 啟用mod_expires功能
ExpiresActive On
# 預設緩衝時間為 1 天
ExpiresDefault "access plus 1 day"
# 圖片資源緩衝 1 個月
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
# CSS 和 JS 檔案快取 1 周
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>mod_headers
<IfModule mod_headers.c>
# 圖片資源緩衝 1 個月
<FilesMatch "\.(jpg|jpeg|png|gif|svg)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
# CSS 和 JS 檔案快取 1 周
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
</IfModule>禁用特定類型資源的緩衝
mod_expires
<IfModule mod_expires.c>
# 啟用mod_expires功能
ExpiresActive On
# HTML 檔案不緩衝
ExpiresByType text/html "access plus 0 seconds"
</IfModule>mod_headers
<IfModule mod_headers.c>
# HTML 檔案禁用了緩衝
<FilesMatch "\.html$">
Header set Cache-Control "no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</FilesMatch>
</IfModule>設定自訂緩衝策略
根據mod_expires和mod_headers的文法規則,編寫適合自身業務的策略。
mod_expires基本文法
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "base_time plus time_unit"
ExpiresByType mime_type "base_time plus time_unit"
</IfModule>ExpiresActive On:啟用mod_expires模組的功能。ExpiresDefault:設定預設的緩衝時間的指令,適用於所有未明確指定類型的資源。ExpiresByType:針對特定 MIME 類型設定緩衝時間的指令。mime_type:MIME 類型,例如:image/jpeg、image/gif、text/css、text/html。base_time:緩衝時間的基準,通常是access(使用者訪問時)或modification(檔案修改時)。time_unit:時間單位,例如:seconds(秒)minutes(分鐘)hours(小時)days(天)weeks(周)months(月)years(年)
mod_headers基本文法
<IfModule mod_headers.c>
Header set|append|unset header_name "value"
</IfModule>Header set:設定指定的 HTTP 頭欄位值。Header append:在現有值的基礎上追加內容。Header unset:刪除指定的 HTTP 頭欄位。header_name:要操作的 HTTP 頭欄位名稱,例如Cache-Control、Expires。value:設定的值。
步驟四:驗證配置並應用
在修改配置後,請務必先檢查文法再平滑地重載服務,以避免服務中斷。
檢查配置文法在應用更改前,運行語法檢查命令確保沒有錯誤。
CentOS/RHEL/Alibaba Cloud Linux:
sudo httpd -tDebian/Ubuntu:
sudo apache2ctl -t
如果看到
Syntax OK,則可以繼續。應用配置(推薦平滑重載)
使用
reload命令可以在不中斷現有串連的情況下應用新配置。CentOS/RHEL/Alibaba Cloud Linux:
sudo systemctl reload httpdDebian/Ubuntu:
sudo systemctl reload apache2
拓展閱讀:Web緩衝的工作原理
Web 緩衝主要分為兩類:強緩衝和協商緩衝。
強緩衝:當瀏覽器請求一個資源時,會先檢查本機快取。如果緩衝未到期(依據
Cache-Control的max-age或Expires頭部判斷),瀏覽器將直接從本地磁碟或記憶體中讀取資源副本,完全不與伺服器通訊。HTTP 狀態代碼通常為200 (from disk cache)或200 (from memory cache)。這是最高效的緩衝方式。協商緩衝:當強緩衝失效(已到期)或未設定時,瀏覽器會向伺服器發起一個條件請求。
瀏覽器在要求標頭中攜帶緩衝標識,如
If-None-Match(值為上次響應的ETag) 或If-Modified-Since(值為上次響應的Last-Modified日期)。伺服器根據收到的標識判斷資源是否有變化。
若資源未變,伺服器返回
304 Not Modified狀態代碼,響應體為空白。瀏覽器繼續使用本地的舊副本。若資源已更新,伺服器返回
200 OK狀態代碼和全新的資源內容。
通過配置 Apache 來控制以下關鍵的 HTTP 回應標頭,以實現緩衝策略: