Назад | Перейти на главную страницу

Эффективны ли эти перезаписи Apache vhost?

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

Еще пара замечаний:

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 блок.