Σε αυτό το άρθρο θα κάνουμε μια εισαγωγή στον Nginx HTTP Webserver (ω ναι, υπάρχουν κι άλλοι webservers πέρα από τον Apache) ο οποίος είναι ένας από τους ταχύτερους Web Server και μπορεί να χρησιμοποιηθεί με ποικίλους τρόπους.
Όταν λέω ότι θα κάνουμε μία εισαγωγή, εννοώ ότι θα ξεκινήσουμε την εξερεύνηση απαντώντας σε κάποια από τα βασικά ερωτήματα, όπως:
- Σε τι διαφέρει από τον Apache;
- Ποια είναι να χαρακτηριστικά του;
- Γιατί να ασχοληθούμε μαζί του;
Καταρχάς, ο Nginx δεν είναι καινούριος. Υπάρχει εδώ και αρκετό καιρό στην πιάτσα, συγκεκριμένα το dev ξεκίνησε το 2002 και το 2004 κυκλοφόρησε η πρώτη του έκδοση. Ωστόσο το τελευταίο διάστημα βλέπω ότι έχει αρχίζει να τραβάει πάνω του αρκετή προσοχή.
Μάλιστα, δεν είναι λίγοι εκείνοι που έκαναν την μετάβαση από τον «Βασιλιά Των Webservers» (βλ.Apache) στον Nginx. Παρόλα αυτά, ο Apache εξακολουθεί να κρατάει σταθερά τα ηνία του HTTP, αφού κατέχει περίπου το 50-75% των webservers του Internet. Το ερώτημα, λοιπόν, είναι:
Γιατί να ασχοληθεί κανείς με τον Nginx
Σαν κλασσικός σπασίκλας, θα σας κάνω quote από την Wikipedia:
Nginx is an open source reverse proxy server for HTTP, HTTPS, SMTP, POP3, and IMAP protocols, as well as a load balancer, HTTP cache, and a web server.
Ωραία και; Γιατί να μην βάλω Apache;
Η πιο λογική ερώτηση είναι γιατί να μην ασχοληθεί κανείς με τον Apache; Μία σκέψη που θα μπορούσε να πει κάποιος είναι: «Εδώ το μισό Internet σερβίρει… σε εμένα θα «κολλήσει»; »
Καταρχάς μην πάσχετε από Argumentum ad populum. Κατά δεύτερον, η διαφορά του Nginx με τον Apache, είναι ότι ο Nginx κάνει τα ίδια πράγματα, αλλά με τα «διαφορετικό τρόπο». Τώρα θα μου πείτε, τι εννοείς λέγοντας «διαφορετικό«; Είναι «καλύτερος«; Είναι «χειρότερος«;
Well, in this context I mean . . .
διαφορετικός τρόπος = πολλές φορές καλύτερος από τον Apache
Για να το πω πιο τεχνικά, ο Nginx διαφέρει από τον Apache στον τρόπο που χειρίζεται τα requests. Ας αρχίζουμε όμως με τον Apache, ο οποίος μεταχειρίζεται (by default) τα requests όπως και η κάρτα γραφικών, δηλαδή: παράλληλα και σεthreads
.
Το μοντέλο αυτό θα το ακούσετε και αλλιώς ως process-oriented
. Με απλά λόγια, σημαίνει ότι: για 1 connection κάνει generate τουλάχιστον 1 thread, και φυσικά ο σκοπός είναι να τα επεξεργάζεται (όλα αυτά τα) threads παράλληλα. Πολύ έξυπνο! Πάντα ήμουν fan του parallel thread processing, αλλά πριν βιαστείτε δώσετε ±1, πρέπει πρώτα να σκεφτείτε ποια είναι τα πλεονεκτήματα και τα μειονεκτήματα αυτού του μοντέλου.
Ένα από τα μειονεκτήματα είναι το γεγονός ότι αν έχουμε μπόλικο static content, δηλ. πολλά αρχεία, τότε αρχίζει και καταλαμβάνει περισσότερη μνήμη από το κανονικό, και αυτό το φαινόμενο συνεχίζει να επιδεινώνεται μέχρι να τερματίσει το εκάστοτε session.
Από την άλλη μεριά, ο Nginx δεν λειτουργεί με αυτόν τον τρόπο. Χρησιμοποιεί έναν asynchronous event-handler
και με αυτόν διαχειρίζεται τα requests.
Αυτό σημαίνει ότι, ακόμα κι αν μεταχειρίζεται τις εισερχόμενες connections ως ανεξάρτητες μεταξύ τους, τις επιτρέπει να μοιράζονται, να κάνουν share, το memory space.
Αυτό το γεγονός επιτρέπει στον Nginx να αποδίδει πολύ καλά κάτω υπό συνθήκες μεγάλου φόρτου. Και στην πραγματικότητα, αυτός είναι ο πιο σημαντικός λόγος για τον οποίον αρκετοί προτιμούν τον Nginx έναντι του Apache. Με τον Apache webserver, μπορείτε να σερβίρετε ταυτόχρονα/παράλληλα μερικές εκατοντάδες connections, οι οποίες όμως εξαρτώνται «αρκετά» από τα hardware resources, και συγκεκριμένο τον χώρο και την μνήμη που διαθέτει το μηχάνημα.
Ειδικά τώρα που τα περισσότερα websites φορτώνουν διάφορα CMS, όπως WordPress, Drupal ή Joomla, το καθένα από αυτά είναι αρκετά βαρύ και μπορεί να γίνει ακόμα πιο βαρύ προσθέτοντας διάφορα plugin. Συνεπώς, μην σας παραξενεύει ότι το VPS των 5 Ευρώ που νοικιάζετε (π.χ. digitalocean.com), με 128mb RAM, Apache και WordPress, αρχίζει να σέρνεται σε ώρες αιχμής. Σε αντίθεση, ο Nginx μπορεί να ανταπεξέλθει εξυπηρετώντας (όχι εκατοντάδες, αλλά) χιλιάδες connections με μικρότερη ή τουλάχιστον ίδια μνήμη, χωρίς να έχει πρόβλημα με τις sessions.
Nginx Features
Ο Nginx έχει ένα κάρο χαρακτηριστικά, αλλά θα σταθούμε στα πιο σημαντικά, ενώ θα τα συγκρίνουμε και με τα αντίστοιχα του Apache.
- Διαχειρίζεται static files, index files, και κάνει auto indexing: Το ίδιο και ο Apache, πάμε παρακάτω…
- Reverse proxy with caching: Το ίδιο μπορεί να γίνει και στον Apache, αλλά απαιτεί επιπλέον modules
- Load balancing: Το ίδιο κάνει και ο Apache, αλλά θέλει plugin, ενώ ο Nginx το κάνει έχει built-in ;)
- Support fault tolerance: Σας επιτρέπει να κάνετε configure πολλούς nodes που θα μοιρίζονται το ίδιο session state στην μνήμη μεταξύ τους. Δεν υπάρχει κάτι αντίστοιχο για τον Apache.
- OpenSSL Support (including SNI και OCSP stapling): Αυτό είναι σημαντικό γιατί όπως είδατε πρόσφατα, το SSL είναι πλέον το πιο trendy στόχαστρο των hackers. Οπότε, υποστηρίζοντας τα latest and greatest της κρυπτογραφίας,ίσως είναι καλύτερο.
- FastCGI, PHP-FPM και SCGI Support: Στην ουσία είναι modules που προσδίδουν την δυνατότητα εκτέλεσης scripts (πχphp), τα οποία μπορεί να κάνουν οτιδήποτε μας έρθει στο κεφάλι, αλλά αυτά που συναντάμε συνήθως έχουν να κάνουν με τα κλασσικά πράγματα που απασχολούν τον web development, όπως πχ το authetication.
- Fully IPv6: Υποστηρίζει πλήρως το IPv6. Το ίδιο και ο Apache αλλά με module, μετά την έκδοση 2.2
- Websockets και HTTP/1.1: Αναμενόμενο και για τους δύο, αφού είναι webserver.
- Live stream file compression: Ιδανικό για video streaming. Ο Apache δεν διαθέτει κάτι ανάλογο.
- URL Redirects και rewriting: Ψωμοτύρι για τους webservers, πάμε παρακάτω…
- Bandwidth Throttling: Υποστηρίζεται και στον Apache μέσω modules, ενώ στον nginx είναι απλά μία ρύθμιση το base configuration file.
- Geolocation of IP: Από τις πιο sexy τεχνολογίες του Nginx, όπου σου παρέχει έναν τρόπο να κάνεις διαχείριση των IP σε σχέση με την τοποθεσία τους. Χρησιμοποιείται κυρίως για CDNs που σερβίρουν static content.
- ΠΟΛΥ Λίγη μνήμη: Όπως είπαμε και πριν, μπορεί να διαχειριστεί 10.000 ταυτόχρονες συνδέσεις με μόλις 2.5mb μνήμης χωρίς πρόβλημα στο keep-alive πάρα-δώσε που έχουν οι sessions για να παραμένουν ανοιχτές.
Είναι η νέα γενιά των webservers
Όπως ξέρουμε τα πράγματα σήμερα, ο Apache είναι ο Βασιλιάς των Webserbers, σερβίροντας το Internet στα πιάτα των περισσότερων ανθρώπων. Ωστόσο, όσο το Internet of Things αρχίζει να μπαίνει όλο και περισσότερο στην ζωή μας, η ανάγκη για better perfomance γίνεται όλο και πιο επιτακτική.
Σκεφτείτε πόσες συσκευές χρησιμοποιούμε στην καθημερινότητά μας, και πόσες από αυτές χρησιμοποιούν δίκτυο: TV, Smart-Watch, Smartphones, Keyboards, Tablets κλπ είναι λογικό λοιπόν, αφού αυξάνονται οι clients να αυξάνονται και τα connections προς τους servers.
Σκεπτόμενοι ότι ο average Joe θέλει να έχει άμεση πρόσβαση στο περιεχόμενό του, είναι ανυπόμονος και θέλει να του σερβίρουν (server) το φαγητό (web) «τώρα«, τότε τουλάχιστον 2 πράγματα είναι ξεκάθαρα ότι θα χρειαστούμε:
- Μείωση του Response Time
- Περισσότερες παράλληλες συνδέσεις
Για την ώρα λοιπόν, όσο η ανάγκη για το Internet of Things μεγαλώνει, τόσο μεγαλύτερη διαφήμιση θα αποκτά ο Nginx.
Μπορείτε να διαβάσετε το δεύτερο και τρίτο μέρος του άρθρου:
Αρκετά ενδιαφέρων άρθρο.
Απλά θα έπρεπε να σημειώσεις ότι και το Nginx + Apache μπορεί να συνυπάρχουν μαζί στο ίδιο Διακομιστή.
Nginx αναλαμβάνει να «σερβίρει» περιεχόμενο προς τον έξω κόσμο, ενώ το Apache διαχειρίζεται το περιεχόμενο εσωτερικά και το παραδίδει προς τον Nginx.
Έτσι το Nginx είναι «σερβιτόρος» και το Apache «κουζίνα η μάγειρας» περιεχόμενου.
Αυτό το «πάντρεμα» και τον δύο υπάρχει εδώ https://vestacp.com/
Μετά από μία εγκατάσταση του VestaCP έχεις και το ένα και το άλλο, ναι με μερικές trick μπορείς να κάνεις και το ένα και το άλλο να λειτουργούν καλύτερα, άλλα εδώ είναι θέμα πλέον του Διαχειριστή.
@Sergios Πω..πω τρομερό δε το ήξερα! :D
Φαίνεται πάρα πολύ ενδιαφέρον! Ευχαριστούμε που το μοιράστηκες μαζί μας!
@Βικελίδης Κώστας
Μπορεί να ισχύει και αυτό που λες εσύ φίλε, πάντως εγώ από τα παραπάνω του Σέργιου καταλαβαίνω κάτι παραπάνω.. πως αυτή η συνύπαρξη προσφέρει ίσος περισσότερα και σημαντικότερα οφέλη από αυτά που λες.
Μπράβο πολύ καλή παρουσίαση.
@Sergios
Ναι μπορούν να συνυπάρχουν αλλά το μόνο όφελος είναι η υποστήριξη των .htaccess αρχείων. Τα περισσότερα CMS αναπτύχθηκαν την εποχή που μεσουρανούσε ο apache οπότε για rewrite στα URL’s χρησιμοποιούσαν .htaccess αρχεία. Νομίζω ότι αυτή η συνύπαρξη είναι ένα μεταβατικό στάδιο μέχρι να απεξαρτητοποιηθούμε από τα .htaccess.
Μετά από αυτό Ngixn rules!!!
Καταρχήν μου άρεσε πολύ το άρθρο αυτό και οι διαφορές μεταξύ των δύο web servers που μας παραθέτεις. Μπράβο σου πάρα πολύ ενδιαφέρον άρθρο!
Επιπλέον που μας παραθέτεις και μερικά χαρακτηριστικά των web servers ( πολύ καλή ιδέα ).
Από ότι είδα ( σαν υποστηριχτής του apache )
Support fault tolerance : Δε το κατάλαβα καλά τι κάνει.. κρίμα πάντως που δε το έχει ο Apache.
OpenSSL Support (including SNI και OCSP stapling): Δε το έχει ο Apache ;
FastCGI, PHP-FPM και SCGI Support : Δε το έχει ο Apache ;
Live stream file compression : Όντως κρίμα που δεν έχει κάτι ανάλογο ο Apache.
Geolocation of IP : Μάλλον το προσφέρει πολύ ωραία ο NGINX, αλλά και ο Apache αν δε κάνω λάθος έχει κάτι ανάλογο.
ΠΟΛΥ Λίγη μνήμη : Όσο για αυτό, θα ήθελα περισσότερα πράγματα να ακούσω για να με πείσεις ( και τεχνικά εννοώ ). Πολύ ωραία η μια πρόταση που λες ( για τους απλούς χρήστες ), αλλά θα έπρεπε κατά την άποψη μου να τεκμηριώνεται παραπάνω ( ειδικά για τους πιο εξειδικευμένους χρήστες ).
Πάντως οκ καταλαβαίνω πως είναι κάτι νέο, έχει φτιαχτεί με τα νέα πρότυπα εξ αρχής και ίσος είναι πολύ καλός, αλλά είμαι λίγο τύπος που δεν αφήνει εύκολα μια σχέση διάρκειας πολλών ετών.. ^_^ :P
Επιπλέον μη μου πείτε τώρα πως και ο καθένας απαιτεί τόσο πολύ καλές επιδόσεις αμέσως από την σελίδα του.
Πάντως πιστεύω πως και ο Apache όσο πίσω και αν βρίσκεται σε κάποια πράγματα ( πολύ η λίγο ), είναι καλό που πλέον έχει έναν καλό αντίπαλο και αυτό θα τον βοηθήσει να αναπτυχθεί ακόμη περισσότερο. ;)