Эффективны ли эти перезаписи виртуальных хостов Apache?

Наша система электронной коммерции имеет 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-код.

2
задан 15 March 2019 в 22:10
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 (?) В 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]

То же самое применимо к страницам категорий # блок.

3
ответ дан 3 December 2019 в 10:32

Теги

Похожие вопросы