这些 Apache vhost 重写是否高效?

这些 Apache vhost 重写是否高效?

我们的电子商务系统大约有 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:1RewriteRule标志中),然后在/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区块。

相关内容