Τι περιλαμβάνει
Επτά συστήματα, εξηγημένα μηχανισμό προς μηχανισμό.
Όλα όσα ακολουθούν υπάρχουν ήδη στην επέκταση, σήμερα. Τίποτα εδώ δεν είναι σχέδιο για το μέλλον και κανένας αριθμός δεν μπαίνει αν δεν στέκει — απλώς τι κάνει το κάθε κομμάτι και πώς το κάνει.
7 συστήματα 49 μηχανισμοί Όλα σε μία άδεια
Page cache
Σερβίρεται πριν ξεκινήσει το OpenCart.
Ένα cache hit εξυπηρετείται από το catalog/index.php, πριν από το framework. Όσα ακολουθούν καθορίζουν τι σερβίρεται, για πόση ώρα, και τι γίνεται όσο ξαναχτίζεται.
- Εξυπηρέτηση πριν από το framework
- Οι cached σελίδες σερβίρονται από το catalog/index.php πριν ξεκινήσει το OpenCart — μηδέν queries στη βάση σε ένα hit.
- Προσυμπιεσμένα αντίγραφα
- Κάθε cached σελίδα κρατά στον δίσκο ένα προσυμπιεσμένο αντίγραφο .gz, ώστε η συμπίεση gzip να γίνεται μία φορά αντί για κάθε request.
- ETag και Last-Modified
- Οι cached σελίδες φέρουν κεφαλίδες ETag και Last-Modified, ώστε ένα επαναλαμβανόμενο request χωρίς αλλαγές να παίρνει 304 αντί για ολόκληρη τη σελίδα.
- TTL ανά route
- Κάθε route μπορεί να παρακάμψει τον προεπιλεγμένο χρόνο ζωής του cache, ενώ κάθε TTL έχει τυχαία απόκλιση λήξης ώστε να μη λήγουν όλες οι σελίδες την ίδια στιγμή.
- Soft-bust epoch
- Ένα soft-bust epoch σημαδεύει ολόκληρο το cache ως stale με μία κίνηση, χωρίς να διαγραφεί ούτε ένα αρχείο από τον δίσκο.
- stale-while-revalidate
- Μια ληγμένη σελίδα συνεχίζει να σερβίρεται όσο χτίζεται νέο αντίγραφο στο παρασκήνιο — ο επισκέπτης δεν περιμένει ποτέ το ξαναχτίσιμο.
- stale-if-error
- Αν αποτύχει ένα ξαναχτίσιμο στο παρασκήνιο, συνεχίζει να σερβίρεται το τελευταίο έγκυρο cached αντίγραφο αντί για σφάλμα.
- Cache για συνδεδεμένους πελάτες
- Προαιρετικό. Οι συνδεδεμένοι επισκέπτες διαβάζουν το ίδιο κοινό cache των μη συνδεδεμένων· το καλάθι και τα στοιχεία του λογαριασμού τους συμπληρώνονται server-side, πριν σταλεί η απόκριση, από τα Dynamic Fragments — και η ίδια η σελίδα ενός συνδεδεμένου χρήστη δεν αποθηκεύεται ποτέ. Δεν συνιστάται για καταστήματα με τιμές ανά ομάδα πελατών — το admin σας το επισημαίνει.
- Dynamic Fragments
- Οι περιοχές που διαφέρουν ανά επισκέπτη — κυρίως το καλάθι — συμπληρώνονται με το δικό του markup εξ ολοκλήρου server-side, πριν σταλεί ούτε ένα byte: χωρίς JavaScript, χωρίς mask και χωρίς αντικατάσταση μετά την εμφάνιση της σελίδας. Το κάνουν τρία βήματα, όλα fail-open: το stash κρατά τη ζωντανή απόδοση ενός fragment route του επισκέπτη, από τη στιγμή μετά την τελευταία του ενέργεια στο καλάθι· το mark εντοπίζει μέσα σε μια κοινή cached σελίδα το στοιχείο που ορίζει ο id-selector του fragment και το περικλείει σε markers· το apply αντικαθιστά το σημαδεμένο στοιχείο με το αποθηκευμένο αντίγραφο του επισκέπτη τη στιγμή που σερβίρεται η σελίδα. Ταιριάζει μόνο με id selectors, όχι με classes, και όποιο βήμα δεν βρει το αντίστοιχό του αφήνει απλώς στη θέση του το cached markup της κοινής σελίδας.
- Στοχευμένος καθαρισμός και νέα προθέρμανση
- Η επεξεργασία ενός προϊόντος, μιας κατηγορίας, μιας σελίδας πληροφοριών ή ενός κατασκευαστή καθαρίζει μόνο τις σελίδες που επηρεάζονται και τις βάζει σε ουρά για τον επόμενο κύκλο προθέρμανσης.
- Ο cron watcher
- Πιάνει αλλαγές που έγιναν εντελώς εκτός OpenCart — ένα ERP ή ένα script feed που γράφει απευθείας στη βάση — παρακολουθώντας το date_modified κάθε εγγραφής.
- Canonical Domain Redirect
- Προαιρετικό. Κάνει 301 ανακατεύθυνση τη μη ρυθμισμένη εκδοχή του domain του καταστήματος, www ή apex, προς αυτήν που έχει ρυθμιστεί, ώστε να υπάρχει ένα cache tree και να μη βλέπουν οι μηχανές αναζήτησης διπλά URL. Ο χάρτης των hosts παράγεται από τον πίνακα store, δεν συντάσσεται ποτέ στο χέρι.
Query & data cache
Μια αλλαγή ακυρώνει έναν πίνακα, όχι τα πάντα.
Και η δουλειά της βάσης πίσω από μια σελίδα μπαίνει στο cache, με ακύρωση αρκετά στοχευμένη ώστε μία αλλαγή να μη χρειάζεται να αδειάσει ολόκληρο το cache.
- Query cache
- Τα αποτελέσματα των SELECT του καταστήματος μπαίνουν στο cache με δείκτες ακύρωσης ανά πίνακα, ώστε μια εγγραφή σε έναν πίνακα να ρίχνει μόνο τα δικά του cached αποτελέσματα.
- Journal3 result cache
- Το result cache του ίδιου του Journal3 καλύπτεται μαζί με το υπόλοιπο query cache.
- Fast File Cache
- Προαιρετικό. Αντικαθιστά τα εσωτερικά του προεπιλεγμένου driver Cache\File του OpenCart: ανάγνωση με ακριβές όνομα και σάρωση φακέλου κάθε 30 λεπτά, αντί για glob ολόκληρου του φακέλου σε κάθε request.
- Log αργών queries
- Κάθε αργό query καταγράφεται μαζί με μια σύνοψη EXPLAIN.
- Log υπερμεγεθών αποτελεσμάτων
- Τα queries που επιστρέφουν υπερβολικά μεγάλο σύνολο αποτελεσμάτων καταγράφονται ξεχωριστά.
Assets
Λιγότερα bytes, χωρίς να τα πληρώνετε δύο φορές.
Τα CSS και τα JS επεξεργάζονται μία φορά και επαναχρησιμοποιούνται, ενώ η ίδια η επεξεργασία ξοδεύεται μόνο εκεί όπου το αποτέλεσμα κρατιέται.
- Minification
- Γίνεται minify σε HTML, σε inline και εξωτερικό CSS, και σε JS.
- Bundling
- Τα αρχεία CSS και JS ενοποιούνται, ώστε να μειωθεί ο αριθμός των requests που χρειάζεται μια σελίδα.
- Async και critical CSS
- Το critical CSS μπαίνει inline ώστε το ορατό μέρος της σελίδας να εμφανίζεται αμέσως, ενώ το υπόλοιπο stylesheet φορτώνει ασύγχρονα.
- Deferred JS
- Τα scripts φορτώνουν με defer, ώστε να μη μπλοκάρουν την εμφάνιση της σελίδας.
- Καθυστέρηση scripts τρίτων
- Τα scripts τρίτων φορτώνουν αργότερα, μετά την ίδια τη σελίδα.
- Resource hints
- Στη σελίδα προστίθενται hints, ώστε ο browser να ξεκινά τη δουλειά για πόρους που θα χρειαστεί πριν καν τους ζητήσει ρητά.
- Speculation Rules
- Οι πιθανές επόμενες σελίδες γίνονται prefetch και prerender μέσω του Speculation Rules API, με εναλλακτική βασισμένη στην πρόθεση του χρήστη για τους browsers που δεν το υποστηρίζουν ακόμη.
- Χωρίς minification σε σελίδες εκτός cache
- Το minification τρέχει μόνο σε αποκρίσεις που αποθηκεύονται και σερβίρονται ξανά — μια δυναμική σελίδα εκτός cache δεν πληρώνει ποτέ ένα κόστος minification που δεν θα το πάρει πίσω.
Εικόνες
Κάθε εικόνα ζυγίζει όσο πρέπει, όχι παραπάνω.
Ο χειρισμός των εικόνων περνά από τον resizer του ίδιου του OpenCart και όχι από ένα παράλληλο pipeline, ώστε να μένει συντονισμένος με όλα τα υπόλοιπα της σελίδας.
- Lazy loading
- Οι εικόνες φορτώνουν μόνο καθώς πλησιάζουν στο ορατό μέρος της οθόνης.
- Ρητές διαστάσεις
- Οι εικόνες φέρουν ρητό width και height, ώστε ο browser να κρατά τον χώρο τους και η σελίδα να μην αναπηδά καθώς φορτώνουν.
- Preload της εικόνας LCP
- Η μεγαλύτερη αναμενόμενη εικόνα της σελίδας φορτώνεται με preload, ώστε να μην είναι αυτή ο λόγος που αργεί το Largest Contentful Paint.
- Παραγωγή WebP
- Οι εκδόσεις WebP παράγονται μέσω hooks στον image resizer του ίδιου του OpenCart, όχι σε ξεχωριστό pipeline.
- Prepass γρήγορης σμίκρυνσης
- Οι ασυνήθιστα μεγάλες αρχικές εικόνες περνούν από ένα γρήγορο πέρασμα σμίκρυνσης πριν τρέξει το κανονικό resize του OpenCart.
Προστασία
Η ανεπιθύμητη κίνηση κόβεται πριν κοστίσει οτιδήποτε.
Η ίδια διαδρομή πριν από το framework που σερβίρει ένα cache hit κόβει και τα requests που δεν θα έπρεπε καν να φτάσουν στο OpenCart.
- Firewall για requests
- Τα μοτίβα URL και τα user agents ελέγχονται πριν φορτώσει το framework· ένα μπλοκαρισμένο request παίρνει 403 πριν από το framework, όπως ακριβώς και ένα cache hit.
- Περιορισμός bots
- Τα cache miss από καταγεγραμμένους scrapers παίρνουν 503 αντί να εκτελεστεί ολόκληρο το request.
- Επαλήθευση με reverse DNS
- Ένας επισκέπτης που δηλώνει ότι είναι γνωστό crawler ελέγχεται με reverse DNS — ένα ψεύτικο Googlebot περιορίζεται αντί να θεωρηθεί έμπιστο.
- Άμεσο 404
- Προαιρετικό. Τα requests για στατικά αρχεία που δεν υπάρχουν παίρνουν άμεσο 404, πριν από το framework.
- Προστασία sessions χωρίς cookies
- Προαιρετικό. Εμποδίζει τα bots που δεν κρατούν cookies να φουσκώνουν τον χώρο των sessions.
- Κλείδωμα σύνδεσης διαχειριστή
- Οι επανειλημμένες αποτυχημένες προσπάθειες σύνδεσης στη διαχείριση κλειδώνουν τον λογαριασμό.
Προθέρμανση
Το cache γεμίζει μόνο του, πριν χρειαστεί να το γεμίσει επισκέπτης.
Ένας crawler που τρέχει από cron κρατά το cache γεμάτο ως απλός επισκέπτης, ώστε ένας πραγματικός επισκέπτης σπάνια να βρει κρύα σελίδα.
- CLI cron crawler
- Τρέχει από cron σαν απλός επισκέπτης και διατρέχει το κατάστημα για να ξαναχτίσει το cache του.
- Με επίγνωση του φόρτου και δυνατότητα συνέχισης
- Ο κύκλος προθέρμανσης υποχωρεί όταν ο server έχει φόρτο και μπορεί να συνεχίσει από εκεί που σταμάτησε αντί να ξεκινήσει από την αρχή.
- Τροφοδοτείται από πραγματική κίνηση και συνδέσμους σελίδων
- Οι σελίδες που διατρέχονται προκύπτουν από την πραγματική κίνηση και από τους συνδέσμους που βρίσκονται σε κάθε σελίδα που έχει ήδη προθερμανθεί.
- Κάθε παραλλαγή συσκευής
- Όταν είναι ενεργό το cache ανά συσκευή, η προθέρμανση χτίζει αντίγραφο για κάθε παραλλαγή συσκευής, όχι μόνο για μία.
Πίνακας ελέγχου
Όλα όσα κάνει το σύστημα, σε ένα σημείο.
Στον πίνακα ελέγχου της διαχείρισης παρακολουθείτε, ρυθμίζετε και καθαρίζετε το cache, την προθέρμανση και το firewall.
- Βαθμός υγείας
- Βαθμός υγείας με συγκεκριμένες συστάσεις, από ελέγχους σε πραγματικό χρόνο: ποσοστό bypass, domains χωρίς ρύθμιση και πόσο πρόσφατα έτρεξε το cron της προθέρμανσης.
- Ιστορικό hit ratio
- Ιστορικό της αναλογίας hit του cache στον χρόνο.
- Ζωντανή παρακολούθηση κίνησης
- Ζωντανή εικόνα της κίνησης που δέχεται το κατάστημα.
- Αργά queries
- Το log των αργών queries, μέσα στον ίδιο τον πίνακα ελέγχου.
- Καθαρισμός ανά URL
- Μεμονωμένα URL μπορούν να καθαριστούν από το cache όποτε χρειαστεί.
- Εργαλεία για indexes και πίνακες της βάσης
- Εργαλεία για τη διαχείριση των indexes και των πινάκων της βάσης απευθείας από τον πίνακα ελέγχου.
- Συντήρηση ορφανών και παλιών εγγραφών
- Οι ορφανές και οι παλιές εγγραφές εντοπίζονται και καθαρίζονται από τον πίνακα ελέγχου.
- Εξαγωγή και εισαγωγή ρυθμίσεων
- Το σύνολο των ρυθμίσεων μπορεί να εξαχθεί και να εισαχθεί.
- Περιήγηση εκτός cache
- Ένα query string ?nitro=<token> σας επιτρέπει να δείτε τη ζωντανή σελίδα εκτός cache για δοκιμές, ενώ κάθε άλλος επισκέπτης συνεχίζει να παίρνει το cache.
Αρχές σχεδιασμού
Τρεις κανόνες που όλα τα παραπάνω θεωρούν δεδομένους.
- Fail open, παντού
- Κάθε εσωτερικό σφάλμα καταλήγει στην προεπιλεγμένη συμπεριφορά του OpenCart — το request συνεχίζει σαν να μην ήταν εγκατεστημένο το Nitro.
- Ποτέ cache σε εξατομικευμένο περιεχόμενο
- Οι δυναμικές αποδόσεις σελίδων αποκλείονται δομικά από το κοινό cache — δεν υπάρχει διαδρομή που θα άφηνε μία να περάσει.
- Κάθε ocmod hook είναι θωρακισμένο
- Κάθε patch στον πυρήνα δεν κάνει τίποτα όταν το Nitro είναι απενεργοποιημένο ή απόν, οπότε η απενεργοποίηση δεν αφήνει τίποτα πίσω της.
Δείτε πόσο κοστίζει.
Μία άδεια, ένα domain καταστήματος, για πάντα. Χωρίς πακέτα.