Vymazaním vyrovnávacej pamäte NGINX sa do denníka chýb vložia kritické chyby pri odpájaní
Publikované: 15. februára 2025 o 11:24:55 UTC
Tento článok vysvetľuje, ako odstrániť položky z vyrovnávacej pamäte NGINX bez toho, aby boli vaše protokolové súbory preplnené chybovými správami. Hoci to nie je všeobecne odporúčaný prístup, môže byť užitočný v niektorých okrajových prípadoch.
Deleting NGINX Cache Puts Critical Unlink Errors in Error Log
Informácie v tomto príspevku sú založené na ukladaní do vyrovnávacej pamäte FastCGI na NGINX 1.4.6 spustenom na serveri Ubuntu 14.04 x64. Môže a nemusí platiť pre iné verzie.
(Aktualizácia 2025: V čase medzi napísaním pôvodného príspevku a teraz sa toho veľa zmenilo. Servery sú rýchlejšie a lacnejšie, takže v skutočnosti neodporúčam postup opísaný v tomto príspevku, kde sa snažím mikrospravovať expiráciu vyrovnávacej pamäte, len aby som ušetril niekoľko ďalších generácií dynamického obsahu. Obsah tu nechám pre budúce použitie a pre prípad, že by ho niekto skutočne potreboval z akéhokoľvek dôvodu. Ale v aktuálnych verziách som to nepotvrdil, že to stále funguje. robí).
Po migrácii niekoľkých stránok z Apache na NGINX som si veľmi obľúbil jeho vstavané možnosti ukladania do vyrovnávacej pamäte, ktoré vo väčšine prípadov fungujú veľmi dobre bez toho, aby som do toho zasahoval.
Pre jednu z lokalít som však skutočne potreboval možnosť vymazať vyrovnávaciu pamäť (úplne aj odstrániť jednotlivé položky). Bezplatná komunitná edícia NGINX podporuje iba vypršanie platnosti vyrovnávacej pamäte na základe času (tj môžete ju nastaviť tak, aby skontrolovala, či sa niečo zmenilo po hodine, dni atď.). Čo ak však neexistuje spoľahlivý spôsob, ako vopred určiť, kedy sa určitý zdroj zmení? Napríklad netuším, či uplynie hodina, deň alebo rok, kým sa vrátim a upravím niečo v tomto príspevku – a prečo ukladať do vyrovnávacej pamäte iba hodinu, ak by ukladanie do vyrovnávacej pamäte na deň bolo v poriadku?
Tu je potrebná možnosť manuálneho vymazania vyrovnávacej pamäte (alebo tak, že vaša webová aplikácia upozorní NGINX, že by sa malo niečo vyčistiť). Ľudia za NGINX sú si jasne vedomí tejto potreby, pretože táto funkcia je podporovaná v platenej verzii ich produktu – no hoci sú určite oprávnení nastaviť si licencovanie ľubovoľným spôsobom, cena je pre mňa trochu vysoká, keď je táto funkcia jedinou platenou funkciou, ktorú skutočne potrebujem.
Našťastie sa ukázalo, že môžete vymazať súbory z adresára vyrovnávacej pamäte sami a NGINX sa toho chopí a bez problémov získa novú kópiu z vášho back-endu. Ak to však urobíte bez vyladenia konfigurácie, pravdepodobne po chvíli uvidíte v protokole chýb množstvo správ podobných tejto:
Zdá sa, že tieto chyby sa vyskytujú, keď sa NGINX sám pokúsi vymazať záznamy z vyrovnávacej pamäte po čase určenom neaktívnym parametrom direktívy fastcgi_cache_path . Predvolená hodnota je iba 10 minút, ale môžete ju nastaviť na ľubovoľnú hodnotu. Ak ho nastavíte napríklad na 10 rokov, je pravdepodobne nepravdepodobné, že ste medzitým server nereštartovali, takže index kľúča v pamäti by bol medzitým vymazaný. Ak to urobíte, musíte sa uistiť , že vymažete vyrovnávaciu pamäť sami, NGINX to už nebude robiť za vás.
Považujem za naozaj zvláštne, že za kritickú chybu sa považuje, že záznam z vyrovnávacej pamäte nemožno odstrániť, pretože neexistuje. Skutočnosť, že klasifikácia jeho závažnosti je taká vysoká, znamená, že sa ho nemožno zbaviť iba ignorovaním záznamov denníka pod určitou hranicou. Hneď ako sa z back-endu stiahne nová kópia, záznam bude znova existovať, takže podľa môjho názoru by to malo byť nanajvýš varovanie.
Ak by sa záznam z vyrovnávacej pamäte nedal odstrániť kvôli problémom s povoleniami alebo niečomu tretiemu, bola by to kritická chyba, pretože by to mohlo spôsobiť, že NGINX bude pokračovať v poskytovaní obsahu uloženého vo vyrovnávacej pamäti dlho po uplynutí doby platnosti, ale zdá sa, že proces čistenia tento rozdiel nerozlišuje.