![这些 Apache vhost 重写是否高效?](https://linux22.com/image/735078/%E8%BF%99%E4%BA%9B%20Apache%20vhost%20%E9%87%8D%E5%86%99%E6%98%AF%E5%90%A6%E9%AB%98%E6%95%88%EF%BC%9F.png)
我们的电子商务系统大约有 300 - 500 毫秒的 TTFB,我认为这一点也不差,但仍然不如静态文件。本周,我终于尝试创建自己的产品/类别页面本地缓存,并告诉我们的服务器如果可用则重写到这些文件,否则重写到电子商务系统。
它运行良好,我们的 TTFB 通常约为 50 - 100 毫秒。我还观察了我们的服务器平均负载top
,在大多数情况下,数字从 0.5 左右下降到 0.2 左右(由于流量原因偶尔会有所跳跃)。所以总的来说,这似乎使服务器运行得更顺畅,并加快了页面加载时间,这正是我所希望的。
话虽如此,我并不是重写和服务器性能方面的专家——有人可以快速检查一下并告诉我是否还有改进的空间吗?这些重写位于 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
没有做任何特别的功能 - 但是/local_http_cache/
.htaccess 文件中的规则告诉它禁止任何没有该标志的内容,因此没有人可以直接浏览这些文件由于某些代码会检查会话 ID,因此缓存页面故意采用 PHP 格式,但我将研究如何消除这种情况,这样我就可以只缓存静态 html 代码。
答案1
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 路径的其余部分,您似乎对此不感兴趣。
然而,这似乎也有点太一般的?我假设您没有任何静态资源(JS、CSS 或图像等)的 URL 路径以 开头/product_
?如果有,则应使此模式更加严格,否则它最终会“测试”比需要的更多的请求。
RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f
您不需要使用反斜杠转义斜杠或l
(?)测试字符串。这不是正则表达式,但即使是这些字符也没有特殊含义。
/local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]
您是否需要PT
此处(或任何这些指令上)的标志?这会导致代换字符串被视为 URL 路径,重写过程重新开始。如果你直接重写为文件(在 vHost 上下文中假设),不需要进一步处理,则PT
可以省略该标志。
在这种情况下,我也会质疑查询字符串的使用CacheFlag
。您可以将其更改为环境变量(例如E=UniqueCacheFlag:1
在RewriteRule
标志中),然后在/local_http_cache
目录而不是(例如Require env UniqueCacheFlag
- 假设 Apache 2.4)。QSA
在这种情况下也可以省略该标志。这也会使直接访问“不可能”。
它
?CacheFlag
没有做任何特别的功能 - 但是文件中的规则/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
区块。