Наша система электронной коммерции имеет TTFB примерно 300–500 мс, что я не считаю плохим, но все же не так хорошо, как статический файл. На этой неделе я наконец-то поэкспериментировал с созданием моего собственного локального кеша страниц продуктов / категорий и приказал нашему серверу перезаписать эти файлы, если они есть, иначе перезаписать в систему электронной торговли.
Он отлично работает, и наши 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]
Еще пара замечаний:
Для страниц продуктов и категорий основная цель одинакова: проверить, существует ли файл кеша для этого идентификатора продукта / категории. Если да, обслуживайте его, иначе ничего не делайте и позвольте следующей перезаписи отправить запрос в нашу систему электронной торговли.
В ?CacheFlag
не делает ничего особенно функционального - но правило в /local_http_cache/
файл .htaccess запрещает все, что не имеет этого флага, чтобы никто не мог просматривать эти файлы напрямую.
страницы кеша преднамеренно являются 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-пути, которая, похоже, вас все равно не интересует.
Однако, похоже, это тоже может быть слишком Общее? Я предполагаю, что у вас нет статических ресурсов (JS, CSS или изображений и т. Д.), У которых есть URL-путь, который начинается /product_
? Если вы это сделаете, то этот шаблон следует сделать более строгим, иначе он приведет к «тестированию» гораздо большего количества запросов, чем нужно.
RewriteCond %{DOCUMENT_ROOT}\/\local_http_cache\/product_%1.php -f
Вам не нужно использовать обратную косую черту, чтобы избежать косой черты или l
(?) в TestString. Это не регулярное выражение, но даже если это было, эти символы не несут особого значения.
/local_http_cache/product_%1.php?CacheFlag [PT,QSA,L]
Вам нужен PT
флаг здесь (или в любой из этих директив)? Это приводит к замена строка обрабатывается как URL-путь, и процесс перезаписи начинается заново. Если вы переписываете прямо на файл (что предполагается в контексте vHost), который не требует дальнейшей обработки, то PT
флаг можно не указывать.
В этом случае я бы также сомневался в использовании CacheFlag
Строка запроса. Вы можете изменить это на переменную среды (например, E=UniqueCacheFlag:1
в RewriteRule
flags) и проверьте это в /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
блок.