Черен петък - ТЕХНИЧЕСКО ръководство за оцеляване - част 1 - Лак
Тази статия е част от поредица от 3 статии, предназначени да помогнат на онлайн магазините да преодолеят Черния петък.
- това е първата част
- В част 2 говорихме за CDN
- В бъдеща статия ще говорим за „паралелизиране“ - тоест използването на няколко сървъра едновременно.
Черен петък вече е голямо събитие в Румъния. Не само ние в бранша го казваме, това се вижда в цялата преса. Ако тези в маркетинга и продажбите имат повод да се радват, хората в техническите отдели определено са стресИ> i на събитието. Ние бяхме.
Тази година сървърите на Avanticart минаха почти идеално 1, без престой и много добри времена за реакция (обикновено по-малко от 500 милисекунди). НЕ Не съм измислил нищо ново. Просто четох много, експериментирах и събирах различни технологии.
Точно както това, което другите са написали, ни е помогнало, ние искаме да върнем нещо. Ние вярваме, че само споделяйки наученото, всички ние можем да продължим напред. Чрез тази статия искаме да помогнем на разработчиците и общността за електронна търговия в Румъния да преодолеят предстоящите черни петъци.
Добре, оставете историята и ми кажете какво сте направили
Накратко, имаше 3 неща, които доведоха до гладкото протичане на нещата:
- Лак - мощен кеш
- CDN за изображения и css/javascript
- Заявки за споделяне на множество сървъри
Ако сте собственик на магазин в началото на пътя, моля, не стресирайте програмиста си с всичко по-горе. Не всички 3 са достъпни за всеки магазин. Точка 2 вероятно е достатъчна.
Добре, нека вземем всеки поотделно. Нека започнем с Varnish, защото той вероятно е този, който „спаси“ ситуацията в Avanticart. За CDN и използването на повече сървъри скоро ще се върнем със статии.
Лак
За разлика от „нормалния“ блог или сайт, много по-трудно е да кеширате онлайн магазин. Защо? Две основни причини:
- защото не можете да кеширате пазарската си кошница. Позоваваме се на тази част от страницата:
- защото запасите трябва да работят в реално време
Вероятно вашата платформа вече има кеш модул, включен по подразбиране (кеширането може да се извърши на няколко нива), но ние гарантираме, че нищо не бие Varnish. Ето съвета: потърсете приставка за лак за вашата платформа. Дори и да струва (самият плъгин + изпълнението) ще видите, че си заслужава. Не е само Черният петък. Защо не искате 100ms време за реакция през цялата година?
Защо Лакът е толкова силен?
Лакът функционира като уеб сървър, като е първата точка за взаимодействие с посетителя. По принцип лакирайте „първо“ преди Apache/Nginx или който и да е уеб сървър, който използвате, и кешира всичко, което улови. По този начин много малко приложения в крайна сметка консумират ресурси (връзки с база данни и т.н.).
След инсталирането на Varnish той работи на порт 6081. По подразбиране трябва да го промените на порт 80, в противен случай губите цялото забавление. За да направите това, файлът/etc/default/varnish трябва да бъде модифициран. Използваме Debian, за CentOS или други дистрибуции, конфигурацията може да се различава.
Във файла по-горе ще намерите ред като:
Тук трябва да промените от -a: 6081 на -a: 80. Също така би било полезно да зададете TTL, като използвате параметъра -t. Следователно тази линия се превръща в нещо като:
Добре, сега, когато сме сменили порта във Varnish, ще трябва да сменим и порта на уеб сървъра. Използваме Apache, така че модифицираме файла /etc/apache2/ports.conf. Променяме линията Listen 80 на Listen 8080. Теоретично това е достатъчно, но зависи от това как сте настроили виртуалните хостове. Нека рестартираме Apache и след това Vanish.
Досега беше просто, но все още не е готово. Лакът работи, но най-вероятно не кешира нищо. Как да разберете дали да кеширате или не? Обновете страница 2-3 пъти. След това погледнете в Firebug/Developer tools.

Най-вероятно заглавката Age показва нула. Знак, че няма кеш.
Диетични проблеми?
Нещо важно да знаете: Лакът има проблем с тортите. Той няма да кешира страница, ако изпраща бисквитки. Освен това няма да кешира, ако сървърът изпрати заглавка Cache-Control със стойност без кеш. Нека да видим как решаваме тези проблеми.
Avanticart е написан на PHP, както повечето решения за електронна търговия с отворен код (или собственост), предлагани на пазара. Ако вашият магазин е написан на друг език, ние сме сигурни, че ще можете да намерите подобни решения.
По подразбиране PHP изпраща заглавка Cache-Control в момента, в който стартирате сесията. В Firebug/Developer tools можете да видите нещо като:
За да се отървете от него, просто извикайте session_cache_limiter (''); Преди session_start (); . Внимавайте как добавяте този код. Ако използвате платформа с отворен код, ще имате проблеми с бъдещото надстройване, ако промените директно изходния код. Можете да напишете приставка или да намерите настройка.
Сега, когато този проблем е решен, нека видим как го решаваме с бисквитки. Намерих интересни подробности на страницата Fastly. По принцип се правят поредица от трикове за изтриване на бисквитките и връщането им обратно под формата на заглавка. Файлът /etc/varnish/default.vcl трябва да бъде модифициран, за да покаже нещо като:
Смятаме, че коментарите в кода са достатъчни, но нека отбележим, че търсим сесийна бисквитка с името APP_SESSID_ (нещо). Тук ще трябва да промените името на бисквитката на вашата платформа.
Друго важно нещо, което трябва да се отбележи, е, че първата заявка, направена от посетител, винаги ще пристигне в магазина без кеширане. Това се прави, за да получите бисквитката на сесията.
В сравнение с версията, предложена от Fastly, добавихме и тази част в допълнение:
Тоест, не искаме да се кешираме, ако посетителят е на страницата за плащане, на страницата на акаунта или ако заявката е към .php файлове (обикновено заявки Ajax, тъй като повечето URL адреси са SEO-приятелски, така че не завършва с .php). Със сигурност имате страници, които не трябва да се кешират. Трябва да ги идентифицирате и съответно да модифицирате файла.
След като рестартирате Varnish и направите 2-3 заявки, трябва да видите заглавката с различна от нула Age в Firebug/Developer tools.
Ако стигнете тук и се отървете от диетичните си проблеми, поздравления, вашият Лак може да се напълни (създава корем - съжалявам - кеш). Ако заглавката Age все още показва нула, това означава, че нещо не е наред. Трябва да разрешите този проблем, преди да продължите.
Кой яде тортите?
Добре, сега кешът се създава, но въпреки това бисквитките не се връщат обратно в приложението на магазина. За това трябва да генерираме променливата $ _COOKIE от заглавката, зададена от Varnish.
И аз създадох тази функция:
Отново, внимавайте къде пишете/извиквате тази функция, за да избегнете проблеми с бъдещото ви надстройване.
Кошницата, както при кошницата?
Супер. Имаме кеш, имаме бисквитки. Остава само един проблем: той кешира цялата страница, включително частта от кода, която ви показва колко продукти имате в пазарската си кошница.
За да тествате, можете да отворите нов прозорец на браузъра частно/инкогнито. При второто опресняване (първото никога не се кешира, помните ли?) Ще видите кошницата в първия браузър.
Лакът ни дава специален етикет, който можем да вмъкнем на страницата. Така че там, където имаме пазарската количка, можем да въведем код като:
Когато Varnish види този код на страницата, отправя фонова заявка към файла /esi_shopping_cart.php, взема резултата и прекомпозира страницата, без посетителят да знае.
Тук не поставяме кода от /esi_shopping_cart.php, защото реализацията се различава от платформата до платформата, но може да бъде просто ехо за някои променливи на сесията.
За да работи ESI, трябва да забележите, че по-долу vcl_fetch поставям набора от редове beresp.do_esi = true; .
Добре, всичко върви перфектно, така че е време да извадите бирата от студа, нали? Не бързайте, досега това беше най-лесната част.
Този кеш трябва да бъде изчистен. Простият метод е да изчистите целия кеш, когато правите промени в магазина. Това не би било проблем в обикновен ден, но тук говорим за Черния петък. Ако започнете да изчиствате целия кеш за всяка команда, за да опресните запаса, ще имате проблем. В идеалния случай трябва да изчистите кеша само за продукта, чийто склад се е променил и евентуално страницата с категории за този продукт.
За да изчистите кеша, трябва да направите някои специални заявки (PURGE/BAN вместо GET/POST) към Varnish. Тези заявки могат да бъдат направени по няколко начина, а повече подробности могат да бъдат намерени в документацията. Предпочитаме да използваме BAN.
Тъй като в Avanticart имаме множество магазини на един и същ сървър, трябва да знаем от кой магазин искаме да изчистим кеша му. Затова използваме някои допълнителни заглавки (X-Ban-Host и X-Ban-Url). Трябва да модифицираме /etc/varnish/default.vcl, за да добавим поддръжка за изтриване + заглавки за настройка.
Тъй като тези заявки могат да идват отвсякъде, по-добре не позволявайте на никой да изчиства кеша си. Добавяме този ред в началото на файла:
След това модифицираме функцията vcl_recv, както следва:
Модифицираме функцията vcl_fetch, за да добавим специални заглавки:
И сега рестартираме Vanish, за да се възползваме от промените.
Тук имате функцията PHP, която се справя с изтриването:
Разбира се, когато и къде използвате тази функция е много важно и може да окаже влияние върху производителността. Регулярни изрази могат да бъдат дадени за $ url. По този начин, за да изчистим целия кеш, можем да извикаме clearVarnishCache ($ host, '. *');
Сега наистина е готово. Ако смятате, че сме пропуснали нещо, оставете ни коментар. И ако искате да получавате бъдещи статии за CDN и множество сървъри, абонирайте се.
един клиент беше засегнат от грешна настройка, която доведе до странно поведение на количката за пазаруване (Емилиян, извиняваме се отново).