SEO Case Study: Νέο site από 0 σε 100.000 επισκέψεις σε έναν μήνα

Όταν ένα ολοκαίνουργιο site εκτινάσσεται μέσα στον πρώτο του μήνα και αγγίζει περίπου 165.000 οργανικές επισκέψεις, η συζήτηση στρέφεται συνήθως στο περιεχόμενο, στα backlinks ή στις λέξεις-κλειδιά. Όλα αυτά μετράνε. Υπάρχει όμως ένα στρώμα που σπάνια αναφέρεται και που, στην προκειμένη περίπτωση, στάθηκε η σιωπηλή ραχοκοκαλιά ολόκληρης της επιτυχίας: η υποδομή φιλοξενίας και η συμπεριφορά του διακομιστή κάτω από πραγματικό φορτίο. Αυτό το case study εστιάζει αποκλειστικά εκεί. Όχι στις μετρήσεις εμπειρίας χρήστη στο πρόγραμμα περιήγησης, αλλά στο τι συμβαίνει πίσω από την κουρτίνα: στους server, στα στρώματα cache, στο δίκτυο διανομής και στην ικανότητα του συστήματος να μένει όρθιο όταν η κίνηση δεκαπλασιάζεται μέσα σε ώρες.

Η θέση που υιοθετήσαμε από την πρώτη μέρα ήταν απλή και ανυποχώρητη: ένα νέο site δεν χτίζεται για την κίνηση που έχει σήμερα, αλλά για την κίνηση που θα έχει όταν όλα πάνε καλά. Αν η υποδομή δεν είναι σχεδιασμένη να αντέξει την επιτυχία, τότε η ίδια η επιτυχία γίνεται η αιτία της κατάρρευσης.

Η αρχιτεκτονική απόφαση που προηγήθηκε κάθε άρθρου

Πριν δημοσιευτεί η πρώτη λέξη, καθίσαμε και σχεδιάσαμε τη στοίβα εξυπηρέτησης σαν να επρόκειτο να δεχτεί φορτίο από την πρώτη εβδομάδα. Αυτό δεν ήταν υπερβολή· ήταν ασφάλιση. Το λάθος που κάνουν τα περισσότερα νέα project είναι να ξεκινούν με τον φθηνότερο κοινόχρηστο πάροχο, με τη λογική «θα αναβαθμίσουμε αργότερα». Όταν όμως έρθει το «αργότερα», συνήθως έρχεται απότομα, μέσα σε ένα απόγευμα που μια σελίδα αρχίζει να ανεβαίνει, και τότε η μετάβαση γίνεται υπό πίεση, με downtime και με χαμένες θέσεις στα αποτελέσματα.

Επιλέξαμε λοιπόν μια αρχιτεκτονική όπου ο διακομιστής προέλευσης δεν θα ήταν ποτέ το αδύναμο σημείο. Ο στόχος ήταν ξεκάθαρος: το 90% και πλέον των αιτημάτων να μην φτάνει καν στον origin server. Όλη η σχεδίαση οργανώθηκε γύρω από αυτή την αρχή, ώστε ακόμη και μια ξαφνική έκρηξη επισκεψιμότητας να απορροφάται από στρώματα που βρίσκονται μπροστά από τη βάση και την εφαρμογή.

Γιατί απορρίψαμε το φθηνό shared hosting

Το κοινόχρηστο πακέτο μοιράζει πόρους ανάμεσα σε εκατοντάδες λογαριασμούς στον ίδιο φυσικό κόμβο. Όσο η κίνηση είναι μικρή, κανείς δεν το προσέχει. Τη στιγμή όμως που χρειάζεσαι σταθερότητα, η συμπεριφορά του γείτονα γίνεται δικό σου πρόβλημα: μια άσχετη εφαρμογή που τρώει CPU σε διπλανό λογαριασμό μπορεί να ρίξει τους χρόνους απόκρισής σου. Δεν θέλαμε η τύχη μας να εξαρτάται από αγνώστους. Προχωρήσαμε σε περιβάλλον με εγγυημένους, απομονωμένους πόρους και με δυνατότητα κάθετης κλιμάκωσης χωρίς μετακόμιση.

Τα στρώματα cache ως πρώτη γραμμή άμυνας

Η μεγαλύτερη μυστική συνταγή της σταθερότητας δεν ήταν ένας ισχυρότερος server· ήταν το να μη χρειαστεί ο server να δουλέψει σχεδόν καθόλου. Στήσαμε πολλαπλά, αλληλεπικαλυπτόμενα επίπεδα προσωρινής αποθήκευσης, καθένα με διαφορετική αποστολή, ώστε κάθε αίτημα να εξυπηρετείται όσο πιο μακριά γίνεται από τη βαριά διεργασία παραγωγής της σελίδας.

Το πρώτο επίπεδο ήταν το full-page cache: ολόκληρες σελίδες αποθηκεύονταν έτοιμες σε στατική μορφή, ώστε ένας επισκέπτης να λαμβάνει ένα προπαρασκευασμένο HTML χωρίς να ενεργοποιείται καμία διεργασία στη βάση δεδομένων. Το δεύτερο επίπεδο ήταν το object cache, που κρατούσε στη μνήμη τα αποτελέσματα ακριβών ερωτημάτων ώστε να μην επαναλαμβάνονται. Το τρίτο επίπεδο ήταν το opcode cache στον μηχανισμό εκτέλεσης, που απέφευγε την εκ νέου μεταγλώττιση του κώδικα σε κάθε κλήση.

Πώς ορίσαμε τη διάρκεια ζωής του cache

Ένα cache που λήγει πολύ γρήγορα είναι σχεδόν άχρηστο, γιατί η σελίδα ξαναχτίζεται διαρκώς. Ένα cache που λήγει πολύ αργά σερβίρει μπαγιάτικο περιεχόμενο. Βρήκαμε την ισορροπία ορίζοντας μεγάλη διάρκεια ζωής για το σταθερό περιεχόμενο και έξυπνη, στοχευμένη ακύρωση όποτε άλλαζε κάτι. Όταν ανανεωνόταν ένα άρθρο, καθαριζόταν μόνο η συγκεκριμένη διεύθυνση και οι σελίδες που εξαρτιόνταν άμεσα από αυτήν, όχι ολόκληρο το cache. Έτσι μια μικρή αλλαγή δεν προκαλούσε ποτέ ένα κύμα ανακατασκευής που θα γονάτιζε τον server σε ώρα αιχμής.

Το CDN ως παγκόσμιο ανάχωμα

Το δίκτυο διανομής περιεχομένου ήταν το στοιχείο που μετέτρεψε ένα τοπικό setup σε κάτι που μπορούσε να αντέξει διεθνή κίνηση. Αντί κάθε επισκέπτης να συνδέεται στον κεντρικό διακομιστή, συνδεόταν στον κοντινότερο κόμβο του δικτύου. Ένας χρήστης μακριά γεωγραφικά λάμβανε τα δεδομένα από έναν server δίπλα του, με αποτέλεσμα δραματικά μικρότερη καθυστέρηση και, το κυριότερο, ελάχιστο φόρτο στον origin.

Ρυθμίσαμε το CDN να μην εξυπηρετεί μόνο εικόνες και αρχεία, αλλά και ολόκληρες τις στατικές σελίδες HTML στην άκρη του δικτύου. Αυτό σημαίνει ότι όταν μια σελίδα έγινε δημοφιλής, οι χιλιάδες ταυτόχρονοι επισκέπτες απορροφήθηκαν από δεκάδες κόμβους ανά τον κόσμο και όχι από μία μοναδική μηχανή. Ο κεντρικός διακομιστής, στις στιγμές της μεγαλύτερης έκρηξης, δεχόταν ένα κλάσμα μόνο της πραγματικής κίνησης.

Συμπίεση και πρωτόκολλα μεταφοράς

Πέρα από τη γεωγραφική εγγύτητα, δουλέψαμε και στον ίδιο τον τρόπο μεταφοράς. Ενεργοποιήσαμε σύγχρονη συμπίεση στο επίπεδο του δικτύου, ώστε τα αρχεία να ταξιδεύουν μικρότερα. Χρησιμοποιήσαμε σύγχρονα πρωτόκολλα μεταφοράς που επιτρέπουν πολλαπλές παράλληλες ροές πάνω από μία σύνδεση, μειώνοντας τις καθυστερήσεις από την επαναλαμβανόμενη εγκαθίδρυση συνδέσεων. Κάθε χιλιοστό του δευτερολέπτου που γλιτώναμε εδώ πολλαπλασιαζόταν σε εκατοντάδες χιλιάδες αιτήματα.

Η βάση δεδομένων ως κρυφό σημείο συμφόρησης

Σε κάθε δυναμικό site, η βάση δεδομένων είναι συχνά το πρώτο σημείο που λυγίζει. Όσο ισχυρός κι αν είναι ο επεξεργαστής, αν τα ερωτήματα είναι αργά και πολλαπλασιάζονται, το σύστημα μπλοκάρει. Αφιερώσαμε σημαντικό χρόνο στο να καταλάβουμε ποια ερωτήματα ήταν τα πιο δαπανηρά και να τα ξαναγράψουμε ή να τα αναθέσουμε στο object cache.

Προσθέσαμε στοχευμένα ευρετήρια στις στήλες που χρησιμοποιούνταν στις αναζητήσεις, ώστε η βάση να μη σαρώνει ολόκληρους πίνακες για να βρει μερικές γραμμές. Καθαρίσαμε τα περιττά δεδομένα που συσσωρεύονται φυσιολογικά, όπως προσωρινές εγγραφές και αχρείαστες αναθεωρήσεις, για να μένει η βάση ελαφριά και γρήγορη. Όταν ήρθε η μεγάλη κίνηση, η συντριπτική πλειονότητα των επισκεπτών έπαιρναν απάντηση από το full-page cache και δεν άγγιζαν καν τη βάση, οπότε αυτή έμενε σε χαμηλό φορτίο ακόμη και στις πιο φορτωμένες στιγμές.

Διαχωρισμός φορτίου ανάγνωσης και εγγραφής

Ένα ακόμη βήμα που μας έδωσε περιθώριο ανάσας ήταν ο νοητός διαχωρισμός των λειτουργιών ανάγνωσης από τις λειτουργίες εγγραφής. Οι αναγνώσεις, που αποτελούν τη συντριπτική πλειονότητα της κίνησης ενός περιεχομενικού site, εξυπηρετούνταν με τρόπο εξαιρετικά ελαφρύ, ενώ οι εγγραφές, που είναι λίγες και ελεγχόμενες, δεν μπλόκαραν ποτέ τη ροή των επισκεπτών. Έτσι η εμπειρία ανάγνωσης παρέμενε σταθερή ανεξάρτητα από το τι συνέβαινε στο παρασκήνιο.

Κλιμάκωση: πώς αντέξαμε το δεκαπλασιασμό μέσα σε ώρες

Η πιο κρίσιμη δοκιμασία ήρθε όταν μια σειρά σελίδων άρχισε να ανεβαίνει ταυτόχρονα. Η κίνηση που μέχρι χθες ήταν χιλιάδες επισκέψεις την ημέρα έγινε δεκάδες χιλιάδες μέσα σε λίγες ώρες. Εδώ φάνηκε αν η προετοιμασία είχε νόημα ή αν ήταν θεωρία.

Η αρχιτεκτονική μας προέβλεπε δύο ειδών κλιμάκωση. Η πρώτη ήταν η οριζόντια απορρόφηση μέσω του CDN και του full-page cache, η οποία δούλεψε αυτόματα: όσο περισσότεροι έμπαιναν, τόσο περισσότερο σερβίρονταν από την άκρη του δικτύου. Η δεύτερη ήταν η δυνατότητα να ενισχύσουμε άμεσα τους πόρους του διακομιστή προέλευσης χωρίς μετακόμιση και χωρίς διακοπή. Δεν χρειάστηκε ποτέ να φτάσουμε στα όριά της, ακριβώς επειδή το cache έκανε τη δουλειά του, αλλά η ύπαρξή της και μόνο μας έδινε την ψυχραιμία να μην πανικοβληθούμε.

Δοκιμές φορτίου πριν την έκρηξη

Δεν περιμέναμε την πραγματική κίνηση για να μάθουμε αν η υποδομή αντέχει. Πραγματοποιήσαμε προσομοιώσεις φορτίου, στέλνοντας τεχνητά μεγάλους όγκους ταυτόχρονων αιτημάτων για να δούμε πού θα έσπαγε το σύστημα. Αυτές οι δοκιμές αποκάλυψαν αδύναμα σημεία που διορθώσαμε εκ των προτέρων: ένα ερώτημα που δεν αποθηκευόταν σωστά, ένα όριο ταυτόχρονων συνδέσεων που έπρεπε να ανέβει, μια ρύθμιση που άφηνε τις συνδέσεις ανοιχτές περισσότερο απ’ όσο χρειαζόταν. Όταν ήρθε η αληθινή έκρηξη, δεν υπήρξε έκπληξη· υπήρχε ένα σενάριο που είχαμε ήδη ζήσει σε ελεγχόμενες συνθήκες.

Σταθερότητα και διαθεσιμότητα κάτω από πίεση

Για μια μηχανή αναζήτησης, ένα site που πέφτει σε ώρα αιχμής δίνει ένα σαφές αρνητικό σήμα. Αν το crawler προσπαθήσει να επισκεφθεί μια σελίδα και τη βρει εκτός λειτουργίας, η εμπιστοσύνη κλονίζεται και η συχνότητα ανίχνευσης πέφτει. Γι’ αυτό η αδιάλειπτη διαθεσιμότητα δεν ήταν για εμάς θέμα φιλοδοξίας αλλά απαραίτητη προϋπόθεση για να κρατήσουμε τις θέσεις που κερδίζαμε.

Στήσαμε συνεχή παρακολούθηση διαθεσιμότητας από πολλαπλά σημεία, με ειδοποιήσεις που θα μας έβρισκαν μέσα σε δευτερόλεπτα αν κάτι πήγαινε στραβά. Ορίσαμε αυτόματους μηχανισμούς ανάκαμψης ώστε, αν μια διεργασία κρεμούσε, να επανεκκινείται μόνη της χωρίς ανθρώπινη παρέμβαση. Καθ’ όλη τη διάρκεια του πρώτου μήνα, ακόμη και στις στιγμές της μεγαλύτερης πίεσης, το site παρέμεινε προσβάσιμο και απαντούσε χωρίς διακοπές.

Ο ρόλος του χρόνου απόκρισης του διακομιστή

Υπάρχει μια μέτρηση που πολλοί μπερδεύουν με την ταχύτητα φόρτωσης, ενώ είναι εντελώς διαφορετική: ο χρόνος μέχρι το πρώτο byte, δηλαδή πόσο γρήγορα ο διακομιστής αρχίζει να στέλνει απάντηση. Αυτό είναι καθαρά ζήτημα backend και είναι ίσως το πιο ειλικρινές μέτρο της ποιότητας της υποδομής. Χάρη στο full-page cache και στην εγγύτητα του CDN, ο χρόνος αυτός παρέμεινε εξαιρετικά χαμηλός και, το σημαντικότερο, σταθερός ανεξάρτητα από το πλήθος των ταυτόχρονων επισκεπτών. Ένας server που απαντά γρήγορα όταν είναι άδειος αλλά αργεί όταν γεμίζει είναι αναξιόπιστος· εμείς χτίσαμε για τη σταθερότητα κάτω από φορτίο, όχι για τις καλές επιδόσεις στο κενό.

Ασφάλεια και ανθεκτικότητα ως μέρος της υποδομής

Η σταθερότητα δεν απειλείται μόνο από τη νόμιμη κίνηση. Ένα site που ανεβαίνει γίνεται στόχος για ανεπιθύμητα bots, για επιθέσεις που προσπαθούν να εξαντλήσουν τους πόρους και για κακόβουλη σάρωση. Το ίδιο το δίκτυο διανομής λειτούργησε εδώ και ως ασπίδα, φιλτράροντας ύποπτη κίνηση πριν αυτή φτάσει στον διακομιστή προέλευσης.

Ορίσαμε όρια ρυθμού στα αιτήματα ώστε κανένας μεμονωμένος επισκέπτης ή bot να μην μπορεί να μονοπωλήσει τους πόρους. Αποκλείσαμε γνωστά κακόβουλα μοτίβα και αφήσαμε ελεύθερη τη διέλευση στα νόμιμα crawlers των μηχανών αναζήτησης, που τα θέλαμε να μας επισκέπτονται όσο πιο συχνά γινόταν. Έτσι οι πόροι του server αφιερώνονταν εκεί που έπρεπε: στους πραγματικούς αναγνώστες και στους robots που χτίζουν την οργανική παρουσία.

Παρακολούθηση πόρων σε πραγματικό χρόνο

Δεν αρκεί να στήσεις μια καλή υποδομή· πρέπει να τη βλέπεις να αναπνέει. Καθ’ όλη τη διάρκεια της ανάπτυξης είχαμε μπροστά μας πίνακες που έδειχναν, στιγμή προς στιγμή, τη χρήση επεξεργαστή, τη μνήμη, τα ταυτόχρονα αιτήματα, το ποσοστό επιτυχίας του cache και τους χρόνους απόκρισης. Αυτή η ορατότητα ήταν αυτό που μετέτρεψε τη διαχείριση από αντίδραση σε πρόβλεψη.

Το πιο διδακτικό νούμερο ήταν το ποσοστό των αιτημάτων που εξυπηρετούνταν από το cache. Όσο αυτό παρέμενε πολύ υψηλό, ξέραμε ότι ο origin κοιμόταν ήσυχος ακόμη και με τεράστια κίνηση. Όποτε έπεφτε, ψάχναμε αμέσως τι το προκαλούσε: μια λανθασμένη ρύθμιση, μια σελίδα που δεν αποθηκευόταν, ένα μοτίβο κίνησης που παρέκαμπτε το cache. Η συνεχής αυτή επαγρύπνηση κράτησε το σύστημα υγιές σε όλη τη διαδρομή προς τις περίπου 165.000 επισκέψεις.

Τι θα μπορούσε να είχε στραβώσει χωρίς αυτή την υποδομή

Αξίζει να φανταστούμε το αντίστροφο σενάριο, γιατί εκεί φαίνεται η πραγματική αξία αυτής της προετοιμασίας. Με ένα φθηνό κοινόχρηστο πακέτο και χωρίς στρώματα cache, η πρώτη μέρα μεγάλης κίνησης θα είχε ρίξει το site. Οι σελίδες που μόλις άρχιζαν να ανεβαίνουν θα γίνονταν απρόσιτες ακριβώς τη στιγμή που οι επισκέπτες τις ζητούσαν. Το crawler θα συναντούσε σφάλματα, θα μείωνε τη συχνότητα επίσκεψης και η ορμή θα έσβηνε.

Η ειρωνεία είναι σκληρή: όσο καλύτερο είναι το περιεχόμενο και η στρατηγική, τόσο μεγαλύτερος ο κίνδυνος, γιατί τόσο πιο γρήγορα έρχεται το φορτίο που θα τσακίσει μια ανέτοιμη υποδομή. Η επένδυση στους server, στο CDN και στο cache δεν ήταν λοιπόν πολυτέλεια· ήταν η ίδια η προϋπόθεση που επέτρεψε σε όλα τα υπόλοιπα να αποδώσουν τους καρπούς τους.

Πρακτικά συμπεράσματα για το επόμενο νέο site

Αν ξεκινούσα σήμερα ένα νέο εγχείρημα με φιλοδοξία γρήγορης ανάπτυξης, θα έβαζα την υποδομή στην κορυφή της λίστας, πριν καν γραφτεί το πρώτο άρθρο. Θα επέλεγα περιβάλλον με απομονωμένους, εγγυημένους πόρους και άμεση δυνατότητα ενίσχυσης. Θα έστηνα από την αρχή full-page cache, object cache και opcode cache, και δεν θα δημοσίευα τίποτα πριν επιβεβαιώσω ότι το ποσοστό εξυπηρέτησης από το cache είναι πολύ υψηλό.

Θα έβαζα CDN μπροστά από τα πάντα, ρυθμισμένο να σερβίρει και τις στατικές σελίδες στην άκρη του δικτύου, όχι μόνο τα αρχεία. Θα έτρεχα δοκιμές φορτίου πριν την έκρηξη, για να βρω τα όρια σε ελεγχόμενες συνθήκες. Και θα έστηνα παρακολούθηση διαθεσιμότητας και πόρων με ειδοποιήσεις, ώστε να ξέρω τι συμβαίνει πριν μου το πει κάποιος επισκέπτης. Η υποδομή είναι το αόρατο θεμέλιο· κανείς δεν τη χειροκροτεί όταν δουλεύει, αλλά όλοι θυμούνται τη μέρα που δεν δούλεψε.

Συμπερασματικά

Το ταξίδι από το μηδέν στις περίπου 165.000 οργανικές επισκέψεις μέσα σε έναν μήνα γράφτηκε με περιεχόμενο και στρατηγική, αλλά στηρίχθηκε πάνω σε μια υποδομή που είχε σχεδιαστεί να μην προδώσει τη στιγμή της επιτυχίας. Οι server, τα στρώματα cache και το δίκτυο διανομής δεν φαίνονται σε κανένα γράφημα επισκεψιμότητας, όμως χωρίς αυτά κανένα γράφημα δεν θα είχε ανέβει. Η σταθερότητα κάτω από φορτίο, η χαμηλή και αμετάβλητη απόκριση του διακομιστή, η ικανότητα απορρόφησης ξαφνικών εκρήξεων: αυτά ήταν το σιωπηλό πλεονέκτημα που μετέτρεψε μια καλή στρατηγική σε πραγματικό αποτέλεσμα. Όποιος θέλει να επαναλάβει ένα τέτοιο αποτέλεσμα οφείλει να αρχίσει από εκεί που οι περισσότεροι τελειώνουν: από το backend.

Για περισσότερες πληροφορίες σχετικά με σύγχρονες SEO στρατηγικές, επισκεφθείτε τη Divramis SEO Agency.

Διαβάστε επίσης από Seo-webitnow

Δείτε περισσότερα άρθρα από το Seo-webitnow:

seo-webitnow.com

Σχολιάστε