WordPress i kłopoty z cache – rozwiązanie

Od pewnego czasu na blogu występuje problem. Objawia się on tym, że niektóre wpisy nie wyświetlają się w całości, są jakby obcięte. Zauważyłem to parę dni temu, ale wtedy uznałem za jednorazowy wybryk i machnąłem ręką. Po części zwaliłem sprawę na cache, bo jego wyczyszczenie pomogło. Po głowie jako przyczyna chodziło mi też coś w stylu DDoS, który po publikacji artykułu na blogu uprawiają serwery Mastodon. I zupełnie nie miałem czasu na analizę.

Jednak dotarły do mnie sygnały (dzięki!) o tym, że sprawa się powtarza, postanowiłem przyjrzeć się bliżej. Dziś wszedłem z telefonu na ten sam wpis i… problem wystąpił ponownie. Z racji pory dnia ruch powinien być niewielki, więc warunki do diagnostyki powinny sprzyjać.

Trzy słowa o setupie

Blog jest dumnie wspierany przez WordPress, wykorzystywany jest nginx oraz php-fpm 8.2. Do tego dość intensywnie korzystam z wtyczek do WordPress. W szczególności do różnych optymalizacji i cache, co raczej nie ułatwi diagnostyki. Dużo elementów ruchomych, ingerencja w treść serwowanej występuje w wielu miejscach.

Wspomniałem o pluginie do cache jako jednym z podejrzanych. Konfiguracja Cache Enabler wygląda następująco:

Konfiguracja Cache Enabler
Screenshot konfiguracii Cache Enabler

Objawy i logi

Obcięty wpis wygląda tak:

Ucięty wpis na blogu
Screenshot uciętego wpisu

Cache był wygenerowany o 07:48 i pokrywa się to z czasem wejścia z telefonu widocznym w access.log.

drwxr-xr-x 2 www-data www-data 4096 Sep 24 07:48 pentagram-cerberus-p6361-rzut-okiem-na-bezpieczenstwo

W logu php-fpm nic specjalnego. Chwilę wcześniej widać raczej nie mogące mieć wpływu

[24-Sep-2023 07:44:23] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 1 idle, and 10 total children
[24-Sep-2023 07:44:27] WARNING: [pool www] child 20688 exited on signal 9 (SIGKILL) after 33847.200506 seconds from start
[24-Sep-2023 07:44:27] NOTICE: [pool www] child 25769 started

Diagnostyka

Problem występował na różnych przeglądarkach, także w trybie prywatnym. Zarówno na desktopie, jak i mobile. Sprawdzenie wersji zapisanej w cache pokazało, że jest ona błędna. Dobry znak, bo raczej można wykluczyć wpływ JSów. Były one podejrzane, bo wprawne oko dostrzeże, że polecenie curl przechodzi w pewnym momencie w kod źródłowy strony związany ze skryptem od statystyk Matomo.

Udało mi się ustalić, że wyczyszczenie cache pomaga, ale… tylko na pierwsze wyświetlenie. Kolejne wyświetlenia są już błędne. Sam problem występował niezależnie od obsługi JS. Czy to Firefox, czy links2, czy lynx – pierwsze wyświetlenie było poprawne, kolejne błędne.

Na pierwszy ogień poszły więc ustawienia wtyczki robiącej cache. W Minify HTML in cached pages including inline CSS and JavaScript wyłączyłem miniaturyzację CSS i JS. Nie pomogło.

Natomiast zupełne wyłączenie tej opcji jak najbardziej pomogło. Winnym okazała się zatem jedna z opcji wtyczki Cache Enabler w wersji 1.8.13. Takie tam ryzyka optymalizacji. Zgłosiłem problem na GitHub i zobaczymy co będzie dalej.

Rzuciłem jeszcze okiem na przyczynę. Prawdopodobnie chodzi o niepoprawne, zachłanne parsowanie komentarzy. Obcięcie następuje po pierwszym znaku *.
Gecko/20100101 Firefox/60.0' -H $'Accept: */*' -H $'Accept-Language: en-US,en;q=0.5'
natomiast linia bezpośrednio przed tym, co się zaczyna pojawiać, wygląda tak:
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */

WordPress antyspam

Po raz kolejny musiałem zająć się problemem spamu w komentarzach na blogu. Przesiadka na hCaptcha pomogła na dłuższy czas, ale pod koniec lipca zabezpieczenie przestało działać[1]. Chwilę po tym, jak pojawiły się pierwsze komentarze, które przeszły hCaptcha, ruszyła lawina. Może raczej lawinka, bo 1-2 spamy dziennie to niewiele. Tak czy inaczej, wygląda, albo że spamerzy, że spamerzy szybko się uczą, albo mają bazę, który blog jaką ma captchę[2], albo hCaptcha istotnie się pogorszyła, albo ilość prób wzrosła na tyle, że coś się zaczęło przebijać[3]. A może wręcz znaleziono sposób na jej omijanie? Tematyka i języki różne, bez ładu i składu. Jedyne co pamiętam, to że zaczęło się od Azji, konkretnie pierwsze spamy wysłane w tej serii do mojego WordPressa były po… wietnamsku.

Garść statystyk

Zamieściłem statystyki poprzednio, więc zrobię to i teraz. Pomiędzy 20.06.2021 a 23.07.2022 zupełny brak spamu. W okresie od 23.07.2022 do 08.11.2022 73 sztuki. W 108 dni średnio 0,67 spamu na dobę. OK, to nie 1-2 dziennie, ale nadal sporo.

CAPTCHA

Moją pierwszą reakcją było zwiększenie trudności w panelu hCaptcha. Z najniższej na średnią. Niestety, nie zauważyłem spodziewanego efektu. Rozważam jeszcze powrót do reCAPTCHA. Jeśli spamerzy faktycznie mają bazę z typem zabezpieczeń na danym blogu, to taka zmiana może nieco popsuć szyki. Niemniej, skoro kiedyś nie dawała rady, to czemu teraz miałaby pomóc? Inna opcja to zwiększenie trudności do maksimum. Tylko to utrudni też życie zwykłym czytelnikom, a tego nie chcę.

Blokowanie IP

Zauważyłem, że IP z których zamieszczany jest spam w komentarzach, są raczej wątpliwej reputacji. Zatem kolejnym krokiem, połączonym z migracją hostingu, było zablokowanie na iptables z wykorzystaniem ipset tych IP, które są listowane w wybranych listach projektu firehol. Nieco pomogło na spam, zdecydowanie nie całkowicie. Ale i tak gorąco polecam to rozwiązanie, bo ilość ruchu z tych IP jest całkiem spora[4]. Niczego pozytywnego ze strony botnetów, open proxy itp. wynalazków się nie spodziewam, więc czemu nie zablokować?

Wtyczki

Skoro wycinanie IP nie pomogło, to pora sięgnąć po broń ostateczną. Tu jest WordPress, tu się instaluje wtyczki! Wtyczek obiecujących rozwiązanie spamu w komentarzach jest dla WordPressa sporo.

Akismet

Ponieważ kolejny raz polecono Akismet w komentarzach wpisu, więc zacząłem od niego. Pamiętam, że kiedyś już się przymierzałem do tego rozwiązania i odrzuciłem je. Po pierwsze, wymaga założenia osobnego konta. To mógł być wtedy wystarczający powód do odrzucenia. Po drugie, Akismet jest płatny. Tzn. teoretycznie jest pay what you want, ale nie da się zapłacić $0, jeśli ma się jakiekolwiek reklamy na blogu. Zaś what you want to minimum $1 miesięcznie. Tak się składa, że na niektórych stronach mam reklamy. Przynoszą grosze, ale są, a zakładanie konta, podawanie karty kredytowej to trochę za dużo, żeby przetestować rozwiązanie. Poza tym, skończyło by się tak, że wyświetlam reklamy, aby zapłacić za wtyczkę blokującą spam. Za którą muszę płacić, bo mam reklamy.

Antispam Bee

Kolejna popularna wtyczka antyspamowa dla WordPressa to Antispam Bee. Jest darmowa, wygląda sensownie, ma sporo więc dostała szansę. Trochę zdziwiło mnie działanie. Po włączeniu chciałem przetestować, wysłałem komentarz i… bez zmian, trafił od razu do moderacji, bez żadnych oznaczeń. Aż zwątpiłem, czy wtyczka działa przed moderacją, czy po. Jednak pierwszy spam pokazał, że wtyczka działa. Przed moderacją, a wykryty spam już nie niepokoi moderatora. Gdybym nie włączył powiadomień mailem, to bym nie zauważył. Znaczy pełen automat. Potrzeba trochę czasu, by ocenić skuteczność, ale wygląda obiecująco.

[1] Być może ma to jakiś związek ze zmianą hostingu, która koreluje czasowo. Tylko to mogłoby tłumaczyć jedynie znalezienie bloga, nie działanie zabezpieczeń.
[2] Tylko wtedy szkoda, że chyba nie ma w tej bazie pola „ręczna moderacja komentarzy, odpuść sobie”.
[3] Już po napisaniu tego wpisu zrobiłem szybką analizę i faktycznie, z ruchu wytypowanego jako boty zamieszczające spam, 95% dostaje HTTP status code 400. Pozostałe 5% dostaje 200.
[4] Aktualnie korzystam z dwóch list: stopforumspam oraz blocklist.net.ua. Kompromis między ilością IP (ok. 300 tys.), a efektem. Może się zmieniać, bo dodanie kolejnej listy jest trywialne.

VSCodium na Debianie

Jak pisałem wcześniej, nadchodzi koniec edytora Atom. Z pewnych względów, na maszynie służbowej i tak zacząłem korzystać z Visual Studio Code . Dlatego postanowiłem przyspieszyć proces migracji także na prywatnej maszynie. VSC nie było złe, więc zgodnie z zapowiedzią dałem szansę VSCodium.

Czym jest VSCodium?

VSCodium to fork microsoftowego Visual Studio Code, zbudowany z otwartego kodu źródłowego, dostępny na wolnej licencji. Dodatkowo pozbawiony dodatków od Microsoft służących do zbierania telemetrii/śledzenia. Poza tym, wszystko powinno działać tak samo.

VSCodium logo
Źródło: https://vscodium.com/

Instalacja VSCodium

Na początek instalacja pod Debianem. Z tego co widzę, na Ubuntu będzie identycznie. Szczęśliwie dostępne jest repozytorium pakietów deb. Skorzystałem z opisu instalacji spod tego linka: https://www.linuxcapable.com/how-to-install-vscodium-on-debian-11-bullseye/. Wersja skrócona poniżej.

Dodajemy klucz GPG do zaufanych:

curl https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | gpg --dearmor > /etc/apt/trusted.gpg.d/vscodium.gpg

Dodajemy źródło pakietów:

echo "deb https://download.vscodium.com/debs vscodium main" > /etc/apt/sources.list.d/vscodium.list

Po tym zostaje już tylko aktualizacja danych o repozytoriach i instalacja pakietu codium:

apt update; apt install codium

Wtyczki z marketplace

Nieprzypadkowo napisałem, że wszystko powinno działać tak samo. Słowo powinno powinno dać do myślenia. Otóż po instalacji pozwoliłem sobie „ściągnąć” konfigurację, a w zasadzie używane wtyczki, z marketplace od kolegi z pracy, korzystającego z VSC. Mocno się zdziwiłem, bo większość potrzebnych wtyczek, tych od Microsoft, nie była w VSCodium dostępna do instalacji. Nie drążyłem wtedy tematu i po prostu zainstalowałem VSC.

Jednak po szybkim zbadaniu tematu okazuje się, że nie ma najmniejszego problemu z korzystaniem z marketplace Microsoft w VSCodium. Zgodnie z tym, co piszą w dokumentacji, wystarczy w pliku

~/.config/VSCodium/product.json

dodać stosowną zawartość, czyli:

{
  "extensionsGallery": {
    "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery",
    "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index",
    "itemUrl": "https://marketplace.visualstudio.com/items",
    "controlUrl": "",
    "recommendationsUrl": ""
  }
}

I możemy cieszyć się dostępem do wtyczek zupełnie jak w Visual Studio Code.

Wtyczki

Nie ukrywam, że bardziej podobało mi się działanie wtyczek w Atomie. Na przykład isort wywołany tamże po prostu sortował wszystkie importy. W przypadku VSC nie ma tak dobrze. Z tego co udało mi się znaleźć, można „naprawić” pojedynczy import.

Istnieje obejście, które jest podpowiadane w opisie konfiguracji wtyczki, czyli dodanie do settings odpowiedniej sekcji. Jest to nieco nieintuicyjne, bo w czytamy to będąc w… ustawieniach, czyli settings. Chodzi jednak o inne settings. Jak znalazłem pod tym linkiem, trzeba zmienić zawartość pliku

~/.config/Code/User/settings.json

Na razie tyle. Z doświadczeń w pracy wynika, że spokojnie da się żyć z VSC zamiast Atoma. Na razie pracuje mi się w VSC gorzej, ale raczej chodzi o drobną zmianę przyzwyczajeń i dokładniejsze poznanie nowego programu. Z wyboru zamiennika jestem wstępnie zadowolony.