Statički sajtovi sada ostaju aktivni dok se ponovo objavljuju
Ponovno objavljivanje statičkog sajta na Mythexu nekad je prvo brisalo žive fajlove, pa tek onda slalo novi build, tako da su neki posetioci za vreme slanja dobijali stranicu 404 ili stranicu čije skripte nisu postojale. Neuspelo slanje moglo je da ostavi sajt prazan ili napola nov. Sada se novi build upisuje preko starog, stranice se šalju poslednje, a ostaci se uklanjaju nekoliko minuta kasnije. Druga ispravka čini da se ponovno objavljivanje vidi za nekoliko sekundi umesto za minut — ili, za fajlove kao što je logo, do jednog dana.
Kako se služi statički sajt
Statički sajt je onaj koji se sastoji samo od fajlova: HTML stranica, JavaScript, CSS i slike. Kada ga objavite na Mythexu, mi ga izgradimo, otpremimo rezultat u objektno skladište u fascikli za vaš sajt i poslužujemo ga preko mreže za isporuku sadržaja — servera blizu vaših posetilaca koji preuzimaju fajlove iz skladišta i neko vreme čuvaju njihove kopije. (Ako ste novi u ovome, naš vodič o tome šta je CDN objašnjava ideju.)
Dve stvari su bile pogrešne: redosled kojim je ponovno objavljivanje menjalo fajlove i koliko su dugo stare kopije čuvane.
Problem 1: otpremanje je prvo praznilo sajt
Ponovno objavljivanje je obrisalo sve u fascikli sajta, pa tek onda otpremilo novi build. Dokle god je otpremanje trajalo — 12 sekundi za sajt od 250 fajlova u našem lokalnom testu — posetilac čiji zahtev nije već bio keširan na ivici dobijao je 404, ili HTML stranicu čije su skripte vraćale 404.
Neuspelo otpremanje bilo je još gore. Fascikla je već bila prazna, a na jednoj od dve putanje otpremanja novi index.html mogao je da se pojavi pre fajla koji je otkazao. Objava prijavljena kao neuspela mogla je da ostavi napola nov sajt uživo.
Ispravka: upisati preko, stranice poslednje, ostatke kasnije ukloniti
- Ne brisati prvo. Novi build se otprema preko starog.
- Fajlovi pre stranica. Stranica imenuje skripte i stilove koji su joj potrebni, pa stranice idu gore poslednje. Dok nove stranice ne stignu, posetioci dobijaju staru stranicu, koja imenuje stare fajlove, a oni su i dalje tu. Kada stignu, novi fajlovi koje imenuju već su na mestu.
- Ostatke ukloniti kasnije. Pre otpremanja beležimo od čega se sajt sastoji. Tri minuta nakon uspešnog otpremanja briše se sve sa tog spiska što novi build nije prepisao. Tri minuta duže je od 60 sekundi koliko stranica može biti keširana na ivici i u pregledaču, pa posetilac koji još drži staru stranicu može da nađe fajlove koje ona imenuje.
- Ako niste sigurni, ništa ne brišite. Ako spisak pre otpremanja ne uspe, ništa se ne čisti. Ostaci fajlova ne prave štetu, a sledeće ponovno objavljivanje ih očisti. Brisanje bez znanja šta je tu bilo jeste način da sajt ostane prazan.
Neuspelo otpremanje sada ostavlja prethodni sajt tačno onakvim kakav je bio.
Ovo smo testirali od kraja do kraja lokalno, koristeći pravu skriptu za otpremanje, pravu rutu za otpremanje i posluživanje iz skladišta, uz posetioce koji dolaze sa hladnom keš-memorijom na ivici. Sa starim kodom, 55 od 91 poseta bilo je pokvareno tokom ponovnog objavljivanja, a 61 od 92 tokom neuspelog. Sa novim kodom, 0 je bilo pokvareno u otprilike 3.500 poseta koje su pokrivale obe putanje otpremanja, neuspelo otpremanje i objavu posle njega — i tačno su uklonjeni ostaci fajlova koje je trebalo ukloniti.
Problem 2: ponovno objavljivanje se prikazivalo predugo
Čak i kada je otpremanje prošlo dobro, promene su se sporo pojavljivale. Ivica je čuvala kopiju stranice 60 sekundi, a svakog drugog fajla jedan dan, i to su govorila i pregledačima. Fajlovi sa fiksnim imenom — logo.png, font, bilo šta iz fascikle public/ — mogli su da pokazuju staru verziju i do jednog dana posle ponovnog objavljivanja.
Ispravka: kopije fajlova pod oznakom builda
Kada ivica pita naš API gde sajt živi, odgovor sada uključuje oznaku builda koja se menja pri svakoj objavi. Ivica svoje kopije vodi pod tom oznakom. Objava zato postaje potpuno novi skup ključeva keša čim istekne 30-sekundna provera na ivici. Stare kopije se jednostavno više nikad ne nalaze, pa ivica može da čuva kopije jedan dan a da nikada ne posluži kopiju posle objave koja ju je zamenila.
Pregledači dobijaju dva različita pravila:
- Heširani izlaz builda — fajlovi poput
assets/index-CzLcxDO8.js, čije se ime menja kad se menja sadržaj — kešira se godinu dana i označava se kao nepromenljiv. Pod tim imenom nikad ne može biti zastareo. - Sve ostalo — stranice i fajlovi sa fiksnim imenom poput logoa — označeno je sa
no-cache, što znači „proveri pre upotrebe”. Ako ništa nije promenjeno, odgovor je mali304 Not Modifiedbez tela, sada kada poštujemo proveruIf-None-Matchiz pregledača.
Razlikovanje ova dva slučaja traži pažnju: fajl kopiran iz public/assets/ zadržava sopstveno ime, a keširanje assets/logo.png na godinu dana zadržalo bi stari logo godinu dana. Zato fajl računamo kao heširan samo ako se nalazi u fascikli izlaza builda i ako njegovo ime ima segment koji liči na heš, a ne na običnu reč.
Lokalno su nova stranica i logo bili vidljivi 6 sekundi nakon što je objava postala aktivna. Ranije je to bilo 60 sekundi za stranicu i jedan dan za logo.
Dve manje ispravke usput
- Prazne stranice iz HEAD zahteva.
HEADzahtev traži zaglavlja stranice bez tela. Keširali smo te prazne odgovore, pa je sledeći posetilac te stranice dobijao praznu stranicu.HEADodgovori se više ne keširaju. - Prava stranica za „ovde nema ničega”. Adresa bez aplikacije ranije je dobijala običan tekst „Ova objavljena aplikacija je isključena ili link nije pronađen” sa kodom greške 502. Sada dobija pravu stranicu, „Ovde nema aplikacije”, sa statusom 404 i povratkom na Mythex za vlasnika. Nepoznati prilagođeni domeni dobijaju istu stranicu.
Šta smo iz ovoga izvukli
- Redosled je deo ispravnosti. Isti fajlovi otpremljeni drugim redom razlika su između pokvarenog i radnog sajta.
- Brišite kasno, i samo ono što znate. Uklanjanje prema spisku uzetom pre otpremanja je bezbedno; pražnjenje fascikle i nada da će otpremanje završiti nije.
- Keširajte po verziji, ne po vremenu. Vremena isteka su pretpostavka o tome kada se sadržaj menja. Ključ koji se menja sa buildom je činjenica.
Povezano: vaša objavljena aplikacija sada ostaje aktivna dok je ponovo objavljujete. Više o objavljivanju u dokumentaciji.