這些 Apache vhost 重寫效率高嗎?
我們的電子商務系統有大約 300 - 500 毫秒的 TTFB,我認為這一點也不差,但仍然不如靜態文件。本週我終於嘗試創建自己的產品/類別頁面的本地記憶體,並告訴我們的伺服器在可用時重寫這些文件,否則重寫到電子商務系統。
它工作得很好,我們的 TTFB 現在通常在 50 - 100 毫秒左右。我還觀察了我們的伺服器平均負載
top
,在大多數情況下,這個數字從大約 0.5 下降到 0.2ish(由於流量偶爾會有一些跳躍)。因此,總的來說,這似乎使伺服器執行更順暢,並加快了頁面載入時間,這正是我所希望的。話雖如此,我不是重寫和伺服器性能方面的專家 - 任何人都可以快速回顧一下,讓我知道是否有改進的餘地嗎?這些重寫位於 vhost 文件中。
# product pages RewriteCond %{REQUEST_URI} ^/product_([^.]+).*$ RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f RewriteRule (.*) /local_http_cache/product_%1.php?CacheFlag [PT,QSA,L] RewriteRule ^/product_([^.]+).*$ /path/to/OurEcommerceSystem?ProductID=$1 [PT,QSA] # category pages RewriteCond %{REQUEST_URI} ^/category_([^.]+).*$ RewriteCond %{QUERY_STRING} !((^|&)(Sort_By|Per_Page)=(.*)+(&|$)) RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/category_%1.php -f RewriteRule (.*) /local_http_cache/category_%1.php?CacheFlag [PT,QSA,L] RewriteRule ^/category_([^.]+).*$ /path/to/OurEcommerceSystem?CategoryID=$1 [PT,QSA]
其他幾點注意事項:
- 對於產品和類別頁面,主要目標是相同的:檢查此產品/類別 ID 是否存在記憶體文件。如果是,則提供它,否則什麼也不做,讓下一次重寫將請求發送到我們的電子商務系統。
?CacheFlag
沒有做任何特別有用的事情 - 但是 .htaccess 文件中的一條規則告訴/local_http_cache/
它禁止任何沒有該標誌的東西,所以沒有人可以直接瀏覽這些文件- 由於一些檢查會話 ID 的程式碼,記憶體頁面是特意使用 PHP 的,但我將考慮消除它,這將允許我只記憶體靜態 html 程式碼。
RewriteCond %{REQUEST_URI} ^/product_([^.]+).*$ RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f RewriteRule (.*) /local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]
您不需要檢查
REQUEST_URI
. 這個檢查應該在RewriteRule
模式(.*)
中執行(就像你對後面的指令所做的那樣)——而不是在RewriteRule
. (如果您這樣做,您自然需要將反向引用從更改為%1
-見下文)$1
首先處理
RewriteRule
圖案。只有當這個匹配是前面的條件被處理時,所以通過在這裡匹配所有模式,你正在強制處理RewriteCond
指令。^/product_([^.]+).*$
尾隨
.*$
是多餘的。這只是強制正則表達式解析器吞噬URL 路徑的其餘部分,無論如何您似乎都不感興趣。但是,這也看起來有點太籠統了?我假設您沒有任何具有開頭 URL 路徑的靜態資源(JS、CSS 或圖像等)
/product_
?如果你這樣做了,那麼這個模式應該更加嚴格,否則它最終會“測試”比它需要的更多的請求。RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f
您不需要使用反斜杠轉義TestString
l
中的斜杠或 (?) 。這不是正則表達式,但即使是這些字元也沒有特殊含義。/local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]
您是否需要
PT
此處的標誌(或任何這些指令)?這導致替換字元串被視為 URL 路徑,並且重寫過程重新開始。如果您直接重寫到不需要進一步處理的文件PT
(假定在 vHost 上下文中),則可以省略該標誌。在這種情況下,我也會質疑
CacheFlag
查詢字元串的使用。您可以將其更改為環境變數(例如E=UniqueCacheFlag:1
在標誌中)並在目錄RewriteRule
中檢查它(例如- 假設 Apache 2.4)。在這種情況下也可以省略該標誌。這也將使直接訪問“不可能”。/local_http_cache
Require env UniqueCacheFlag``QSA
?CacheFlag
沒有做任何特別有用的事情 - 但 ’s 文件中的一條規則告訴/local_http_cache/
它.htaccess
禁止任何沒有該標誌的東西由於效率是這裡的問題……你為什麼要使用
.htaccess
?特別是因為您在 vHost 中有其他指令。這不僅僅是有一個.htaccess
文件的事實 - 而是它們可以開始使用(Apache 將搜尋它們)。文件中的指令/local_http_cache/.htaccess
應移動到<Directory>
vHost 中的適當部分,並AllowOverride None
應為文件根目錄設置,以禁用.htaccess
文件。RewriteRule ^/product_([^.]+).*$ /path/to/OurEcommerceSystem?ProductID=$1 [PT,QSA]
您不應該
L
在這裡設置一個標誌以防止進一步處理嗎?所以,總而言之,我們有:
# product pages RewriteCond %{DOCUMENT_ROOT}/local_http_cache/product_$1.php -f RewriteRule ^/product_([^.]+) /local_http_cache/product_$1.php [E=UniqueCacheFlag:1,L] RewriteRule ^/product_([^.]+) /path/to/OurEcommerceSystem?ProductID=$1 [QSA,L]
這同樣適用於該
# category pages
塊。