Η ταχύτητα φόρτωσης ενός site είναι κρίσιμης σημασίας για την επιτυχία του. Όπως είχαμε αναφέρει και σε προηγούμενο άρθρο για το Joomla, η ταχύτητας φόρτωση επηρρεάζει:
- την εμπειρία χρήστη (καλύτερη εμπειρία χρήστη = περισσότερα conversions = αυξημένη πιθανότητα κερδοφορίας)
- καλύτερες κατατάξεις στο Google (SEO)
- καλύτερο Google AdWords Quality Score (χαμηλότερο CPC/καλύτερο Ad position)
Συνεπώς έχουμε κάθε δίκιο να είμαστε πορωμένοι με το θέμα της ταχύτητας 🙂
Drupal
Το Drupal σε αντίθεση με το Joomla (και το WordPress) είναι ένα σάφως καλύτερο εργαλείο, κάνει πιο εύκολα scale, είναι η χαρά του καλού προγραμματιστή (no comments), είναι πολυμορφικό (μπορείς να το πλάσεις όπως θέλεις), επιτρέπει standard ροές χρήσης, έχει καταπληκτικό ACL, και άπειρα άλλα πλεονεκτημάτα.
Δυστυχώς αυτό το καθιστά overkill για τα “απλά” sites (προσωπική εκτίμηση: το 80%+ των sites στην Ελλάδα) και το κάνει πιο απαιτητικό σε Server resources. Βέβαια στη GIM έχουμε πει πως δεν είμαστε fans των “απλών sites” για αυτό και πάμε να κολυμπήσουμε στα πιο βαθιά νερά του Drupal Speed Optimization.
Server Speed Matters (a lot)!
Αν θέλετε ταχύτητα θα πρέπει όσο το δυνατόν περισσότερα Data να δίνονται από τη μνήμη χωρίς τη χρήση CPU και σκληρού δίσκου. Αυτό σημαίνει πως θα πρέπει ο Server να διαθέτει άφθονη μνήμη, μηχανισμούς Caching σωστά παραμετροποιημένους και εσείς να αξιοποιήσετε ότι Caching μπορείτε (και απαιτείται από τα συνήθη User scenarios του site σας).
Αρχικά όπως είπαμε και στο προηγούμενο άρθρο μην τσιγκουνεύεστε τη φιλοξενία. Δε θα βρείτε καλή φιλοξενία με 50€/$ το χρόνο για Drupal που να έχει και πολύ καλή ταχύτητα. Ο server θα πρέπει να έχει κάποια minimum specifications αν θέλετε άριστη ταχύτητα.
Τι πρέπει να προσέξετε στο Server για να έχετε πολύ καλή ταχύτητα (στο 99% των περιπτώσεων):
- Ιδανικά CloudLinux
- 16GB τουλάχιστον μνήμη
- SSD σκληρούς δίσκους (ιδαινκά)
- Apache server με Varnis
- h Cache ή LiteSpeed ή Nginx
- PHP 5.3 τουλάχιστον
- APC cache (ή Memcached για shared cache)
- Optimized MySQL server ή Percona
- Ιδανικά MySQL server σε άλλο ξεχωριστό server
- Κάποιο καλό antivirus
- Κάποιο καλό antispam
- Κάποιο καλό firewall
- Ρυθμίσεις ασφαλείας (hardened linux, suhosin, modsecurity, κτλ)
- BACKUP!
Ίσως τα χαρακτηριστικά αυτά σας φαίνονται too much, αλλά πιστέψτε με ότι οι τιμές έχουν πέσει πάρα πολύ…
Το Load του server πρέπει να είναι χαμηλό και ιδανικά κάτω από 1 αν θέλετε εκπληκτική ταχύτητα. Αν οι επισκέπτες του site είναι από Ευρώπη συμφέρει ο server να είναι σε Ευρωπαϊκό Datacenter (αν είναι από Αμερική σε Αμερικάνικο κ.ο.κ.)
Benchmark before Tweaking
Για να είστε σίγουροι για το αν κάτι βελτίωσε ή όχι την ταχύτητα (και πόσο) συνιστούμε τη χρήση bechmarking tools. Ο πιο πρόχειρος τρόπος είναι να χρησιμοποίησετε το tools.pingdom.com για τις σελίδες που θέλετε να τεστάρετε, να το τρέξετε 2-3 φορές και να βγάλετε το μέσο όρο ταχύτητας φόρτωσης. Ο σωστός τρόπος είναι να χρησιμοποιήσετε εργαλεία όπως:
Για αρχή κάντε login μέσω putty και τρέξτε αυτό:
/usr/local/apache/bin/ab -n 500 -c 20 http://www.tositemou.gr/
και καταγράψτε τα αποτελέσματα.
Apache Cache Configuration
Αν έχετε πρόσβαση στο server (VPS ή Dedicated) μπορείτε να κάνετε όση παραμετροποίηση θέλετε. Η κουβέντα αυτή είναι ατελείωτη οπότε θα σας δώσουμε κάποιες άπλες κατευθυντήριες γραμμές.
Χρειάζεστε PHP 5.3+, MySQL ή Percona 5+ και η PHP να λειτουργεί σε Fast-CGI (ή php-fpm). Στο memory limit βάλτε τουλάχιστον 128 MB.
Αν είστε πιο hardcore δοκιμάστε Nginx (σε συνδιασμό με Apache ή για να το αντικαταστήσετε πλήρως). Σε περίπτωση που έχετε CPanel/WHM μπορείτε να εγκαταστήσετε εύκολα τον Nginx να τρέχει παράλληλα με το Apache για τα στατικά αρχεία με αυτό το plugin: https://www.nginxcp.com/installation-instruction/
Προχωράμε…
Συνιστούμε APC ως Cache (μπορείτε να το εγκαταστήσετε πολύ εύκολα αν δεν το έχετε ήδη) και αν είστε πιο Hardcore μπορείτε να εγκαταστήσετε και το Varnish (αν έχτε WHM/Cpanel δείτε αυτό το plugin).
APC
Το APC κρατά στη μνήμη μεταγλωτισμένη τη PHP (οπότε δε ζορίζεται η CPU) και αν προσθέσετε ένα module στο Drupal μπορείτε να κάνετε cache και user data (συνιστάται). Αφού εγκαταστήσετε το APC πρέπει να το ενεργοποιήσετε στο php.ini του server σας, και να βάλετε κάποιες στοιχεώδεις ρυθμίσεις:
Στην περίπτωση που θέλετε να γίνονται cache όλα τα sites του server από το APC μπορείτε να βάλετε enabled το apc και να ορίσετε cache by default στο on. Αν αντιθέτως θέλετε να κάνει cache μόνο ένα user π.χ. το user account με όνομα mysitegr τότε μια παραμετροποίηση μπορεί να είναι η εξής:
Στην παραπάνω παραμετροποίηση έχουμε δώσει 1G στο APC – ο συγκεκριμένος server έχει 32G μνήμη 🙂
Αν δεν αλλάζετε τα php αρχεία συχνά (έχει τελειώσει το active development) ορίστε το stat σε 0 (και όχι 1 που είναι στο παράδειγμα από πάνω).
Άλλες ρυθμίσεις:
Μπορείτε να δοκιμάστε και την εγκατάσταση του Memcached αν οι περισσότεροι χρήστες του site σας είναι authenticated (κάνουν Login π.χ. Forum, Community…).
Στο Apache configuration συνιστούμε να έχετε τη ρύθμιση Keep Alive ενεργή. Θα χρειαστεί tweaking ο Apache ανάλογα με τη μνήμη του server, το traffic του site σας και άλλους παράγοντες.
MySQL Cache
Συνήθως ένα bottleneck σε sites με μεγάλη επισκεψιμότητα είναι η MySQL. Για καλύτρη ταχύτητα σίγουρα συμφέρει το να βρίσκονται τα αρχεία της MySQL σε SSD σκληρό, και ιδανικά σε άλλο server. Συνήθως αυτό δεν είναι εφικτό οπότε ας δούμε πιο γήινες περιπτώσεις (σημείωση αν θέλετε φιλοξενία σε SSD σκληρούς δίσκους επικοινωνήστε μαζί μας).
Η MySQL για κάποιο περίεργο λόγο στη default της κατάσταση δεν έχει ενεργοποιημένη τη Cache! Οι σοβαρές εταιρίες hosting παραμετροποιούν τη MySQL με cache για να αποδίδει καλύτερα. Για να δείτε το configuration της MySQL ανοίξτε το αρχείο /etc/my.cnf με το αγαπημένο σας editor (vi, nano…) και δείτε τις ρυθμίσεις. Αν δεν λέει πουθενά για Cache έχουμε πολλή δουλειά να κάνουμε… (just kidding, είναι αρκετά εύκολο).
Συνιστώ να κάνετε ένα exit από τον editor και να τρέξετε ένα πρόγραμμα που θα σας δώσει συμβουλές για την παραμετροποίηση της MySQL. Το αγαπημένο μας είναι το Mysqltuner. Το κατεβάζετε:
cd ~
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl && chmod +x mysqltuner.pl
και το τρέχετε.
Κρατήσετε σημειώσεις από το output γιατί θα τα χρησιμοποιήσουμε μετά!
Ξαναανοίξτε το αρχείο my.cnf και πειράξτε τις μεταβλητές που θέλετε και προσθέστε ότι λείπει. Για παράδειγμα ένα configuration μπορεί να είναι το εξής:
Κάντε restart τη MySQL για να εφαρμοστούν οι αλλαγές (και ελέξτε ότι συνεχίζει να δουλεύει το site σας!). Μετά από 10′ ξανατρέξτε το mysqltuner να δείτε αν υπάρχει κάποιο πρόβλημα. Φροντίστε να μη ξεπεράσετε τη διαθέσιμη RAM του μηχανήματος σας: χρησιμοποιήστε ένα Calculator για να δείτε πόσο RAM θα καταναλώσει η MySQL
Μετά από 2 μέρες ξανατρέξτε το mysqltuner και δείτε μήπως χρειάζονται extra tweaks.
Extra tip: Ενεργοποιήστε το slow query logging, δείτε το log μετά από μερικές μέρες, κάντε explain τα αργά queries για να δείτε τι φταίει, και προσθέστε indices στη MySQL βάση σας ανάλογα μα τα αποτελέσματα.
Extra Tip 2: Μπορείτε να χρησιμοποιήσετε και το Tuning primer:
cd ~ && wget http://www.day32.com/MySQL/tuning-primer.sh && chmod +x tuning-primer.sh && ./tuning-primer.sh
Αν σας πει ότι λείπει το bc εγκαταστήστε το: yum -y install bc
Drupal Cache
Αν έχετε ένα site με πολύ χαμηλές απαιτήσεις συνήθως με το να πάτε στο cofiguration του performance και να ενεργοποιήσετε τη Cache είναι αρκετό (συνεχίστε το διάβασμα μόνο από περιέργεια). Αν το site σας έχει μπόλικη επισκεψιμότητα συνιστούμε να εγκαταστήσετε κάποια πολύ ενδιαφέροντα Drupal Modules:
Boost – δημιουργεί static εκδοχές των σελίδων του site σας. Αν το χρησιμοποιήσετε απενεργοποίηστε το core cache
APC – για να αξιοποιήσετε σωστά το APC
APC Admin – Για να σβήνετε εύκολα την APC Cache
Varnish – για extreme καταστάσεις
Authcache – για cachng authenticated χρηστών
Αν δεν έχετε ξαναχρησιμοποίησει τα παραπάνω modules, να σας προειδοποιήσω πως δεν είναι τα απλά modules που κάνεις install και enable και τελείωσε. Χρειάζονται εξτρά παραμετροποίηση, αλλαγές στο .htaccess και στο settings.php του site σας. Υπάρχει καταπληκτικό documentation στο Internet για το πως να τα εγκαταστήσετε. Προτείνω να βάλετε και το apc.php στο site σας για να βλέπετε πως αποδίδει η APC σε ωραίο γραφικό περιβάλλον.
Drupal Extra Configuration
Ενεργοποιήστε στο perfomance το aggregation/compression των css/js αρχείων.
Στο theme σας τσεκάρετε μήπως το έχετε σε ρύθμιση να κάνει rebuild το theme registry κάθε σελίδα.
Στα Modules απενεργοποίσηστε ότι δε χρειάζεστε. Συνιστούμε για αρχή να απενεργοποίησετε τα εξής:
- Devel
- Overlay
- Statistics
- Update status
- Database logging (dblog): Αν θέλετε log, χρησιμοποιήστε το syslog αντί για database logging
- php filter – μη χρησιμοποιείτε χύμα php κώδικα με το php filter γιατί δε γίνεται cache!
Εγκαταστήστε το DB Maintenance και παραμετροποιήστε ποιούς πίνακες θέλετε να κάνει optimize κάθε μέρα.
Στο Cron απενεργοποιήστε το (lazy man’s) cron και φτιάξτε το στο Crontab του διαχειρικού τη φιλοξενίας σας να τρέχει από εκεί. Στο Drupal 7 όταν πάτε στη διαχείριση του Cron κάντε copy paste όλο το URL μαζί με το cron key!
Στο crontab θα συσινστούσαμε να το βάλετε να τρέχει κάθε 1-2 ώρες το πολύ. Δοκιμάστε μια από τις παρακάτω εντολές (με σειρά προτίμησης – αν δε λειτουργήσει η μια χρησιμοποιήστε την επόμενη).
- wget -O – -q -t 1 http://www.example.com/cron.php
- curl -s -c http://example.com/cron.php
- /usr/bin/php /homehttps://www.expereio.com/sites/example.com/public_html/cron.php
Αν έχετε πολύ traffic ή δέχεστε συχνά επιθέσεις (D)DOS αξίζει να επενδύσετε στην χρήση ενός καλού CDN όπως το Cloudflare ή το AKAMAI CDN.
Βελτιώση Ταχύτητας Ερμηνείας Κώδικα από Browser
Σημαντικός χρόνος χάνεται όταν ο browser του τελικού χρήστη προασπαθέι να λάβει και να ερμηνεύσει τα δεδομένα. Η αλήθεια είναι πως δε μπορείτε να κάνετε και πολλά πράγματα αν οι περισσότεροι χρήστες χρησιμοποιούν παλιότερες εκδόσεις Firefox ή IE. Μπορείτε να δείτε τι browsers χρησιμοποιούν οι περισσότεροι επισκέπτες του site σας μέσα από το Google Analytics.
Για να πάρετε πολλές συμβουλές στο τι να κάνετε για τη βελτίωση του κώδικα χρησιμοποιήστε 2 καταπληκτικά εργαλεία:
(ένα άλλο καλό εργαλείο είναι το Yslow)
Βάλτε το site σας, πατήστε το test, και προσπαθήστε να ακολουθήσετε τις συμβουλές που σας λένε τα εργαλεία.
Αν το template που χρησιμοποείτε δεν είναι βελτιστοποιημένο για ταχύτητα σκεφτείτε σοβαρά την αντικατάσταση του.
Όσον αφορά τα πιο πρακτικά πράγματα, ελέγξτε κατά πόσο οι εικόνες στο site σας είναι Web friendly (μικρές σε μέγεθος KB) και αν έχετε πάρα πολλές δοκιμάστε ένα ωραίο module για Lazy Load.
Επίσης αποφύγετε κάποια βαριά widgets όπως το Facebook fan box…
Ταχύτητα Άλλων Servers
Υπάρχει περίπτωση το site σας να φορτώνει 3rd party κώδικα και resources. Συνήθη παραδείγματα είναι τα εξής:
- Google fonts
- Jquery, και άλλα js libriaries
- Social media wisgets, buttons…
Ενδέχεται κάποια από αυτά να μην τα χρειάζεστε στο site σας (ή να τα χρειάζεστε μονο σε 1-2 σελίδες). Οπότε δείτε μηπως μπορείτε να τα απενεργοποίησετε. Αν ο server σας έχει πολύ καλή ταχύτητα υπό περιπτώσεις συμφέρει να κάνετε εσείς host ένα αρχείο αντί να στηρίζεστε σε άλλο server.
Εξαίρεση 3rd party servers είναι το CDN το οποίο συνήθως επιταχύνει την ταχύτητα φόρτωσης (εκτός αν είναι κακής ποιότητας)
Δικά σας Σχόλια & Συμβουλές
Το άρθρο αυτό δεν θα είναι πλήρες χωρίς τα δικά σας σχόλια και τις δικές σας συμβουλές. Γράψτε από κάτω το σχόλιο σας, για το πως έχετε βελτιώνετε εσείς την ταχύτητα του Drupal site σας. Κάθε τόσο θα εμπλουτίζουμε αυτό το άρθρο με τα δικά σας σχόλια.
Resources για εξτρα διάβασμα:
http://cruncht.com/75/drupal-performance-scalability/
https://www.drupal.org/node/1722250
https://www.slideshare.net/akucharski/make-drupal-run-fast-increase-page-load-speed
https://ostraining.com/blog/live/damn-quick-drupal/
Boost: https://www.drupal.org/node/1434362 & https://www.drupal.org/node/1459690
http://www.cameronandwilding.com/blog/jos%C3%A9/how-make-drupal-perform-and-scale-rockstar
https://beeznest.wordpress.com/2012/09/20/drupal-7-https-nginx-varnish-apache-boost-apc-securepages/
APC: https://www.drupal.org/node/1777090