Pomyślmy przez chwilę o sklepie internetowym jak o zwykłym sklepie. Co najczęściej robimy będąc w nim? Otóż najczęściej ( co za niespodzianka) oglądamy produkty. Na każdy zakupiony produkt przypada co najmniej kilka/kilkadziesiąt obejrzanych produktów. Kolejną sprawą, jaką trzeba mieć na uwadze to ilość oglądających osób. W osiedlowym sklepie zwykle mamy ich kiku-kilkanastu . W przypadku bardzo dużego liczba ta może być nawet trzycyfrowa. Natomiast w sklepie internetowym mogą ich być tysiące i nie jest to coś wyjątkowego. Na nasze szczęście wirtualny świat jest dużo pojemniejszy i nikt nie musi deptać sobie po nogach 🙂
Skoro więc zdecydowana większość akcji na naszym sklepie jest powtarzalna i ludzie oglądają te same produkty wiele razy, warto zadbać o cache. W przypadku Magento 2 rodzajów cache mamy wiele. W przypadku stron produktowych i klientów niezalogowanych, przyda się nam cache całych stron. Najlepiej tutaj sprawdza się Varnish, który posiada gotową konfigurację integracji z Magento 2 i można bardzo łatwo ją wygenerować i wyeksportować z panelu M2.
Z punktu widzenia systemowego wygląda to tak:
Aby zainstalować varnisha należy wykonać polecenie:
apt-get install varnish
apt-get install varnish
Domyślnie varnish działa na 2 portach
- 6081 – port na którym słucha strona. Będziemy chcieli to zmienić na port 80
- 6082 – port administracyjny. Możemy zostawić go tak jak jestapt-get install varnish
Zacznijmy od tego czemu chcemy zmienić domyślny port. Jak wspomniałem w poprzednim artykule port nasłuchuje na localhost i wpisujemy go w konfiguracje ngnixa w postaci linii :
proxy_pass http://127.0.0.1:80;
Jednak zmiana portu na port 80 (domyślny port HTTP) ma pewne zalety
- Narzędzia monitoringu lokalnego sprawdzają co jakiś czas stronę (czy to będzie munin czy wewn. narzędzie Magento 2 – sprawdza /pub/health_check.php). Daje nam to lepszy obraz działania strony.
- Na IP zewn. port 80 daje nam przekierowanie na HTTPS. W przypadku localhost takie przekierowanie nie ma sensu. Możemy przez to ominąć szyfrowanie na samej maszynie
- Zachowanie jednolitej konfiguracji portów. Tylko porty 80 (HTTP),443 (HTTPS) oraz 8080 (backend) są używane do komunikacji webowej i takie są wg standardów
Niestety w przypadku Varnisha konfiguracja portów jest lekko myląca. Przed powstaniem systemd (obecnego od Debiana 8), sprawa wyglądała prosto i plik konfiguracyjny znajdował się w /etc/default/varnish. Obecnie plik dalej istnieje, ale nie jest brany pod uwagę. Możemy go tam zostawić, usunąć albo zmienić porty w nim, aby uniknąć pomyłki w przyszłości. Zmieniamy więc:
DAEMON_OPTS="-a :6081 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"
na:
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"
Właściwy plik konfiguracyjny deamona varnisha znajdziemy w strukturze systemd (polecam zapoznanie się z samym systemd) – /lib/systemd/system/varnish.service
Tutaj musimy zmienić linijkę:
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a 127.0.0.1:6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
na:
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a 127.0.0.1:80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
Następnie musimy odświeżyć systemd poleceniem:
systemctl daemon-reload
Jeżeli myślimy o cachowaniu (nie znam odpowiednika tego słowa po polsku) powinniśmy pomyśleć co powinno być w pamięci, a co powinno iść prosto z php-fpm. Jak już wspomniałem na nasze szczęście Magento 2 tutaj robi robotę za nas. W panelu administracyjnym Magento 2 wchodzimy w zakładkę:
@page { margin: 2cm } p { margin-bottom: 0.25cm; line-height: 115% } a:link { so-language: zxx }
Sklepy→Koniguracja→Zaawansowane→System
W zakładce „Pamięć podręczna strony” wybieramy Varnish i upewniamy się, że mamy tak jak na screenie poniżej;
Następnie możemy wygenerować sobie plik konifuracyjny Varnisha w wersji 5. Warto lekko zmodyfikować ten plik dodając do sekcji backend default linijkę:
.connect_timeout = 60s;
Domyślnie Varnish ma tą wartość ustawioną na 3,5s (nie występuje to nigdzie w konfiguracji) przez co jeżeli będziemy wykonywać bardziej skomplikowane operacje na backendzie (masowe akcje) napotkamy na błąd 504 – Gateway Timeout
Otrzymanym plikiem zastępujemy plik /etc/varnish/default.vcl, a następnie restartujemy Varnish:
service varnish restart
W tym momencie nasz sklep powinien działać z pomocą Varnisha. Jeżeli chcemy zobaczyć szczegóły działania Varnisha możemy użyć polecenia:
varnishlog
lub:
varnishtop
Jeżeli z jakiegoś powodu musimy wyczyścić cache Varnisha (np. wrzucając plik weryfikacyjny googla) możemy to zrobić albo systemowo:
service varnish restart
Albo użyć czyszczenia cache z panelu administracyjnego Magento 2 bądź w konsoli za pomocą polecenia:
bin/magento cache:flush