Поддержка Проблемы и решения чем кешировать сайт с woocommerce?

  • Модератор Yui

    (@fierevere)


    永子

    типичные кеши ( wp-supercache, hypercache, greencache, w3totalcache… и как вариант вне WP — nginx fastcgi cache) сохраняют статические странички для их отдачи основываясь на cookie, типичное правило что странички одинаковы для всех у кого нет кук автора/комментатора, это работает для обычного блога, но есть брать woocommerce, то там все становится сложнее
    и при входе посетителя ( то бишь возможного клиента ) первый раз, ему сразу ставятся 3 «печеньки» делая каждого клиента уникальным:

    Set-Cookie: wc_session_cookie_XXXXXX
    Set-Cookie: woocommerce_items_in_cart
    Set-Cookie: woocommerce_cart_hash

    что собственно делает нежелательным кеширование в статических страницах. Остается только object-cache.php и скидывать в apcu/xcache/memcached то что пытается кешироваться через transients api, но этого не очень хватает.
    Вопрос будет такой — можно ли еще как-нибудь повысить производительность сайта с wp+woocommerce ?

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Как вариант — работать с куками на клиенте, например, использовать jquery. Но нет никакой гарантии насчет безопасности, а также логики обработки этих кук.
    Я, к сожалению, не работал с WOO, поэтому не смогу более детально подсказать, что к чему. Возможно, кто-нибудь из участников Сообщества решил эту задачу успешно и поделится с Вами решением или направит мысли в нужную сторону.

    Тяжело чем-то помочь, каждое решение уникально когда идет речь о производительности, но когда возникла проблема с производительностью, перешел на более простые плагины кеширования

    Batcache
    DB Cache Reloaded Fix
    Обычно, самым узким местом является задержка при выборке данных из БД, поэтому, в первую очередь, желательно поработать в данном направление.

    Может так же помочь использование в теме шаблонизаторов Smarty или Twig которые имеют собственные механизмы кеширования.

    Модератор Yui

    (@fierevere)

    永子

    спасибо за ответы,
    wikicms форум поддержки я посмотрела. к сожалению тем по оптимизации там годных не нашла, аналогично и по тому что гуглится, постраничные кеши отключают все из за проблем с корзиной, т.е. вообщем все то что описано в вопросе. Работать с куками на клиенте конечно интересная идея, но это потребует серьезной модификации, как бы по сути новый аддон не получился на основе woocommerce 😉

    BugTracker
    Batcache к сожалению ничем по логике кеширования не отличается от перечисленного, это такой же постраничный кеш с задействованием кук для его обхода
    if ($http_cookie ~* «comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in»)
    {set $no_cache 1;}

    DBCache (Reloaded Fix) плагин хороший, но опять же из неприятных эффектов, он кеширует все SELECT надолго, иногда неприятно проявляется в виде задержек обновления, добавит покупатель товар в корзину, а в углу так и будет висеть несколько минут «Ваша корзина пуста»
    Использование обьектного кеша (object-cache.php) с любым бэкэндом таких проблем не имеет, задержки конечно могут быть, но с XCache (сайт небольшой, XCache имеет большое преимущество перед memcached) они не вызывают дискомфорта и в то же время ускорение генерации страничек приличное. Это я уже использую.

    Twig/Smarty похоже в используемой теме не используются (тема Canvas от Woothemes, очень гибкая в настройках и с полной поддержкой woocommerce)

    Тяжело чем-то помочь, каждое решение уникально когда идет речь о производительности,

    если бы вопрос был легкий, навряд ли он месяц бы висел без ответов
    Проблема вообщем-то пока не возникла, просто у WP изначально невысокая производительность, на VPS с 1 x 3 ГГц ядром чистая установка выдает 15 страниц в секунду, WP+WooCommerce+Woothemes-Canvas+XCache = 6 страниц в секунду. Казалось бы что этого достаточно, и позволит обслуживать толпы посетителей, но к сожалению реалии такие, что более 60% траффика — боты, а ботам в идеале надо не сессию корзинки ставить, а выдать максимально упрощенный вариант странички для индексирования и на этом закончить, казалось бы тут может помочь JS, а еще лучше те же куки на клиенте, но без модификации woocommerce тут не обойтись, ибо оно ставит уникальные куки даже curl’у

    # curl -I http://www.магазинштанов.com
    HTTP/1.1 200 OK
    Server: Yui
    Date: Tue, 20 Aug 2013 21:39:52 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Set-Cookie: wc_session_cookie_5bbf2ca7ec9e429181ab2df8ebe91e42=6tWqYcfO0pJAiypdvaVoRYw3uuyPfxOV%7C%7C1377207592%7C%7C1377203992%7C%7C97e61b69782be95905e35b22ce41fc5e; expires=Thu, 22-Aug-2013 21:39:52 GMT; Max-Age=172800; path=/; httponly
    Set-Cookie: woocommerce_items_in_cart=0; expires=Tue, 20-Aug-2013 20:39:52 GMT; Max-Age=-3600; path=/
    Set-Cookie: woocommerce_cart_hash=0; expires=Tue, 20-Aug-2013 20:39:52 GMT; Max-Age=-3600; path=/
    Expires: Tue, 20 Aug 2013 21:40:52 GMT
    Cache-Control: max-age=60
    Vary: Accept-Encoding
    Vary: Cookie

    Опять же, не все боты ведут себя прилично, некоторые пытаются набрать полную корзинку и с сайта не уходят, и запросы посылают часто.

    Пока обдумывала ответ, решение само напросилось, в контексте того как бы я стала защищаться от DDOS, на сайте магазина доступна одна вундервафля по подавлению DDOS, т.к. целевая аудитория — одна страна, то остальных в случае атаки можно просто отсечь по GeoIP (даже без задействования PHP, на уровне правил nginx), опять же можно и в штатном режиме использовать анализ GeoIP и ставить переменную в среду выполнения скриптов PHP и не давать печенек тем, кто «не свой», по сути получится всего 1 лишняя проверка и 1 строчка кода, в логику fastcgi cache же достаточно будет добавить проверку на wc_session_cookie и не кешировать ответ (сейчас эта печенька есть у всех). Ну и если кто-то все же захочет сделать покупку не из страны разрешений — у него есть возможность зарегистрироваться/войти для обхода кеша, надо только в FAQ будет об этом написать 😉
    А боты всякие. включая поисковики будут получать кешированные странички от nginx, не вызывая нагрузку на сервер.
    Вот наверное как-то так и буду делать.

    Проблема вообщем-то пока не возникла, просто у WP изначально невысокая производительность, на VPS с 1 x 3 ГГц ядром чистая установка выдает 15 страниц в секунду, WP+WooCommerce+Woothemes-Canvas+XCache = 6 страниц в секунду.

    Стало интересно, чем измеряете производительность, какой инструментарий используете?

    DBCache (Reloaded Fix) — имеет возможность настройки таблиц которые не должны попадать в кеш.

    И еще хотел упомянуть, если приходится писать собственные решения,это WP Object Cache.

    Модератор Yui

    (@fierevere)

    永子

    чем измеряете производительность, какой инструментарий используете

    ab, http_load с ссылками из sitemap
    + логи сервера (php fpm accounting — время процессора, память, нагрузка в %% на процессор на скрипт)

    Requests per second:    211.26 [#/sec] (mean)
    Time per request:       94.670 [ms] (mean)
    Time per request:       4.733 [ms] (mean, across all concurrent requests)
    Transfer rate:          11044.99 [Kbytes/sec] received

    вообщем-то хочется чего-то подобного конечно, а не жалких 6 страниц в секунду с LA > 5

    26693.8 mean bytes/connection
    6.1359 fetches/sec, 163790 bytes/sec
    msecs/connect: 65.8307 mean, 1054.13 max, 50.764 min
    msecs/first-response: 3076.14 mean, 4541.06 max, 754.849 min

    object-cache уже написанные есть под все бэкэнды (все сделано до нас) даже под нераспространенный в массах, но популярный в определенной среде redis 🙂

    Можете сбросить ссылочку на ваш сайт, интересно посмотреть как работает, хотя бы визуально.
    А какие параметры задавали команде ab?
    Правильно я понял, что у вас выделенный виртуальный сервер?
    Пытались как-то увеличивать или уменьшать кол-во доступной памяти и ЦП — какие результаты были? Что-то поменялось?
    Какой сейчас у вас доступный для WP лимит памяти?

    Модератор Yui

    (@fierevere)

    永子

    ссылочка тут
    http://paste.debian.net/plain/27917

    ab отработала по заглавной странице сайта, лимитирующим фактором явилась сеть 100 мбит, параметр -c был задан по уровню фильтра perip nginx, больший паралелиллизм бы уже резался с возвратом ошибки 503
    Все тесты с другой VPS у того же хостера (минимальный пинг, доступная сеть = максимальная ширина канала (100 мбит для VPS))

    По лимитам — php-fpm с 6 рабочими интерпретаторами для данного сайта, fastcgi_pass через unix socket, нагрузка на процессор лимитирована только через niceness, т.е. если другие задачи не хотят взять время процессора, то все доступное будет отдано PHP (mysqld MariaDB — повышенный приоритет)
    Лимит памяти PHP — 64 Mb, отдельно лимит для WP не задан
    используемая память PHP для генерации страниц — до 4 Мб
    используемая память для админки — 3.5 Мб
    Акселерация — ZendOpCache, кеш переменных (Object cache) — XCache
    SQL Server: 5.5.32-MariaDB-Yui
    PHP: 5.5.2-yui fpm-fcgi
    loadav: 0.03 : 0.05 : 0.22
    RAM (total/free/cache): 516172 kB / 263600 kB / 139316 kB
    Used RAM: 113256Kb
    Swap (total/free): 867504 kB / 755064 kB
    php memory limit: 64 MByte / php memory usage: 3.04 MByte

    — TOP RAM USE: Kb RSS —
    61784 php-fpm5.5 net
    49812 php-fpm5.5 net
    30804 mysqld mysql
    19988 php-fpm5.5 net
    11260 php-fpm5.3 drupal
    4120 nginx nginx
    3472 nginx nginx

    Давно не обращался к данному сервису loadimpact, так что решил посмотреть как выглядит под нагрузкой ваш сайт.

    Отчет

    Как-то с вашими словами не сходится либо вы что-то перепутали, а может у меня в конце рабочего дня уже глюки?

    Модератор Yui

    (@fierevere)

    永子

    не сходится прямая линия на графике бесплатного теста loadimpact ?
    их бесплатный тест к сожалению подходит только для сайтов которые реально тормозят или имеют маленький лимит нагрузки…

    может быть я не совсем ясно сформулировала что я имею ввиду в «повышении производительности», у меня нет сомнений что достаточно большое число посетителей будет беспроблемно обслуженно тем, что есть.
    Меня волнует другое, не буду брать в расчет тех же скрипткиддисов, АБеров, и прочих любителей попытаться DOSить сайты, но даже если брать некоторые индексаторы сайта (SISTRIX Crawler к примеру) они игнорируют Crawl-Delay и посылают до 30 запросов в секунду, подобные пики запросов будут сильно грузить , надоедливые боты будут постоянно теребить каталог… вообщем будет расти фоновая нагрузка, всех их не перебанить
    Кеширование в статику вообщем то дает удовлетворительный результат на обычных блогах

    Requests per second:    192.65 [#/sec] (mean)
    Time per request:       103.813 [ms] (mean)
    Time per request:       5.191 [ms] (mean, across all concurrent requests)
    Transfer rate:          4610.14 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    1   0.5      0       9
    Processing:    64  103  10.7    101     154
    Waiting:       57   98  10.4     96     153
    Total:         68  103  10.8    101     158

    вот Drupal на том же хосте, кеширование «из коробки» уровня «средний»
    192 rps

    Вообщем… разочаровывает как-то вордпресс по производительности, без кеша в статику, так что придется сайт по GeoIP ограничивать в плане возможностей, а остальных считать индекс-ботами и выдавать им кешированную статику

    PS: у меня было сильное желание поставить какой нибудь Magento или OpenCart, но хозяин этого «магазина штанофф» кроме WP ничего не хочет.

    вот Drupal на том же хосте, кеширование «из коробки» уровня «средний»
    192 rps

    Вообщем… разочаровывает как-то вордпресс по производительности, без кеша в статику, так что придется сайт по GeoIP ограничивать в плане возможностей, а остальных считать индекс-ботами и выдавать им кешированную статику

    Какие-то несерьезное рассуждения как для программиста. Вы как тот человек, в соседней теме по производительности, с заявлением, что перейдет на Битрикс 😉 Вы не будете возражать, что html файл обладает самой высокой скоростью отдачи 😀

    С производительностью у вас все в порядке, а вот как отсекать разный сброд в виде левых роботов, думаю гугл вам в помощь 🙂

    Вот первое попавшееся произведение неизвестного автора
    Список плохих ботов NGINX

    if ($http_user_agent ~* JikeSpider|proximic|Sosospider|Sogou web spider|aesop_com_spiderman|alexibot|backweb|batchftp|bigfoot|black.hole|blackwidow|blowfish|botalot|buddy|builtbottough|bullseye|cheesebot|cherrypicker|chinaclaw|collector|copier|copyrightcheck|cosmos|crescent|curl|custo|da|diibot|disco|dittospyder|dragonfly|drip|easydl|ebingbong|ecatch|eirgrabber|emailcollector|emailsiphon|emailwolf|erocrawler|exabot|eyenetie|filehound|flashget|flunky|frontpage|getright|getweb|go zilla|go-ahead-got-it|gotit|grabnet|grafula|harvest|hloader|hmview|httplib|httrack|humanlinks|ilsebot|infonavirobot|infotekies|intelliseek|interget|iria|jennybot|jetcar|joc|justview|jyxobot|kenjin|keyword|larbin|leechftp|lexibot|lftp|libweb|likse|linkscan|linkwalker|lnspiderguy|lwp|magnet|mag-net|markwatch|mata.hari|memo|microsoft.url|midown.tool|miixpc|mirror|missigua|mister.pix|moget|mozilla.newt|nameprotect|navroad|backdoorbot|nearsite|net vampire|netants|netcraft|netmechanic|netspider|nextgensearchbot|attach|nicerspro|nimblecrawler|npbot|octopus|offline explorer|offline.navigator|openfind|outfoxbot|pagegrabber|papa|pavuk|pcbrowser|php version tracker|pockey|propowerbot|prowebwalker|psbot|pump|queryn|recorder|realdownload|reaper|reget|true_robot|repomonkey|rma|internetseer|sitesnagger|siphon|slysearch|smartdownload|snake|snapbot|snoopy|sogou|spacebison|spankbot|spanner|sqworm|superbot|superhttp|surfbot|asterias|suzuran|szukacz|takeout|teleport|telesoft|the.intraformant|thenomad|tighttwatbot|titan|urldispatcher|turingos|turnitinbot|urly.warning|vacuum|vci|voideye|whacker|libwww-perl|widow|wisenutbot|wwwoffle|xaldon|xenu|zeus|zyborg|anonymouse|zip|emaile|enhancer|fetch|go is|auto|bandit|clip|copier|master|sauger|site.quester|whack|craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|grabber|webpictures|Jakarta|User-Agent|libwww|lwp-trivial|PHPCrawl|WEP Search|Missigua Locator|ISC Systems iRc|Aboundex|360Spider|Java|Cogentbot|BunnySlippers|Cegbfeieh|AIBOT|Demon|Devil|Wonder|Foobot|Kenjin Spider|Density|LinkextractorPro|LWP::Simple|MassDownloader|Mass Downloader|NetZIP|NG|Metasearch|WebFetch|WebCopier|Webclipping|WebBandit|WebAuto|WebGo|Web.Image.Collector|WebLeacher|WebmasterWorldForumBot|WebReaper|WebSauger|eXtractor|Webster|WebStripper|WebWhacker|WebZIP) {
    return 403;
    }
    Модератор Yui

    (@fierevere)

    永子

    #cat /etc/jinx/inc/blockbad.cf
    set $block_sql_injections 0;
        if ($query_string ~ "union.*select.*\(")    { set $block_sql_injections 1; }
        if ($query_string ~ "union.*all.*select.*") { set $block_sql_injections 1; }
        if ($query_string ~ "concat.*\(")           { set $block_sql_injections 1; }
    if ($block_sql_injections = 1)                  { return 400; }
    set $block_file_injections 0;
        if ($query_string ~ "[a-zA-Z0-9_]=http://")           { set $block_file_injections 1; }
        if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+")        { set $block_file_injections 1; }
        if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { set $block_file_injections 1; }
    if ($block_file_injections = 1)                           { return 400; }
    set $block_common_exploits 0;
        if ($query_string ~ "(<|%3C).*script.*(>|%3E)")          { set $block_common_exploits 1; }
        if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})")     { set $block_common_exploits 1; }
        if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})")    { set $block_common_exploits 1; }
        if ($query_string ~ "proc/self/environ")                 { set $block_common_exploits 1; }
        if ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3D)") { set $block_common_exploits 1; }
        if ($query_string ~ "base64_(en|de)code\(.*\)")          { set $block_common_exploits 1; }
    if ($block_common_exploits = 1)                              { return 400; }
    set $block_spam 0;
        if ($query_string ~ "\b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)\b")       { set $block_spam 1; }
        if ($query_string ~ "\b(erections|hoodia|huronriveracres|impotence|levitra|libido)\b") { set $block_spam 1; }
        if ($query_string ~ "\b(ambien|blue\spill|cialis|cocaine|ejaculation|erectile)\b")     { set $block_spam 1; }
        if ($query_string ~ "\b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)\b") { set $block_spam 1; }
    if ($block_spam = 1)                                                                       { return 402; }
    set $block_user_agents 0;
        if ($http_user_agent ~ "Indy Library")    { set $block_user_agents 1; }
        if ($http_user_agent ~ "libwww-perl")     { set $block_user_agents 1; }
        if ($http_user_agent ~ "GetRight")        { set $block_user_agents 1; }
        if ($http_user_agent ~ "GetWeb!")         { set $block_user_agents 1; }
        if ($http_user_agent ~ "Go!Zilla")        { set $block_user_agents 1; }
        if ($http_user_agent ~ "Download Demon")  { set $block_user_agents 1; }
        if ($http_user_agent ~ "Go-Ahead-Got-It") { set $block_user_agents 1; }
        if ($http_user_agent ~ "GrabNet")         { set $block_user_agents 1; }
        if ($http_user_agent ~ "Java")            { set $block_user_agents 1; }
        if ($http_user_agent ~ "Ezooms")          { set $block_user_agents 1; }
        if ($http_user_agent ~ "Jakarta")         { set $block_user_agents 1; }
        if ($http_user_agent ~ "TurnitinBot")     { set $block_user_agents 1; }
        if ($http_user_agent ~ "ZmEu")            { set $block_user_agents 1; }
        if ($http_user_agent ~ "CCBot/")          { set $block_user_agents 1; }
        if ($http_user_agent ~ "SISTRIX")         { set $block_user_agents 1; }
        if ($http_user_agent ~ "CrystalSemanticsBot") { set $block_user_agents 1; }
        if ($http_user_agent ~ "ScreenerBot")     { set $block_user_agents 1; }
        if ($http_user_agent ~ "BLEXBot")         { set $block_user_agents 1; }
    if ($block_user_agents = 1)                   { return 403; }

    вот вроде бы почти все сделано… но хочется большего… но наверное слишком многого хочу от wp

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «чем кешировать сайт с woocommerce?» закрыта для новых ответов.