Blog

Statički sajtovi ostaju aktivni dok se ponovo objavljuju

Ponovno objavljivanje statičkog sajta na Mythexu nekada je prvo brisalo žive fajlove, pa tek onda uploadovalo novi build. Za vrijeme uploada neki posjetioci dobijali su stranicu 404 ili stranicu čiji skriptovi nedostaju. Neuspjeli upload mogao je ostaviti sajt prazan ili napola nov. Sada se novi build piše preko starog, stranice se šalju posljednje, a ostaci se uklanjaju nekoliko minuta kasnije. Druga popravka čini da se ponovno objavljivanje vidi u roku od nekoliko sekundi umjesto minute, ili, za fajlove kao što je logo, do jednog dana.

Kako se statički sajt servira

Statički sajt je onaj koji je samo skup fajlova: HTML stranice, JavaScript, CSS, slike. Kada ga objavite na Mythexu, mi ga izgradimo, uploadujemo rezultat u objektni storage u folderu vašeg sajta i servirate ga kroz edge mrežu, servere blizu posjetilaca koji dohvataju fajlove iz storagea i čuvaju njihove kopije neko vrijeme. (Ako ste novi u ovome, naš vodič o šta je CDN objašnjava ideju.)

Dvije stvari su bile pogrešne: redoslijed kojim ponovno objavljivanje mijenja fajlove i koliko dugo se čuvaju stare kopije.

Problem 1: upload je prvo ispraznio sajt

Ponovno objavljivanje je obrisalo sve u folderu sajta, pa uploadovalo novi build. Za cijelo vrijeme uploada, 12 sekundi za sajt od 250 fajlova u našem lokalnom testu, posjetilac čiji zahtjev nije već bio keširan na edgeu dobijao je 404, ili HTML stranicu čiji skriptovi vraćaju 404.

Neuspjeli upload bio je još gori. Folder je već bio prazan, a na jednoj od dvije putanje uploada novi index.html mogao je da se pojavi prije fajla koji je pao. Objava prijavljena kao neuspješna mogla je ostaviti napola nov sajt uživo.

Popravka: piši preko, stranice posljednje, čišćenje kasnije

  1. Ne brišite prvo. Novi build se uploaduje preko starog.
  2. Prvo assets, pa stranice. Stranica imenuje skriptove i stilove koji su joj potrebni, pa stranice idu posljednje. Dok nove stranice ne stignu, posjetioci dobijaju stari page, koji imenuje stare assets, a oni su još tu. Kada stignu, novi assets na koje se pozivaju već su na mjestu.
  3. Ostatke uklonite kasnije. Prije uploada popišemo šta sajt sadrži. Tri minute nakon uspješnog uploada, sve s tog popisa što novi build nije prepisao se briše. Tri minute je duže od 60 sekundi koliko stranica može biti keširana na edgeu i u pregledaču, pa posjetilac koji još drži stari page može naći assets na koje se on poziva.
  4. U slučaju sumnje, ne brišite ništa. Ako popis prije uploada ne uspije, ništa se ne čisti. Ostaci nisu štetni, a sljedeće objavljivanje ih čisti. Brisanje bez znanja šta je tu bilo je način da sajt završi prazan.

Neuspjeli upload sada ostavlja prethodni sajt tačno onakvim kakav je bio.

Testirali smo ovo od kraja do kraja lokalno, koristeći pravu skriptu za upload, pravu upload rutu i posluživanje storagea, uz posjetioce s hladnim edge keš memorijom. Sa starim kodom, 55 od 91 posjeta bilo je pokvareno tokom ponovnog objavljivanja, a 61 od 92 tokom neuspjelog. Sa novim kodom, 0 je bilo pokvareno u otprilike 3.500 posjeta, koje su pokrivale oba puta uploada, neuspjeli upload i objavljivanje nakon njega, a obrisani su tačno ostaci koji su trebali biti obrisani.

Problem 2: ponovno objavljivanje se predugo prikazivalo

Čak i kada je upload prošao dobro, promjene su se sporo pojavljivale. Edge je držao kopiju stranice 60 sekundi, a svakog drugog fajla jedan dan, i to je govorio i pregledačima. Fajlovi s fiksnim imenom, kao što su logo.png, font ili bilo šta iz foldera public/, mogli su prikazivati staru verziju do jednog dana nakon ponovnog objavljivanja.

Popravka: kopije fajlova pod oznakom builda

Kada edge od našeg API-ja pita gdje sajt živi, odgovor sada uključuje marker builda koji se mijenja svaki put kada objavljivanje uspije. Edge svoje kopije vodi pod tim markerom. Objavljivanje tako postaje potpuno novi skup ključeva keša čim istekne edgeova 30-sekundna provjera. Stari primjerci se jednostavno više ne nalaze, pa edge može čuvati kopije do jednog dana, a da ikada ne posluži onu koja je zamijenjena nakon objavljivanja.

Pregledači dobijaju dva različita pravila:

  • Hashirani izlaz builda, fajlovi kao assets/index-CzLcxDO8.js čije se ime mijenja kad se promijeni sadržaj, kešira se godinu dana i označen je kao immutable. Pod tim imenom nikada ne može biti zastarjelo.
  • Sve ostalo, stranice i fajlovi s fiksnim imenom kao logo, označeno je no-cache, što znači „provjeri prije upotrebe“. Ako se ništa nije promijenilo, odgovor je mali 304 Not Modified bez tijela, jer sada poštujemo provjeru pregledača If-None-Match.

Razlikovanje ova dva zahtijeva pažnju: fajl kopiran iz public/assets/ zadržava svoje ime, a keširanje assets/logo.png na godinu dana zakucalo bi stari logo na godinu dana. Zato se fajl smatra hashiranim samo ako je u folderu izlaza builda i ako njegovo ime ima segment koji izgleda kao hash, a ne kao obična riječ.

Lokalno su nova stranica i logo bili vidljivi 6 sekundi nakon što je objavljivanje uživo. Ranije je to bilo 60 sekundi za stranicu i jedan dan za logo.

Dvije manje popravke usput

  • Prazne stranice iz HEAD zahtjeva. HEAD zahtjev traži zaglavlja stranice bez tijela. Keširali smo te prazne odgovore, pa je sljedeći posjetilac te stranice dobijao praznu stranicu. HEAD odgovori se više ne keširaju.
  • Prava stranica za „nema ničeg ovdje“. Adresa bez aplikacije ranije je dobijala običan tekst „This published app is offline or the link was not found“ s kodom greške 502. Sada dobija pravu stranicu, „There's no app here“, sa statusom 404 i linkom nazad na Mythex za vlasnika. Nepoznate prilagođene domene dobijaju istu stranicu.

Šta smo iz toga izvukli

  • Redoslijed je dio ispravnosti. Isti fajlovi uploadovani drugim redoslijedom razlika su između pokvarenog i radnog sajta.
  • Brišite kasnije, i samo ono što znate. Čišćenje pomoću popisa uzetog prije uploada je sigurno; pražnjenje foldera i nadanje da će upload završiti nije.
  • Keširajte po verziji, a ne po vremenu. Vremena isteka su pretpostavka o tome kada se sadržaj mijenja. Ključ koji se mijenja s buildom je činjenica.

Povezano: vaša objavljena aplikacija sada ostaje aktivna dok je ponovno objavljujete. Više o objavljivanju u dokumentaciji.

Mythex · Pricing · Izradite bilo šta uz AI · Šabloni za web stranice i aplikacije · Mythex u poređenju · Rječnik izrade aplikacija uz AI · Besplatni alati za izradu aplikacija uz AI · English

English አማርኛ العربية Български বাংলা Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)