Ubuntu上Apache2配置緩存技巧
Apache2的緩存功能依賴mod_cache(核心緩存模塊)和mod_cache_disk(磁盤緩存后端)模塊。在Ubuntu中,可通過以下命令快速啟用:
sudo a2enmod cache cache_disk # 啟用模塊
sudo systemctl restart apache2 # 重啟Apache使模塊生效
若未安裝,可通過sudo apt install apache2-mod-cache apache2-mod-cache-disk安裝。
在Apache配置文件(如/etc/apache2/conf-available/cache.conf)中添加以下內容,啟用磁盤緩存并設置核心參數:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheEnable disk / # 對根路徑啟用緩存(可替換為特定路徑,如/static)
CacheRoot "/var/cache/apache2/mod_cache_disk" # 緩存文件存儲目錄(需確保Apache有讀寫權限)
CacheDirLevels 2 # 緩存目錄層級(建議2-3層,避免單目錄文件過多)
CacheDirLength 1 # 每層目錄名稱長度(1-2位,優化目錄結構)
CacheDefaultExpire 3600 # 默認緩存過期時間(秒,默認1小時)
</IfModule>
</IfModule>
啟用配置文件并重啟Apache:
sudo a2enconf cache # 啟用conf-available中的cache.conf
sudo systemctl restart apache2
```。
### 3. 高級緩存規則優化
#### 3.1 特定路徑/文件類型緩存
通過`<Location>`或`<FilesMatch>`指令,針對靜態資源(如圖片、CSS、JS)或特定目錄設置更長的緩存時間:
```apache
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
# 緩存/static目錄下的所有內容,過期時間設為1天
<Location "/static">
CacheEnable disk
CacheDefaultExpire 86400
CacheIgnoreHeaders Set-Cookie # 忽略Set-Cookie頭(避免緩存帶會話信息的頁面)
</Location>
# 緩存所有圖片、CSS、JS文件,過期時間設為1個月
<FilesMatch "\.(jpg|jpeg|png|gif|css|js)$">
CacheEnable disk
CacheDefaultExpire 2592000
CacheMaxExpire 3067200 # 最大過期時間(避免資源更新后長期不刷新)
</FilesMatch>
</IfModule>
</IfModule>
```。
#### 3.2 控制緩存行為
通過以下指令優化緩存策略,平衡性能與實時性:
```apache
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheIgnoreNoLastMod On # 即使資源未修改,也使用緩存(減少服務器請求)
CacheLastModifiedFactor 0.5 # 根據Last-Modified頭計算過期時間(0.5表示50%的修改時間作為緩存時間)
CacheStorePrivate On # 緩存私有內容(如用戶個性化頁面)
CacheStorePublic Off # 不緩存公共內容(如新聞頁面,需根據實際情況調整)
CacheRemoveHeaders Set-Cookie # 刪除響應中的Set-Cookie頭(避免緩存帶會話的頁面)
</IfModule>
</IfModule>
```。
### 4. 配置瀏覽器端緩存(Expires模塊)
通過`mod_expires`模塊設置HTTP響應頭,讓瀏覽器緩存靜態資源,減少重復請求:
```apache
<IfModule mod_expires.c>
ExpiresActive On # 啟用Expires功能
ExpiresDefault "access plus 1 week" # 默認緩存時間(1周)
ExpiresByType text/html "access plus 1 week" # HTML頁面緩存1周
ExpiresByType text/css "access plus 1 month" # CSS文件緩存1個月
ExpiresByType application/javascript "access plus 1 month" # JS文件緩存1個月
ExpiresByType image/jpeg "access plus 1 month" # JPEG圖片緩存1個月
ExpiresByType image/png "access plus 1 month" # PNG圖片緩存1個月
</IfModule>
啟用配置文件并重啟Apache:
sudo a2enmod expires # 啟用mod_expires
sudo systemctl restart apache2
```。
### 5. 驗證緩存生效
使用`curl`命令檢查響應頭,確認緩存是否生效:
```bash
curl -I http://your-domain.com/static/image.jpg
若返回結果中包含以下頭部,則表示緩存配置成功:
Cache-Control: max-age=2592000, public # 瀏覽器緩存時間
Expires: Wed, 21 Oct 2025 07:28:00 GMT # 過期時間
ETag: "123456789" # 資源標識(用于協商緩存)
```。
### 6. 監控與調優
#### 6.1 查看緩存命中率
通過Apache的`access.log`或`mod_cache`的統計功能(需開啟`CacheDetailHeader On`)監控緩存命中率,分析緩存效果。
#### 6.2 調整緩存參數
- **增大緩存目錄層級**:若緩存文件過多(如超過10萬),可增加`CacheDirLevels`(如3層)和`CacheDirLength`(如2位),避免單目錄性能下降。
- **調整過期時間**:根據資源更新頻率調整`CacheDefaultExpire`(如靜態資源設為1個月,動態內容設為1小時)。
- **清理緩存**:手動清理緩存目錄(`/var/cache/apache2/mod_cache_disk`),或在配置中添加`CacheCleanInterval 300`(每5分鐘自動清理過期緩存)。