Πώς να Κάνετε Ένα Drupal Website Πιο Γρήγορο

Η ταχύτητα φόρτωσης ενός site είναι κρίσιμης σημασίας για την επιτυχία του. Όπως είχαμε αναφέρει και σε προηγούμενο άρθρο για το Joomla, η ταχύτητας φόρτωση επηρρεάζει:

  • την εμπειρία χρήστη (καλύτερη εμπειρία χρήστη = περισσότερα conversions = αυξημένη πιθανότητα κερδοφορίας)
  • καλύτερες κατατάξεις στο Google (SEO)
  • καλύτερο Google AdWords Quality Score (χαμηλότερο CPC/καλύτερο Ad position)

Συνεπώς έχουμε κάθε δίκιο να είμαστε πορωμένοι με το θέμα της ταχύτητας 🙂

Drupal

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 φορές και να βγάλετε το μέσο όρο ταχύτητας φόρτωσης. Ο σωστός τρόπος είναι να χρησιμοποιήσετε εργαλεία όπως:

  • Devel module
  • XHprof
  • Apache Benchmark – AB
  • και 3rd party εργαλεία όπως το καταπληκτικό Newrelic

Για αρχή κάντε 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 τότε μια παραμετροποίηση μπορεί να είναι η εξής:

[APC]
apc.enabled = 1
;;apc.shm_segments=1
apc.shm_size = 1G
;Relative to the number of cached files (you may need to watch your stats for a day or two to find out a good number)
apc.num_files_hint = 5000
;Relative to the size of Site
;;apc.user_entries_hint=4096
;The number of seconds a cache entry is allowed to idle in a slot before APC dumps the cache
apc.ttl = 90
;;apc.ttl=90
apc.user_ttl = 90
;;apc.user_ttl=90
;;apc.gc_ttl=3600
;Setting this to 0 will give you the best performance, as APC will
;not have to check the IO for changes. However, you must clear
;the APC cache to recompile already cached files. If you are still
;developing, set this to 1
apc.stat=1
;This MUST be 0, WordPress can have errors otherwise!
apc.include_once_override=0
;Only set to 1 while debugging
apc.enable_cli = 0
;Allow 2 seconds after a file is created before it is cached to prevent users from seeing half-written/weird pages
apc.file_update_protection = 2
;Leave at 2M or lower. WordPress does’t have any file sizes close to 2M
apc.max_file_size = 4M
;Ignore files
apc.filters = “+(mysitegr)”
apc.cache_by_default = 0
;;apc.use_request_time=1
;;apc.slam_defense=0
;apc.mmap_file_mask=/var/www/temp/apc.XXXXXX
;;apc.stat_ctime=0
;;apc.canonicalize=1
;;apc.write_lock=1
;;apc.report_autofilter=0
;;apc.rfc1867=0
;;apc.rfc1867_prefix =upload_
;;apc.rfc1867_name=APC_UPLOAD_PROGRESS
;;apc.rfc1867_freq=0
;;apc.rfc1867_ttl=3600
;;apc.lazy_classes=0
;;apc.lazy_functions=0

Στην παραπάνω παραμετροποίηση έχουμε δώσει 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 μπορεί να είναι το εξής:

thread_cache_size =8
innodb_buffer_pool_size = 192M
open_files_limit=8230
join_buffer_size=1M
query_cache_size=36M
query_cache_limit=8M
table_cache=192
sort_buffer_size=12M
myisam_sort_buffer_size=12M
tmp_table_size=24M
max_heap_table_size=24M

Κάντε 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
με αυτόν τον τρόπο δεν θα πέφτει ο κλήρος κάθε μια ώρα σε ένα άτυχο επισκέπτη που θε πρέπει να περιμένει να τρέξει το Cron.

Αν έχετε πολύ traffic ή δέχεστε συχνά επιθέσεις (D)DOS αξίζει να επενδύσετε στην χρήση ενός καλού CDN όπως το Cloudflare ή το AKAMAI CDN.

Βελτιώση Ταχύτητας Ερμηνείας Κώδικα από Browser

Σημαντικός χρόνος χάνεται όταν ο browser του τελικού χρήστη προασπαθέι να λάβει και να ερμηνεύσει τα δεδομένα. Η αλήθεια είναι πως δε μπορείτε να κάνετε και πολλά πράγματα αν οι περισσότεροι χρήστες χρησιμοποιούν παλιότερες εκδόσεις Firefox ή IE. Μπορείτε να δείτε τι browsers χρησιμοποιούν οι περισσότεροι επισκέπτες του site σας μέσα από το Google Analytics.

Για να πάρετε πολλές συμβουλές στο τι να κάνετε για τη βελτίωση του κώδικα χρησιμοποιήστε 2 καταπληκτικά εργαλεία:

https://pagespeed.web.dev/

https://tools.pingdom.com/

(ένα άλλο καλό εργαλείο είναι το 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://www.dwuser.com/education/content/drupal-performance-optimization-how-to-get-your-site-to-perform-its-best/

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

 

Αφήστε ένα Σχόλιο

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *