Brisanje NGINX keša stavlja kritične greške u dnevnik grešaka
Objavljeno: 15. februar 2025. u 11:26:59 UTC
Ovaj članak objašnjava kako izbrisati stavke iz NGINX-ovog keša bez da vaše datoteke dnevnika budu pretrpane porukama o greškama. Iako nije općenito preporučen pristup, može biti koristan u nekim rubnim slučajevima.
Deleting NGINX Cache Puts Critical Unlink Errors in Error Log
Informacije u ovom postu su zasnovane na FastCGI keširanju na NGINX 1.4.6 koji radi na Ubuntu Serveru 14.04 x64. Može ili ne mora vrijediti za druge verzije.
(Ažuriranje 2025: U vremenu između što sam napisao originalni post i sada, mnogo toga se promijenilo. Serveri su brži i jeftiniji, tako da u stvari ne bih preporučio pristup opisan u ovom postu gdje pokušavam mikro-upravljati istekom keša samo da sačuvam nekoliko dodatnih generacija dinamičkog sadržaja. Ostavit ću sadržaj ovdje za buduću upotrebu i u slučaju da ga netko stvarno zatreba iz bilo kojeg razloga. Nisam potvrdio da ovo još uvijek radi za trenutne verzije NGINX-a, ali mislim da radi).
Nakon migracije nekoliko sajtova sa Apachea na NGINX, veoma sam zavolio njegove ugrađene mogućnosti keširanja, koje rade izuzetno dobro u većini slučajeva bez mnogo mešanja od mene.
Međutim, za jedan od sajtova, stvarno mi je trebala mogućnost da očistim keš (i potpuno i uklonim pojedinačne unose) sam. Besplatno zajedničko izdanje NGINX-a podržava samo vremenski zasnovan istek keša (tj. možete ga podesiti da provjeri da li se nešto promijenilo nakon sata, dana, itd.). Ali šta ako ne postoji pouzdan način da se unaprijed odredi kada će se određeni resurs promijeniti? Na primjer, nemam pojma da li će proći sat, dan ili godinu dana prije nego što se vratim i uredim nešto u ovom postu - i zašto keširati samo sat vremena ako bi keširanje na jedan dan bilo u redu?
Ovo je mjesto gdje je potrebna mogućnost ručnog brisanja keša (ili tako što će vaša web aplikacija obavijestiti NGINX da nešto treba očistiti). Ljudi koji stoje iza NGINX-a su jasno svjesni potrebe za ovim jer je funkcija podržana u plaćenoj verziji njihovog proizvoda - ali iako oni sigurno imaju pravo da postave svoje licenciranje kako god žele, cijena je malo visoka za mene kada je ova funkcija jedina plaćena funkcija koja mi je stvarno potrebna.
Srećom, ispostavilo se da možete sami izbrisati datoteke iz direktorija keša i NGINX će to pokupiti i dohvatiti novu kopiju iz vašeg back-enda bez problema. Međutim, ako to uradite bez podešavanja konfiguracije, vjerovatno ćete nakon nekog vremena vidjeti cijelu gomilu poruka sličnih ovoj u vašem dnevniku grešaka:
Čini se da se ove greške javljaju kada NGINX sam pokušava izbrisati keš unose nakon vremena određenog neaktivnim parametrom fastcgi_cache_path direktive. Podrazumevano za ovo je samo 10 minuta, ali možete ga podesiti na bilo koju vrijednost koju želite. Ako ga podesite na, recimo, 10 godina, vjerovatno je malo vjerovatno da niste ponovo pokrenuli server u međuvremenu, tako da bi ključni indeks u memoriji bio obrisan u međuvremenu. Ako to učinite, trebate li se pobrinuti da sami očistite keš, NGINX to više neće raditi umjesto vas.
Smatram da je stvarno čudno da se smatra kritičnom greškom da se keš unos ne može obrisati jer ne postoji. Činjenica da je njegova klasifikacija ozbiljnosti tako visoka znači da je nemoguće riješiti se samo ignoriranjem unosa dnevnika ispod određenog praga. Čim se nova kopija dohvati iz pozadine, unos će ponovo postojati, tako da bi ovo trebalo biti upozorenje u najboljem slučaju, po mom mišljenju.
Sada, ako se keš unos ne može obrisati zbog problema sa dozvolama ili nečim trećim, to bi bila kritična greška, jer bi to moglo učiniti da NGINX nastavi da služi keširani sadržaj dugo nakon isteka, ali proces čišćenja izgleda da ne pravi ovu razliku.