Наша система электронной коммерции имеет 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
не выполняет ничего особенно функционального, но есть правило в / Файл .htaccess local_http_cache /
сообщает ему о запрете всего, что не имеет этого флага, поэтому никто не может просматривать эти файлы напрямую
страницы кеша намеренно являются 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
) и проверить это в каталоге / local_http_cache
] вместо этого (например, Требовать env UniqueCacheFlag
- при условии, что Apache 2.4). Флаг QSA
в этом случае также может быть опущен. Это также сделало бы прямой доступ «невозможным».
The
?CacheFlag
не выполняет ничего особенно функционального, но правило в файле/ local_http_cache /
.htaccess
запрещает все, что не имеет этого флага
Поскольку здесь вопрос в эффективности ... почему вы используете .htaccess
? Тем более, что у вас есть другие директивы в vHost. Дело не только в том, что существует файл .htaccess
, но и в том, что они разрешены для начала (Apache будет их искать). Директивы в файле /local_http_cache/.htaccess
следует переместить в соответствующий раздел
в vHost, а для документа следует установить AllowOverride None
. root, чтобы отключить файлы .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]
То же самое применимо к страницам категорий #
блок.