[διάλογος] nginx | apache | php-fpm | hhvm

Τεχνικές και μόνο Συζητήσεις για WEB hosting servers, Mail servers, DNS servers. Όχι αναζήτηση υπηρεσιών εδώ!

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

[διάλογος] nginx | apache | php-fpm | hhvm

Δημοσίευση από giannis17 » 19 Νοέμ 2014 21:05

Σε μερικούς μήνες θα μεταφέρω το hosting μου από vps σε dedicated και εξέταζα την περίπτωση να αλλάξω web-server software. Το vps μου τρέχει apache 2.2 + php 5.3.3 με 26 vhosts εκ των οποίων τα 2 είναι βαριά (~6secs loading time με 50 concurrent users).

Από ram και cpu το vps είναι χαλαρό, το bottleneck και η όλη καθυστέρηση οφείλεται στον σκληρό (hard disk i/o) το οποίο βέβαια θα λυθεί στον dedicated με SSD.

Παρ' όλα αυτά έκανα μερικές δοκιμές σε localhost (2core/2gb ram/sata hdd) με nginx 1.7+hhvm 3.2 έναντι apache2.2+php5.3 fpm. Τα αποτελέσματα ήταν μεικτά, κάτω από τα 20 concurrent connections ο apache ήταν γρηγορότερος με σταδιακή μείωση, ισοβαθμία στα 20 και στα 100 connections 30% πιο αργός από το nginx

Σίγουρα σε site με μεγάλη επισκεψιμότητα θα κάνει διαφορά αλλά πιστεύω δεν αξίζει τον κόπο η μετάβαση (πρέπει να ξαναφτιάξω αρκετά config, να μετατρέψω πράγματα που είναι σε htaccess, κλασικά θα κρασάρει κάποιο SSL και θα θέλει resign) έχοντας κυρίως σελίδες μικρής επισκεψιμότητας.

Η αρχική ιδέα ήταν να χρησιμοποιήσω τον nginx σαν reverse proxy αλλά ήδη χρησιμοποιώ CDN για τα στατικά αρχεία οπότε δεν έχει νόημα.

Πιο πολύ θέλω να ακούσω προσωπικές εμπειρίες από εσάς, τι δοκιμάσατε, που καταλήξατε κλπ.
"There is only one problem with common sense; it’s not very common."
– Milt Bryce

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[διάλογος] nginx | apache | php-fpm | hhvm

Δημοσίευση από Cha0s » 20 Νοέμ 2014 17:38

Βασικά χωρίς να γνωρίζω λεπτομέρειες, με όσα ανέφερες καταλαβαίνω ότι το πρόβλημα δεν είναι ούτε στον web server ούτε στο πως θα φορτώσει η PHP.

Το πρόβλημα είναι στο ότι κάτι σου προκαλεί disk IO.
Η λύση του SSD είναι μπάλωμα του προβλήματος και όχι η λύση του.
Μπορεί βέβαια να έχει παίξει overselling στον host που τρέχει το VPS σου και απλά να σέρνεται ο δίσκος γιαυτό.

Αν το bottleneck σου είναι το disk IO ότι web server και να βάλεις πάλι το ίδιο θα καθυστερεί λόγο disk IO (το iowait είναι «πιο κάτω επίπεδο» από τον webserver).

Εγώ θα πρότεινα να βρεις τι προκαλεί το disk IO και να το διορθώσεις. Έτσι είναι πάρα πολύ πιθανό να μην χρειαστείς καν και SSD (που έχει σαφέστατα μεγαλύτερο ρίσκο να σκάσει και να χάσεις τα πάντα - όπως επίσης και πεπερασμένο αριθμό εγγραφών).


Από εκεί και πέρα, η προσωπική μου εμπειρία είναι πως αν το site είναι σωστά σχεδιασμένο είτε apache είτε nginx την ίδια απόδοση θα έχεις.
Εκτός αν μιλάμε για χιλιάδες requests το δευτερόλεπτο όπου εκεί αρχίζεις και βλέπεις ουσιαστικές διαφορές ναι.

Ένας apache κάνει άνετα handle εκατοντάδες requests/s. Το πρόβλημα δεν είναι στον Apache αλλά είτε στον κώδικα του εκάστοτε site που καθυστερεί να ολοκληρώσει είτε σε κάποιο αργό query της MySQL που αργεί να τελειώσει.

Η αντίληψη που κυκλοφορεί εδώ και μερικά χρόνια ότι ο Apache είναι κακός και με τον nginx θα λυθούν όλα ως διά μαγείας είναι αντίληψη από στησιματάκιδες Joomla/WP/Drupal που δεν έχουν ιδέα τι γίνεται κάτω από το καπό. Διαβάσανε μία μπούρδα κάπου και την αναμασάνε όλοι μαζί γιατί απλά δεν ξέρουν πως δουλεύει το έτοιμο site που βάλανε μαζί με τα 300 plugins για να το φέρουν στα μέτρα τους :P

Αν ο κώδικας ενός site είναι μάπα όπως και να τον τρέξεις πάλι μάπα θα είναι. Είτε με Apache + mod_php είτε με nginx και fcgi είτε με php-fpm είτε οτιδήποτε.
Όπως και να τρέξει ο κώδικας η εκτέλεση του παραμένει ίδια ασχέτως web server μιας και τον κώδικα τον εκτελεί η PHP όχι ο Web server.
Η διαφορά από web server σε web server είναι πως κάνει handle τα connections την μνήμη κλπ. Δεν επιταχύνει σε καμία περίπτωση την εκτέλεση ενός αργού κώδικα.


Ωστόσο για περιπτώσεις που δεν χρειάζεσαι control panel (μιας και κανένα - απόσο γνωρίζω - δεν το υποστηρίζει) η λύση του Apache + php-fpm θεωρώ πως είναι η καλύτερη από θέμα resource usage και έχεις compatibility (σημαντικό - πχ για τα .htacess, mod_rewrite κλπ) και τόνους resources αν χρειαστείς κάτι κάτι που ναι μεν υπάρχει και στον nginx, αλλά είναι διαφορετικά και όχι το 'στάνταρ'.
Ειδικά με ένα APC πάνω στην PHP ανάλογα τον κώδικα του site μπορεί να μειώσει δραματικά το cpu usage της η PHP.
Έχω sites με εκατοντάδες requests/s με Apache + PHP-FPM + APC και παίζουν χαλαρά όταν πριν σε κλασσικό Apache suPHP (cPanel) ή Apache fastcgi (Virtualmin) δεν την πάλευαν μία.

Για το HHVM έχω διαβάσει λίγο αλλά δεν το έχω δοκιμάσει να είμαι ειλικρινής.

Τώρα εντελώς εμπειρικά υποθέτω πως το πρόβλημα σου (disk IO) δεν προέρχεται καν από τον apache/php αλλά από την MySQL. (δεδομένου πως είναι οκ ο host που τρέχει το VPS σου)
Ειδικά αν τρέχεις Joomla/WP. Πολλά από τα queries τους είναι τέτοια όπου αν έχεις πχ χιλιάδες άρθρα σε ένα Joomla και θες να εμφανίσεις τα 10 τελευταία ή κάτι αντίστοιχο, θα φέρει χιλιάδες records, θα τα ρίξει σε έναν tmp table η MySQL, θα κάνει ότι χρειάζεται (sorting, limit, whatever) και έπειτα θα στείλει το αποτέλεσμα στην PHP.

Αυτά τα tmp tables αν είναι πάνω από ένα όριο τα γράφει στον δίσκο. Που σημαίνει με άλλα λόγια αυξημένο disk IO!
Λάβε και υπόψιν πως αν γίνουν 50 τέτοια requests ταυτόχρονα τότε θα προσπαθεί η MySQL να γράψει και να διαβάσει μετά 50 φορές ταυτόχρονα 50 διαφορετικά tmp tables ξεσκίζοντας έτσι σε IOPs τον δίσκο (ειδικά άμα είναι SATA, κλάφτα :P)

Αν έχεις RAM πρόχειρη λύση είναι να βάλεις το tmp dir της mysql σε ένα ramdrive οπότε τα tmp tables να γράφονται στην RAM σταματώντας έτσι κάθε disk IO.
Φυσικά ή λύση είναι να διορθωθεί το schema και τα queries, αλλά 9 στις 10 φορές δεν είναι δυνατό στα ετοιματζίδικα (Joomla/WP/κλπ) ή απλά οι περισσότεροι devs δεν έχουν ιδέα πως να τα διορθώσουν.


Περί reverse proxy προσωπικά προτιμώ τον HAproxy που είναι φτιαγμένος για τέτοια δουλειά ακριβώς.
Μπορεί να κάνει ανετότατα handle δεκάδες χιλιάδες connections (πχ το stackoverflow, serverfault κλπ έχει HAproxy μπροστά από τους webservers για να κάνει το Load balancing) και είναι ακριβώς αυτό. Reverse Proxy. Όχι ένα extra feature σε έναν Web server όπως στον nginx.
Όχι ότι ο nginx είναι κακός, απλά θεωρώ πως είναι καλύτερο να χρησιμοποιούμε το κατάλληλο εργαλείο για κάθε δουλειά ;)
Επίσης μπορείς να κάνεις και SSL termination στον HAproxy (το config του είναι ότι πιο εύκολο έχω δει - όλο το cert, key, ca cert σε ένα PEM formatted αρχείο, 1 γραμμή config και παίζεις SSL με την μία ;) )

Άβαταρ μέλους
giannis17
Honorary Member
Δημοσιεύσεις: 1215
Εγγραφή: 06 Ιαν 2005 19:50
Τοποθεσία: Παγκράτι - Αθήνα
Επικοινωνία:

[διάλογος] nginx | apache | php-fpm | hhvm

Δημοσίευση από giannis17 » 20 Νοέμ 2014 18:49

Κατ' αρχάς ευχαριστώ για την πληρέστατη απάντηση. Όπως είπα γνωρίζω πως με το να αλλάξω software δεν λύνεται το πρόβλημα με τo disk IO, απλά επειδή ούτως ή άλλως θα αλλάξω hardware εξέταζα την επιλογή να αλλαχτεί και το software με την λογική οτι δεν είναι κάτι που το κάνεις κάθε λίγο και λιγάκι.

Από εκεί και πέρα μου πέρασε και μένα από το μυαλό το σενάριο με την mysql απλά είναι κάπως δύσκολο να το δοκιμάσω (δε μπορώ να κατεβάσω έτσι μερικά site για να δω πως πάει...) οπότε θέλω πρώτα να γίνει η μετάβαση στον dedicated και μετά βλέπουμε. Θέλω να πιστεύω πως απλά έχει φτάσει στα όρια του ο sata που εξυπηρετεί 6-7 vps στο ίδιο μηχάνημα.

Όσον αφορά τον SSD θεωρώ έχουν ωριμάσει αρκετά ώστε να μην έχουν τα προβλήματα που είχαν πριν 2-3 χρόνια που απλά πέθαιναν στα καλά καθούμενα. Από εκεί και πέρα ότι και μέσο αποθήκευσης να έχεις backup κάνεις κάθε μέρα. Επίσης το κέρδος σε ταχύτητα πιστεύω αξίζει το κόστος της αντικατάστασης κάθε 1-2 χρόνια.

Ένας reverse proxy πόσο θα ωφελήσει σε ένα περιβάλλον που το στατικό περιεχόμενο δίνεται μέσω CDN;
"There is only one problem with common sense; it’s not very common."
– Milt Bryce

Άβαταρ μέλους
Cha0s
SysAdmin
Δημοσιεύσεις: 10242
Εγγραφή: 28 Ιούλ 2001 03:00

[διάλογος] nginx | apache | php-fpm | hhvm

Δημοσίευση από Cha0s » 20 Νοέμ 2014 19:22

Ο Reverse proxy δεν βοηθάει σε κάτι όσον αφορά το static content.
Είναι απλά proxy, δεν σερβίρει κάτι ο ίδιος. Απλά διαχειρίζεται τα HTTP Connections και τα δρομολογεί στα backends ανάλογα πως θα τον ρυθμίσεις.

Αυτή είναι η δουλειά του reverse proxy.
Τώρα αν εννοείς να σερβίρεις το static content πχ από nginx και το dynamic από apache + το CDN μπροστά για το static content, προσωπικά το θεωρώ τελείως ανούσιο και μάλλον δεν θα κερδίσεις τίποτα.

Γενικά το static content δεν προκαλεί load διότι δεν γίνεται process τίποτα. Read and serve είναι. Μόνο traffic δηλαδή. Μπορεί και ένας apache να σερβίρει εκατοντάδες requests για static content χωρίς να ιδρώσει καν.

Γιαυτό ανέφερα ότι η ιδέα που κυκλοφορεί τα τελευταία χρόνια του στυλ βάλε το static content στον nginx, βγάλε τον apache κλπ χωρίς να διορθωθεί η ρίζα του προβλήματος (δηλαδή το μάπα site) είναι απλά μπούρδα και δεν βοηθάει σε τίποτα.


Γενικά είμαι της άποψης πως πλέον με τους servers και τα διαθέσιμα software που υπάρχουν δεν τίθεται θέμα optimization σε επίπεδο server. Αν μιλάγαμε για υπηρεσίες με δεκάδες χιλιάδες requests per second σαφώς και υπάρχουν πράγματα που μπορούν να γίνουν optimize σε επίπεδο networking, kernel κλπ. Αλλά για απλό web hosting τα defaults pretty much κάνουν για κάθε σωστά σχεδιασμένο site.
Αν κάτι αργεί ή κολλάει 9 στις 10 φορές είναι λόγω μάπα κώδικα στο site ή μάπα db schema ή/και queries και όχι λόγω server ή software.

Απάντηση

Επιστροφή στο “Apache, IIS, DNS Servers”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες