全部產品
Search
文件中心

:設定Apache緩衝策略

更新時間:Sep 13, 2025

通過在 Apache 中配置 Web 緩衝策略,可以指示瀏覽器及中間代理(如 CDN)複用已下載的資源,減少不必要的網路請求。這可以提升頁面載入速度,同時減少伺服器壓力和頻寬消耗。

說明

免責聲明:本文檔可能包含第三方產品資訊,該資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。

策略選型

Apache模組

優點

缺點

使用情境

mod_expires

文法簡單,可快速為不同類型檔案設定到期時間。

功能有限,無法設定no-storeimmutable等複雜的Cache-Control指令。

僅適用於非常簡單的、只需設定max-age的情境。

mod_headers

可以設定完整的HTTP頭,支援所有Cache-Control指令,如immutable

文法相對mod_expires稍複雜。

需要精細化、完整化緩衝策略的生產環境。

操作步驟

步驟一:啟用所需模組

在配置緩衝策略前,請確保 headers 和 expires 模組已在 Apache 中啟用。

  • 檢查模組是否已載入執行 apachectl -Mhttpd -M 命令,檢查輸出資料行表中是否包含 headers_moduleexpires_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_expiresmod_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_typeMIME 類型,例如:image/jpegimage/giftext/csstext/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-ControlExpires

  • value:設定的值。

<FilesMatch>簡介

<FilesMatch>的主要作用是通過Regex匹配檔案名稱或路徑,從而針對合格檔案應用特定的配置規則。例如:

  • 為圖片檔案(如 .jpg.png)設定較長的緩衝時間。

  • 禁止某些敏感檔案(如 .htaccess 或 .log 檔案)被訪問。

  • 為靜態資源(如 CSS 和 JS 檔案)添加特定的 HTTP 頭。

<FilesMatch>基本文法如下:

<FilesMatch "Regex"> </FilesMatch>
  • Regex:用於匹配檔案名稱或路徑的Regex。常見的匹配模式包括:

    • \.(副檔名)$:匹配特定副檔名的檔案。例如,\.(jpg|jpeg|png)$ 匹配所有 .jpg.jpeg和 .png 檔案。

    • ^/路徑/:匹配特定路徑下的檔案。

    • .*:匹配任意檔案名稱。

步驟四:驗證配置並應用

在修改配置後,請務必先檢查文法再平滑地重載服務,以避免服務中斷。

  • 檢查配置文法在應用更改前,運行語法檢查命令確保沒有錯誤。

    • CentOS/RHEL/Alibaba Cloud Linux:sudo httpd -t

    • Debian/Ubuntu:sudo apache2ctl -t

    如果看到 Syntax OK,則可以繼續。

  • 應用配置(推薦平滑重載)

    使用 reload 命令可以在不中斷現有串連的情況下應用新配置。

    • CentOS/RHEL/Alibaba Cloud Linux:sudo systemctl reload httpd

    • Debian/Ubuntu:sudo systemctl reload apache2

拓展閱讀:Web緩衝的工作原理

Web 緩衝主要分為兩類:強緩衝和協商緩衝。

  • 強緩衝:當瀏覽器請求一個資源時,會先檢查本機快取。如果緩衝未到期(依據 Cache-Control 的 max-age 或 Expires 頭部判斷),瀏覽器將直接從本地磁碟或記憶體中讀取資源副本,完全不與伺服器通訊。HTTP 狀態代碼通常為 200 (from disk cache) 或 200 (from memory cache)。這是最高效的緩衝方式。

  • 協商緩衝:當強緩衝失效(已到期)或未設定時,瀏覽器會向伺服器發起一個條件請求。

    1. 瀏覽器在要求標頭中攜帶緩衝標識,如 If-None-Match(值為上次響應的 ETag) 或 If-Modified-Since (值為上次響應的 Last-Modified 日期)。

    2. 伺服器根據收到的標識判斷資源是否有變化。

    3. 若資源未變,伺服器返回 304 Not Modified 狀態代碼,響應體為空白。瀏覽器繼續使用本地的舊副本。

    4. 若資源已更新,伺服器返回 200 OK 狀態代碼和全新的資源內容。

通過配置 Apache 來控制以下關鍵的 HTTP 回應標頭,以實現緩衝策略:

緩衝相關HTTP回應標頭

回應標頭

作用

常用指令/值

Cache-Control

HTTP/1.1 引入,用於精確控制緩衝行為,優先順序高於 Expires

public:可被任意緩衝(瀏覽器、CDN)儲存。

private:只能被終端使用者的瀏覽器緩衝。

no-cache:強制進行協商緩衝,每次都必須向伺服器驗證。

no-store:完全禁止緩衝,不儲存任何副本。

max-age=<seconds>:設定強緩衝的有效時間長度(秒)。

s-maxage=<seconds>:專用於共用快取(如 CDN)的 max-age

must-revalidate:緩衝到期後,必須向原始伺服器驗證,不能使用陳舊副本。

immutable:表示響應本文在新鮮期內不會改變,瀏覽器無需再發起條件請求。

Expires

HTTP/1.0 的舊標準,提供一個絕對的到期時間點。當 Cache-Control 的 max-age 存在時,此頭部將被忽略。

Expires: Wed, 21 Oct 2025 07:28:00 GMT

ETag

實體標籤(Entity Tag),伺服器為資源產生的唯一識別碼(如檔案內容的雜湊值)。ETag 比 Last-Modified 更精確。

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

Last-Modified

資源在伺服器上最後被修改的時間。精度較低(到秒),且在某些情境下(如檔案內容未變但中繼資料變了)可能不準確。

Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT