Εισαγωγή
Nginx είναι ένας διακομιστής ιστού υψηλής απόδοσης που χρησιμοποιείται επίσης ως αντίστροφος διαμεσολαβητής (reverse proxy), διαμεσολαβητής αλληλογραφίας (mail proxy), εξισορροπιστής φορτίου (load balancer) και προσωρινή μνήμη HTTP (HTTP cache). Το Nginx είναι δωρεάν και ανοιχτού κώδικα, επιτρέποντας σε οποιονδήποτε να το κατεβάσει και να το χρησιμοποιήσει στο περιβάλλον του διακομιστή του.
Ίσως έχετε ήδη χρησιμοποιήσει το Nginx για τη φιλοξενία ιστότοπων. Σε αυτόν τον οδηγό, θα συζητήσουμε τις άλλες δυνατότητες του Nginx. Η δυνατότητα διαμεσολάβησης HTTP του Nginx του επιτρέπει να μεταβιβάζει αιτήματα σε διακομιστές HTTP υποστήριξης (backend) για επεξεργασία. Με αυτή τη δυνατότητα, μπορείτε να ρυθμίσετε πολλαπλούς διακομιστές backend. Σας επιτρέπει να κλιμακώσετε την υποδομή σας όπως απαιτείται για να διαχειριστείτε τις αυξήσεις στα αιτήματα των πελατών.
Καθώς προχωράμε με τον οδηγό, θα μάθετε για την κλιμάκωση της υποδομής σας χρησιμοποιώντας τις ιδιότητες εξισορρόπησης φορτίου του Nginx, προσωρινής αποθήκευσης (buffering), και αποθήκευσης σε κρυφή μνήμη (caching) αποκρίσεων για τη βελτίωση της απόδοσης του διακομιστή σας καθώς και για τη διασφάλιση μιας καλύτερης εμπειρίας για τους πελάτες. Ας ξεκινήσουμε!
Πρώτα απ' όλα, για να ξεκινήσετε με το Nginx ρίξτε μια ματιά στον οδηγό μας για το πώς να εγκαταστήσετε το Nginx στον διακομιστή Ubuntu σας.
Γενικές Πληροφορίες σχετικά με τη Διαμεσολάβηση
Εάν οι γνώσεις σας σχετικά με τους διακομιστές ιστού αφορούν μόνο την επεξεργασία αιτημάτων ιστότοπων και την παροχή ιστοσείδων, ίσως αναρωτιέστε γιατί πρέπει να κάνουμε διαμεσολάβηση αιτημάτων. Παρακάτω θα εξηγήσουμε τους λόγους πίσω από αυτό.
Ένας λόγος για τη διαμεσολάβηση αιτημάτων σε άλλους διακομιστές από το Nginx είναι η υποστήριξη της κλιμακωσιμότητας της υποδομής σας. Το Nginx από προεπιλογή διαχειρίζεται πολλές συνδέσεις ταυτόχρονα. Αυτό το καθιστά ιδανικό ως το πρώτο σημείο επαφής για τους πελάτες. Στη συνέχεια, μπορεί να μεταβιβάσει τα αιτήματα σε διάφορους διακομιστές backend για να χειριστούν την πραγματική επεξεργασία των αιτημάτων των πελατών. Αυτό είναι που κατανέμει το φορτίο. Συνεπώς, διασφαλίζει ότι μπορείτε να κλιμακώσετε την υποδομή σας όσο το δυνατόν περισσότερο. Σας επιτρέπει επίσης να θέτετε εκτός λειτουργίας άλλους διακομιστές για συντήρηση, ενώ άλλοι συνεχίζουν να εξυπηρετούν αιτήματα.
Ο δεύτερος λόγος για τον οποίο μπορεί να θέλετε να κάνετε διαμεσολάβηση αιτημάτων σε άλλους διακομιστές είναι όταν χρησιμοποιείτε διακομιστές εφαρμογών που δεν είναι κατάλληλοι για να χειρίζονται αιτήματα απευθείας από πελάτες σε πραγματικά περιβάλλοντα παραγωγής. Διάφορα πλαίσια (frameworks), συμπεριλαμβανομένων των διακομιστών ιστού, δεν είναι κατάλληλα για υψηλή απόδοση όπως το Nginx. Επιτρέποντας στο Nginx να είναι το σημείο εισόδου και να κάνει διαμεσολάβηση αιτημάτων σε αυτούς τους διακομιστές χαμηλής απόδοσης μπορεί να διασφαλίσει ότι οι χρήστες σας θα έχουν καλύτερη εμπειρία. Επιπλέον, μπορεί να εγγυηθεί αυξημένη ασφάλεια για την εφαρμογή σας.
Η διαδικασία διαμεσολάβησης αιτημάτων στο Nginx περιλαμβάνει τον χειρισμό ενός αιτήματος από τον διακομιστή Nginx και τη μεταβίβασή του σε άλλους διακομιστές backend για την πραγματική επεξεργασία. Μόλις οι άλλοι διακομιστές backend επεξεργαστούν το αίτημα, επιστρέφουν το αποτέλεσμα στο Nginx. Στη συνέχεια, αυτό στέλνει το αποτέλεσμα ως απόκριση στον πελάτη. Ο πελάτης σε αυτή την περίπτωση είναι ένα πρόγραμμα περιήγησης ιστού ή ακόμα και μια εφαρμογή ιστού για κινητά. Οι άλλοι διακομιστές backend μπορεί να είναι τοπικοί διακομιστές που δεν είναι δημόσια προσβάσιμοι στο διαδίκτυο, απομακρυσμένοι διακομιστές ή ακόμα και άλλοι εικονικοί διακομιστές εντός των ρυθμίσεων των server blocks του Nginx. Αυτοί οι άλλοι διακομιστές στους οποίους το Nginx κάνει διαμεσολάβηση αιτημάτων αναφέρονται ως upstream servers.
Το Nginx μπορεί να κάνει διαμεσολάβηση αιτημάτων σε διακομιστές που επικοινωνούν χρησιμοποιώντας διάφορα πρωτόκολλα, συμπεριλαμβανομένων των HTTP(S), Memcached, SCGI, FastCGI, και uWSGI. Για κάθε τύπο πρωτοκόλλου, υπάρχουν σύνολα οδηγιών. Η εστίασή μας για αυτόν τον οδηγό είναι το πρωτόκολλο HTTP. Το Nginx αναλύει τα αιτήματα και τα στοιχεία μηνυμάτων σε μια μορφή που ο διακομιστής upstream μπορεί να ερμηνεύσει και να επεξεργαστεί.
Ανάλυση ενός Βασικού HTTP Proxy Pass
Ο απλούστερος τύπος διαμεσολάβησης περιλαμβάνει τη μεταβίβαση ενός αιτήματος σε έναν μόνο διακομιστή που επικοινωνεί μέσω HTTP. Αυτός ο τύπος διαμεσολάβησης αναφέρεται γενικά ως «proxy pass» και αντιμετωπίζεται από την κατάλληλα ονομασμένη οδηγία proxy_pass μέσα στα αρχεία ρυθμίσεων του Nginx.
Η οδηγία proxy_pass εμφανίζεται μέσα σε location blocks. Βρίσκεται επίσης μέσα σε blocks ενός location context και σε limit_except contexts. Όταν ένα αίτημα ταιριάζει με ένα location με μια οδηγία proxy_pass, το αίτημα πηγαίνει στη διεύθυνση URL που καθορίζει η οδηγία. Παρακάτω είναι ένα παράδειγμα αποσπάσματος ρυθμίσεων:
|
1 2 3 4 |
listen 80; location / { proxy_pass http://127.0.0.1:3000; } |

Στο παραπάνω παράδειγμα, τα αιτήματα στη θύρα 80 θα πήγαιναν στο localhost:3000:

Το παραπάνω στιγμιότυπο οθόνης δείχνει την προεπιλεγμένη σελίδα του Nginx όταν προσπαθείτε να συνδεθείτε στο localhost. Μετά την επανεκκίνηση του διακομιστή Nginx με την οδηγία proxy pass σε ισχύ, όλα τα αιτήματα θα πηγαίνουν στη θύρα 3000. Μια δοκιμαστική εφαρμογή εκτελείται στη θύρα 3000, την οποία μπορείτε να δείτε από την παρακάτω εικόνα και στην οποία μπορείτε να έχετε πρόσβαση απευθείας από το localhost χωρίς να καθορίσετε τη θύρα:

Στο επόμενο παράδειγμα, δεν έχει καθοριστεί URI στο τέλος του διακομιστή στον ορισμό του proxy_pass. Για ορισμούς που ταιριάζουν σε αυτό το μοτίβο, το URI που ζητά ο πελάτης θα μεταβιβαστεί στον upstream διακομιστή ως έχει.
|
1 2 3 |
location /match/url/here { proxy_pass http://example.com; } |
Για παράδειγμα, όταν αυτό το μπλοκ διαχειρίζεται ένα αίτημα για το /match/url/here, το URI του αιτήματος θα μεταβεί στον διακομιστή example.com ως http://example.com/match/url/here.
Παρακάτω είναι ένα παράδειγμα ενός εναλλακτικού αποσπάσματος κώδικα ρυθμίσεων:
|
1 2 3 |
location /match/url/here { proxy_pass http://example.com/new/url/prefix; } |
Όπως μπορείτε να δείτε στο παραπάνω απόσπασμα, έχουμε ορίσει ένα τμήμα URI στο τέλος του διακομιστή μεσολάβησης (proxy server) ως new/url/prefix. Όταν ορίζετε ένα URI στον ορισμό του proxy_pass, το τμήμα του αιτήματος που ταιριάζει με τον ορισμό του location αντικαθίσταται από αυτό το URI κατά τη μετάβαση στον upstream διακομιστή για επεξεργασία.
Για παράδειγμα, ένα αίτημα για το /match/url/here στον διακομιστή Nginx μεταβιβάζεται στον upstream διακομιστή ως http://example.com/new/url/here. Το /match/url αντικαθίσταται από το /new/url. Έχετε αυτό το σημείο υπόψη σας.
Σε ορισμένες περιπτώσεις, η μεταβίβαση των URI όπως παραπάνω δεν είναι εφικτή. Σε τέτοιες περιπτώσεις, ο Nginx αγνοεί το URI στο τέλος του ορισμού του proxy_pass. Τελικά, είτε το αρχικό URI από τον πελάτη είτε το URI που τροποποιούν άλλες οδηγίες μεταβιβάζεται στον upstream διακομιστή.
Ένα παράδειγμα είναι όταν οι κανονικές εκφράσεις (regular expressions) ταιριάζουν με το location. Ο Nginx ενδέχεται να μην είναι σε θέση να προσδιορίσει ποιο μέρος του URI ταιριάζει με την έκφραση. Επομένως, στέλνει το αρχικό URI αιτήματος του πελάτη. Αυτό προκαλεί την αναγραφή (rewriting) και τον χειρισμό του URI του πελάτη στο ίδιο μπλοκ. Σε μια τέτοια περίπτωση, μεταβιβάζεται το αναγεγραμμένο URI.
Πώς επεξεργάζεται ο Nginx τις κεφαλίδες (Headers);
Οι κεφαλίδες είναι κρίσιμες για τον τρόπο με τον οποίο ένας διακομιστής επεξεργάζεται ένα αίτημα. Ορισμένες κεφαλίδες ενδέχεται να περιλαμβάνουν πληροφορίες ελέγχου ταυτότητας (authentication). Επομένως, πρέπει να κατανοήσουμε πώς η μεσολάβηση (proxying) του Nginx θα επεξεργάζεται τις κεφαλίδες. Το αίτημα μεσολάβησης από τον Nginx προς τον upstream διακομιστή θα φαίνεται διαφορετικό από εκείνο που προήλθε απευθείας από τον πελάτη. Ορισμένες από τις διαφορές είναι αποτέλεσμα των κεφαλίδων που συνοδεύουν το αίτημα μεσολάβησης.
Κατά τη διάρκεια της μεσολάβησης ενός αιτήματος, ο Nginx θα κάνει προσαρμογές στις κεφαλίδες αιτήματος που λαμβάνει από τον πελάτη. Ορισμένες από αυτές τις προσαρμογές περιλαμβάνουν:
-
Την κατάργηση όλων των κενών κεφαλίδων. Οι κενές κεφαλίδες απλώς διογκώνουν το αίτημα, επομένως δεν υπάρχει λόγος να μεταβιβαστούν στον upstream διακομιστή.
-
Οποιεσδήποτε κεφαλίδες περιέχουν κάτω παύλες (underscores) θεωρούνται άκυρες από προεπιλογή, επομένως αφαιρούνται από το αίτημα. Εάν θέλετε να αλλάξετε αυτήν τη συμπεριφορά και να επιτρέψετε στον Nginx να ερμηνεύει τις κεφαλίδες με κάτω παύλες ως έγκυρες, τότε μπορείτε να ορίσετε την οδηγία underscores_in_headers σε “on”. Εάν δεν το κάνετε, τότε τέτοιες κεφαλίδες από τον πελάτη δεν θα φτάσουν ποτέ στον upstream διακομιστή.
-
Η κεφαλίδα “Host” αναγράφεται ξανά στην τιμή που καθορίζεται από τη μεταβλητή $proxy_host. Αυτή είναι η διεύθυνση IP ή το όνομα και ο αριθμός θύρας του upstream διακομιστή, όπως καθορίζεται από την οδηγία proxy_pass.
-
Η τιμή της κεφαλίδας “Connection” αλλάζει σε “close”. Η κεφαλίδα σύνδεσης περιέχει πληροφορίες σχετικά με μια συγκεκριμένη σύνδεση που έχει δημιουργηθεί μεταξύ δύο μερών. Όταν ο Nginx ορίζει την τιμή της σε close, υποδεικνύει στον upstream διακομιστή ότι η σύνδεση θα κλείσει μόλις απαντηθεί το αρχικό αίτημα, επομένως δεν θα πρέπει να αναμένει ότι θα είναι μια μόνιμη (persistent) σύνδεση.
Ακολουθούν ορισμένα σημεία που μπορούμε να σημειώσουμε από τις προσαρμογές των κεφαλίδων αιτήματος μεσολάβησης που περιγράφονται παραπάνω:
-
Αν δεν θέλετε να μεταβιβαστεί μια κεφαλίδα στον upstream διακομιστή, τότε ορίζοντάς την σε μια κενή συμβολοσειρά θα την αφαιρέσει εντελώς από το αίτημα.
-
Αν η εφαρμογή στον upstream διακομιστή σας πρόκειται να επεξεργαστεί μη τυποποιημένες κεφαλίδες, βεβαιωθείτε ότι οι κεφαλίδες δεν περιέχουν κάτω παύλα (underscore). Προαιρετικά, μπορείτε να ορίσετε την οδηγία underscores_in_headers σε “on” στις ρυθμίσεις σας (έγκυρη είτε στο πλαίσιο της προεπιλεγμένης δήλωσης διακομιστή για τον συνδυασμό διεύθυνσης IP/θύρας είτε στο πλαίσιο HTTP). Με αυτόν τον τρόπο θα διασφαλίσετε ότι οι κεφαλίδες δεν θα επισημανθούν ως μη έγκυρες και, ως εκ τούτου, θα μεταβιβαστούν πράγματι στον upstream διακομιστή.
-
Η κεφαλίδα “Host” είναι αρκετά σημαντική στις περισσότερες περιπτώσεις διαμεσολάβησης (proxying). Από προεπιλογή έχει οριστεί στην τιμή του $proxy_host, μιας μεταβλητής που περιέχει το όνομα τομέα (domain name) ή τη διεύθυνση IP και τη θύρα που ανακτήθηκαν από τις προδιαγραφές του proxy_pass. Αυτή η διεύθυνση επιλέγεται από προεπιλογή και λαμβάνεται απευθείας από τις πληροφορίες σύνδεσης. Είναι η μόνη διεύθυνση για την οποία το Nginx έχει εγγύηση ότι ο upstream διακομιστής θα απαντήσει.
Παρακάτω παρατίθενται οι πιο κοινές τιμές για την κεφαλίδα “Host”:
-
$host – μια μεταβλητή που ορίζεται κατά σειρά προτίμησης στο hostname από την ίδια τη γραμμή αιτήματος, την κεφαλίδα “Host” από το αίτημα του πελάτη ή το όνομα διακομιστή που ταιριάζει με το αίτημα.
-
$http_host – μια μεταβλητή που ορίζει την κεφαλίδα “Host” στην κεφαλίδα “Host” από το αίτημα του πελάτη. Οι κεφαλίδες στο αίτημα του πελάτη είναι πάντα διαθέσιμες στο Nginx ως μεταβλητές. Αυτές οι μεταβλητές ξεκινούν με το πρόθεμα $http_ και ακολουθεί το όνομα της κεφαλίδας με πεζούς χαρακτήρες. Αν και η μεταβλητή $http_host θα λειτουργεί ως επί το πλείστον μια χαρά, όταν το αίτημα του πελάτη στερείται έγκυρης κεφαλίδας “Host”, μπορεί να οδηγήσει σε αποτυχία της μεταβίβασης.
-
$proxy_host – μια μεταβλητή που ορίζει την κεφαλίδα “Host” στον συνδυασμού ονόματος τομέα ή διεύθυνσης IP και θύρας που ανακτήθηκε από τις προδιαγραφές του proxy_pass. Αυτή είναι η προεπιλεγμένη συμπεριφορά, από την πλευρά του Nginx, και ως εκ τούτου θεωρείται ασφαλής. Ωστόσο, ενδέχεται να μην είναι αυτό που χρειάζεται ο διακομιστής για να χειριστεί σωστά το αίτημα.
Οι περισσότερες ρυθμίσεις περιλαμβάνουν τον ορισμό της κεφαλίδας “Host” στη μεταβλητή $host. Είναι εξαιρετικά ευέλικτη και θα παρέχει ακριβώς συμπληρωμένες κεφαλίδες στον upstream διακομιστή.
Ορισμός και τροποποίηση κεφαλίδων
Η οδηγία proxy_set_header μας επιτρέπει να ορίζουμε ή να τροποποιούμε κεφαλίδες για συνδέσεις διαμεσολάβησης. Στην κεφαλίδα “Host” που συζητήθηκε προηγουμένως, μπορούμε να κάνουμε τα εξής για να τροποποιήσουμε και να προσθέσουμε επιπλέον κεφαλίδες που είναι κοινές στα αιτήματα μέσω διαμεσολαβητή:
|
1 2 3 4 5 6 7 8 |
location /match/here { proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $schema; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://example.com/new/prefix; } |
Στο παραπάνω απόσπασμα ρυθμίσεων, ορίζουμε την κεφαλίδα “Host” στη μεταβλητή $host που περιέχει πληροφορίες σχετικά με τον αρχικό κεντρικό υπολογιστή (host) που ζητήθηκε. Ορίζουμε την κεφαλίδα X-Forwarded-Proto με πληροφορίες σχετικά με το σχήμα (schema) του αρχικού αιτήματος από τον πελάτη (αυτό μπορεί να είναι είτε αίτημα HTTP είτε HTTPS).
Μεταβιβάζουμε την πραγματική διεύθυνση IP του πελάτη στο X-Real-IP. Αυτό επιτρέπει στον upstream διακομιστή να λαμβάνει κατάλληλες αποφάσεις ή να αποθηκεύει αρχεία καταγραφής (logs) με βάση την προέλευση IP του πελάτη. Η κεφαλίδα X-Forwarded-For περιέχει μια λίστα με όλες τις διευθύνσεις IP που ανήκουν σε διακομιστές μέσω των οποίων έχει περάσει ο πελάτης πριν φτάσει σε αυτό το σημείο. Στο παραπάνω απόσπασμα κώδικα, την ορίζουμε στη μεταβλητή $proxy_add_x_forwarded_for. Αυτή η μεταβλητή θα πάρει την τιμή της αρχικής κεφαλίδας X-Forwarded-For που ελήφθη από τον πελάτη και θα προσθέσει τη διεύθυνση IP του διακομιστή διαμεσολάβησης Nginx στο τέλος.
Αν επιθυμείτε οι οδηγίες proxy_set_header να αναφέρονται σε περισσότερες από μία τοποθεσίες (locations), μπορείτε να τις μεταφέρετε στο πλαίσιο server ή http. Δείτε το παρακάτω απόσπασμα ρυθμίσεων:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location /match/here { proxy_pass http://example.com/new/prefix; } location /different/match { proxy_pass http://example.com; } |
Ορισμός ενός Upstream Context για την Εξισορρόπηση Φορτίου των Διαμεσολαβημένων Συνδέσεων
Μέχρι αυτό το σημείο, έχετε κατανοήσει πώς να κάνετε ένα απλό http proxy σε έναν μεμονωμένο backend upstream διακομιστή. Ευτυχώς, με το Nginx, μπορείτε να κλιμακώσετε μια τέτοια διαμόρφωση ορίζοντας ομάδες από backend διακομιστές στους οποίους θα μεταβιβάζονται τα αιτήματα για επεξεργασία.
Το Nginx παρέχει μια οδηγία που ονομάζεται upstream και χρησιμοποιείται για τον ορισμό μιας ομάδας διακομιστών. Μέσα στη διαμόρφωση της οδηγίας, πρέπει να καθορίζετε μόνο διακομιστές που είναι ικανοί να χειριστούν το αίτημα ενός πελάτη. Το Nginx ως διακομιστής μεσολάβησης επιτρέπει την κλιμάκωση της υποδομής με ελάχιστη προσπάθεια. Η οδηγία upstream πρέπει να καθορίζεται εντός του http context της διαμόρφωσης του Nginx.
Ακολουθεί ένα παράδειγμα που δείχνει την οδηγία upstream:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
upstream several_backend_hosts { server host1.example.com; server host2.example.com; server host3.example.com; } server { listen 80; server_name example.com; location /proxy-me { proxy_pass http://several_backend_hosts; } } |
Στο παραπάνω απόσπασμα κώδικα διαμόρφωσης, έχουμε ορίσει ένα upstream context με το όνομα several_backend_hosts. Το καθορισμένο όνομα context είναι πλέον διαθέσιμο εντός των proxy passes. Μπορεί να χρησιμοποιηθεί σαν να ήταν ένα κανονικό domain, όπως φαίνεται στο παράδειγμα. Μέσα στο server block, μεταβιβάζουμε όλα τα αιτήματα που γίνονται στο example.com/proxy-me/… στην ομάδα που ορίσαμε χρησιμοποιώντας την οδηγία upstream, στην προκειμένη περίπτωση, several_backend_hosts. Ένας κεντρικός υπολογιστής επιλέγεται μέσα από την ομάδα για να χειριστεί τα εισερχόμενα αιτήματα εφαρμόζοντας έναν παραμετροποιήσιμο αλγόριθμο. Από προεπιλογή, η επιλογή ακολουθεί μια διαδικασία round-robin (κυκλική) διαδικασία – κάθε αίτημα δρομολογείται με τη σειρά σε διαφορετικό host.
Πώς να Αλλάξετε τον Αλγόριθμο Εξισορρόπησης Upstream
Όπως επισημάνθηκε παραπάνω, η διαδικασία επιλογής ακολουθεί μια διαδικασία round-robin. Σε αυτήν την ενότητα, θα δούμε πώς μπορούμε να τροποποιήσουμε τον αλγόριθμο εξισορρόπησης που χρησιμοποιείται από την ομάδα upstream. Για να τροποποιήσετε τον αλγόριθμο, συμπεριλαμβάνετε άλλες οδηγίες ή σημαίες εντός του upstream context, όπως ορίζεται παρακάτω:
-
(round-robin) – εάν δεν έχει καθοριστεί άλλη οδηγία εξισορρόπησης upstream, τότε από προεπιλογή, σε κάθε διακομιστή που ορίζεται στο upstream context μεταβιβάζονται αιτήματα διαδοχικά με τη σειρά.
-
least_conn – αυτή η οδηγία δίνει εντολή στο upstream να επιλέξει τον backend διακομιστή με τον μικρότερο αριθμό ενεργών συνδέσεων. Αυτό εφαρμόζεται σε περιπτώσεις όπου οι συνδέσεις με έναν backend διακομιστή ενδέχεται να διαρκέσουν για κάποιο χρονικό διάστημα.
-
hash – αυτή η οδηγία είναι κοινή για τη μεσολάβηση memcached. Οι συνδέσεις μεταβιβάζονται στους backend διακομιστές με βάση την τιμή ενός τυχαία παρεχόμενου κλειδιού κατακερματισμού (hash key). Η τιμή του hash key μπορεί να είναι μεταβλητές, κείμενο ή συνδυασμός και των δύο. Το hash τυχαίνει να είναι η μόνη μέθοδος εξισορρόπησης που απαιτεί εισαγωγή δεδομένων από τους χρήστες για να λειτουργήσει ως το κλειδί που θα χρησιμοποιηθεί για τον κατακερματισμό.
-
ip_hash – αυτή η οδηγία δίνει εντολή στο upstream να διανέμει τα αιτήματα σε διαφορετικούς διακομιστές με βάση τη διεύθυνση IP του πελάτη. Οι πρώτες τρεις οκτάδες της διεύθυνσης IP είναι το κλειδί για τον προσδιορισμό του διακομιστή που πρέπει να επεξεργαστεί ένα αίτημα. Ένα πλεονέκτημα αυτής της οδηγίας είναι ότι οι πελάτες τείνουν να συνδέονται στον ίδιο διακομιστή κάθε φορά, διασφαλίζοντας έτσι τη συνοχή της περιόδου λειτουργίας.
Ακολουθεί ένα παράδειγμα για το πώς μπορούμε να προσθέσουμε την οδηγία αλγορίθμου εξισορρόπησης στο upstream context:
|
1 2 3 4 5 6 7 8 |
upstream several_backend_hosts { least_conn; server host1.example.com; server host2.example.com; server host3.example.com; } |
Στο παραπάνω απόσπασμα, το Nginx θα επιλέξει οποιονδήποτε από τους διακομιστές με τις λιγότερες συνδέσεις για να επεξεργαστεί ένα εισερχόμενο αίτημα. Η οδηγία ip_hash ακολουθεί την ίδια σύνταξη. Για την οδηγία hash, πρέπει να παρέχετε ένα κλειδί της επιλογής σας για τη δημιουργία κατακερματισμού (hash), ορίστε ένα παράδειγμα:
|
1 2 3 4 5 6 7 8 |
upstream several_backend_hosts { hash $remote_addr$remote_port consistent; server host1.example.com; server host2.example.com; server host3.example.com; } |
Ο κατακερματισμός που χρησιμοποιείται εδώ θα είναι αποτέλεσμα της διεύθυνσης IP και της θύρας του πελάτη’. Η προαιρετική παράμετρος consistent υλοποιεί τον αλγόριθμο συνεπούς κατακερματισμού ketama. Αυτό εξασφαλίζει ελάχιστο αντίκτυπο στην προσωρινή μνήμη (cache) σας σε περίπτωση που αλλάξετε τους upstream διακομιστές σας.
Πώς να ορίσετε το βάρος διακομιστή (Server Weight) για εξισορρόπηση
Από προεπιλογή, όταν δηλώνετε διακομιστές backend, κάθε διακομιστής έχει το ίδιο βάρος. Η υπόθεση είναι ότι κάθε διακομιστής διαθέτει τους πόρους και τις δυνατότητες να χειριστεί τον ίδιο όγκο φορτίου, φυσικά, αυτό λαμβάνοντας υπόψη οποιονδήποτε αλγόριθμο εξισορρόπησης καθορίζετε στο πλαίσιο upstream. Για να αλλάξετε αυτήν την προεπιλεγμένη συμπεριφορά, μπορείτε να ορίσετε ένα εναλλακτικό βάρος σε κάθε διακομιστή κατά τη δήλωση. Ας δούμε ένα παράδειγμα:
|
1 2 3 4 5 |
upstream backend_hosts { server host1.example.com weight=2; server host2.example.com; server host3.example.com; } |
Σε αυτό το παράδειγμα, το host1.example.com θα λάβει διπλάσια κίνηση σε σχέση με τους άλλους δύο διακομιστές. Το βάρος για κάθε διακομιστή είναι ένα από προεπιλογή.
Αποδέσμευση διακομιστών Backend με Buffer
Κατά τη διαμόρφωση της μεσολάβησης (proxying) στις ρυθμίσεις του διακομιστή σας, ενδέχεται να ανησυχείτε για τον αντίκτυπο στην απόδοση από την προσθήκη περισσότερων διακομιστών στη διαδικασία. Ευτυχώς, το Nginx διαθέτει δυνατότητες προσωρινής αποθήκευσης (buffering) και προσωρινής μνήμης (caching) που μπορούν να βοηθήσουν στον μετριασμό αυτών των προβλημάτων απόδοσης.
Η ταχύτητα δύο διαφορετικών συνδέσεων είναι βέβαιο ότι θα επηρεάσει την εμπειρία του πελάτη κατά τη μεσολάβηση σε άλλον διακομιστή:
-
Η πρώτη σύνδεση είναι από τον πελάτη στον διακομιστή μεσολάβησης Nginx.
-
Η δεύτερη σύνδεση είναι από τον διακομιστή μεσολάβησης Nginx στον upstream διακομιστή backend.
Το Nginx μπορεί να προσαρμόσει τη συμπεριφορά του για να βοηθήσει στη βελτιστοποίηση οποιασδήποτε από τις συνδέσεις, ανάλογα με τις ανάγκες.
Εάν αφαιρέσουμε τα buffer, η μετάδοση δεδομένων από το upstream backend προς τον πελάτη ξεκινά αμέσως στον διακομιστή μεσολάβησης Nginx. Εάν γνωρίζετε ότι οι πελάτες σας είναι γρήγοροι, μπορείτε να απενεργοποιήσετε εντελώς το buffering για να διασφαλίσετε ότι τα δεδομένα φτάνουν στον πελάτη αρκετά γρήγορα. Όταν έχετε ενεργοποιημένα τα buffer, ο διακομιστής μεσολάβησης Nginx αποθηκεύει προσωρινά τα δεδομένα απόκρισης που λαμβάνει από τον upstream διακομιστή backend. Στη συνέχεια, στέλνει τα δεδομένα στον πελάτη ανάλογα με την ταχύτητά του. Μόλις το Nginx έχει την απόκριση στα buffer του, μπορεί να κλείσει τη σύνδεση με τον διακομιστή backend. Στη συνέχεια, θα διανείμει τα δεδομένα στον πελάτη με ταχύτητα που υποστηρίζει ο πελάτης. Ταυτόχρονα, επιτρέπει στον διακομιστή backend να συνεχίσει την επεξεργασία άλλων εισερχόμενων αιτημάτων.
Από προεπιλογή, το Nginx θα έχει ενεργοποιημένο το buffering. Αυτό συμβαίνει επειδή δεν μπορούμε να γνωρίζουμε τις ταχύτητες σύνδεσης των πελατών. Οι πελάτες τείνουν να έχουν διαφορετικές συνδέσεις που μπορεί να είναι πιο αργές. Παρακάτω, θα ορίσουμε τις διάφορες οδηγίες που μπορούμε να καθορίσουμε για να προσαρμόσουμε τη συμπεριφορά buffering του Nginx. Οι οδηγίες μπορούν να οριστούν στα πλαίσια http, server ή location, ωστόσο, θα πρέπει να σημειώσετε ότι οι οδηγίες μεγέθους διαμορφώνονται ανά αίτημα. Επομένως, η αύξησή τους πέρα από το απολύτως απαραίτητο μπορεί να επηρεάσει την απόδοση του διακομιστή σας όταν υπάρχουν πάρα πολλά εισερχόμενα αιτήματα πελατών. Ακολουθούν οι οδηγίες:
-
proxy_buffering – η οδηγία που ελέγχει εάν η προσωρινή αποθήκευση (buffering) είναι ενεργή για ένα συγκεκριμένο πλαίσιο και τα υποπλαίσιά του. Η προεπιλεγμένη ρύθμιση για το proxy_buffering είναι “on”.
-
proxy_buffer_size – η οδηγία που καθορίζει το μέγεθος της ενδιάμεσης μνήμης (buffer) για την αποθήκευση των κεφαλίδων (headers) που βρίσκονται σε μια απόκριση από έναν διακομιστή backend. Οι κεφαλίδες αποτελούν το πρώτο μέρος της απόκρισης από έναν διακομιστή backend. Η προσωρινή αποθήκευση αυτών των κεφαλίδων είναι ξεχωριστή από την υπόλοιπη απόκριση. Από προεπιλογή, το καθορισμένο μέγεθος αυτής της ενδιάμεσης μνήμης είναι το ίδιο με αυτό του proxy_buffers. Ωστόσο, εάν οι πληροφορίες της κεφαλίδας είναι μικρές, μπορείτε να ορίσετε το μέγεθος σε χαμηλότερη τιμή.
-
proxy_buffers – η οδηγία που ελέγχει τον αριθμό (πρώτο όρισμα) και το μέγεθος (δεύτερο όρισμα) των ενδιάμεσων μνημών για τις αποκρίσεις μέσω proxy. Η προεπιλεγμένη ρύθμιση καθορίζει 8 ενδιάμεσες μνήμες μεγέθους ίσου με μία σελίδα μνήμης (είτε 4k είτε 8k). Μπορείτε να επιτρέψετε την προσωρινή αποθήκευση περισσότερων πληροφοριών αυξάνοντας τον αριθμό των ενδιάμεσων μνημών.
-
proxy_max_temp_file_size – η οδηγία που καθορίζει το μέγιστο μέγεθος, ανά αίτημα, για ένα προσωρινό αρχείο στον δίσκο. Τα προσωρινά αρχεία δημιουργούνται όταν η απόκριση από τον upstream διακομιστή είναι πολύ μεγάλη για να χωρέσει σε μια ενδιάμεση μνήμη.
-
proxy_busy_buffers_size – η οδηγία που καθορίζει το μέγιστο μέγεθος των ενδιάμεσων μνημών που μπορούν να χαρακτηριστούν ως «έτοιμες για τον πελάτη» (client-ready) και επομένως απασχολημένες (busy). Ένας πελάτης μπορεί να διαβάσει τα δεδομένα μόνο από μία ενδιάμεση μνήμη τη φορά. Ωστόσο, οι ενδιάμεσες μνήμες βρίσκονται σε μια ουρά για να σταλούν στον πελάτη σε παρτίδες. Μπορείτε να καθορίσετε το μέγεθος του χώρου της ενδιάμεσης μνήμης που επιτρέπεται να βρίσκεται σε αυτήν την κατάσταση τροποποιώντας αυτήν την οδηγία.
-
proxy_temp_file_write_size – η οδηγία που καθορίζει την ποσότητα των δεδομένων που θα γράφει το Nginx στο προσωρινό αρχείο ταυτόχρονα, όταν η απόκριση από τον backend upstream διακομιστή είναι πολύ μεγάλη για να χωρέσει στις ρυθμισμένες ενδιάμεσες μνήμες.
-
proxy_temp_path – η οδηγία που καθορίζει τη διαδρομή προς τη θέση στον δίσκο όπου το Nginx πρέπει να αποθηκεύει τυχόν προσωρινά αρχεία όταν η απόκριση από τον upstream backend διακομιστή είναι πολύ μεγάλη για να χωρέσει στις ρυθμισμένες ενδιάμεσες μνήμες.
Το Nginx είναι εξαιρετικά παραμετροποιήσιμο, παρέχοντάς σας διάφορες οδηγίες για να προσαρμόσετε τη συμπεριφορά της προσωρινής αποθήκευσης. Στις περισσότερες περιπτώσεις, οι προεπιλεγμένες τιμές θα λειτουργήσουν μια χαρά. Παράλληλα, είναι καλό να γνωρίζετε ότι μπορείτε να προσαρμόσετε κάποιες από αυτές τις τιμές για τη δική σας υλοποίηση. Κυρίως θα θέλετε να προσαρμόσετε τις οδηγίες proxy_buffers και proxy_buffer_size.
Παρακάτω υπάρχει ένα παράδειγμα που αυξάνει τον αριθμό των διαθέσιμων ενδιάμεσων μνημών proxy για κάθε upstream αίτημα. Αυτό επιτυγχάνεται μειώνοντας παράλληλα το μέγεθος της ενδιάμεσης μνήμης που αποθηκεύει τις κεφαλίδες:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
server { proxy_buffering on; proxy_buffer_size 1k; proxy_buffers 24 4k; proxy_busy_buffers_size 8k; proxy_max_temp_file_size 2048m; proxy_temp_file_write_size 32k; location / { proxy_pass http://example.com; } } |
Ας δούμε πώς μπορείτε να εξυπηρετήσετε δεδομένα ταχύτερα σε γρήγορους πελάτες απενεργοποιώντας εντελώς την προσωρινή αποθήκευση. Εάν συμβεί ο πελάτης σας να μην είναι αρκετά γρήγορος, το Nginx θα χρησιμοποιήσει αυτόματα ενδιάμεσες μνήμες. Ωστόσο, θα στείλει πρώτα τα δεδομένα στον πελάτη αντί να περιμένει για buffer pools. Αυτή η ρύθμιση συνοδεύεται από ένα μειονέκτημα. Αυτή η ρύθμιση προκαλεί τη διατήρηση της σύνδεσης με τον upstream διακομιστή ανοιχτή για αργούς πελάτες μέχρι ο πελάτης να λάβει όλα τα δεδομένα απόκρισης. Εάν η προσωρινή αποθήκευση έχει οριστεί σε “off”, θα χρησιμοποιηθεί μόνο η ενδιάμεση μνήμη που ορίζεται από την οδηγία proxy_buffer_size. Ακολουθεί ένα απόσπασμα που δείχνει πώς θα ορίζατε την απενεργοποίηση της προσωρινής αποθήκευσης:
|
1 2 3 4 5 6 7 8 9 |
server { proxy_buffering off; proxy_buffer_size 4k; location / { proxy_pass http://example.com; } } |
-
Διαμόρφωση υποδομής υψηλής διαθεσιμότητας (HA) (Προαιρετική εγκατάσταση)
Μπορείτε να προσθέσετε ένα εφεδρικό σύνολο κατανεμητών φορτίου (load balancers) στη διαμόρφωση του Nginx proxy, διασφαλίζοντας ότι είναι πιο στιβαρή και, ως εκ τούτου, υψηλής διαθεσιμότητας. Μια εγκατάσταση υψηλής διαθεσιμότητας (HA) είναι μια υποδομή χωρίς κανένα μεμονωμένο σημείο αποτυχίας (single point of failure). Οι κατανεμητές φορτίου αποτελούν μέρος αυτής της διαμόρφωσης. Με περισσότερους από έναν κατανεμητές φορτίου, μπορείτε να αποτρέψετε πιθανό χρόνο διακοπής λειτουργίας εάν ένας κατανεμητής φορτίου αποτύχει ή τεθεί εκτός σύνδεσης για συντήρηση.
Πώς να εφαρμόσετε την προσωρινή αποθήκευση Nginx Proxy (Proxy Caching) για να μειώσετε τους χρόνους απόκρισης
Στην προηγούμενη ενότητα, συζητήσαμε πώς να χρησιμοποιήσετε το buffering για να ελευθερώσετε τους backend διακομιστές ώστε να χειρίζονται περισσότερα αιτήματα. Το Nginx διαθέτει μια άλλη δυνατότητα που μας επιτρέπει να αποθηκεύουμε προσωρινά δεδομένα απόκρισης από το backend. Καταργεί εντελώς την ανάγκη σύνδεσης με το upstream για όλα τα εισερχόμενα αιτήματα.
Υλοποίηση ενός Proxy Cache
Η οδηγία proxy_cache_path μας επιτρέπει να ρυθμίσουμε μια προσωρινή μνήμη (cache) καθορίζοντας μια περιοχή στον δίσκο που θα χρησιμοποιηθεί για την αποθήκευση του περιεχομένου που περνάει από τον proxy. Η οδηγία proxy_cache_path ορίζεται στο πλαίσιο (context) http.
Το παρακάτω απόσπασμα κώδικα διαμόρφωσης είναι ένα παράδειγμα του πώς μπορείτε να εφαρμόσετε ένα σύστημα προσωρινής αποθήκευσης (caching):
|
1 2 3 4 5 6 |
http { proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=backendcache:8m max_size=50m; proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args"; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; } |
Σε αυτό το απόσπασμα κώδικα, χρησιμοποιήσαμε την οδηγία proxy_cache_path για να ορίσουμε έναν κατάλογο στο σύστημα αρχείων που θα περιέχει την προσωρινή μνήμη μας. Το /var/lib/nginx/cache είναι ο κατάλογος που έχουμε ορίσει σε αυτήν την περίπτωση. Είστε ελεύθεροι να ορίσετε μια διαδρομή καταλόγου της επιλογής σας. Χρησιμοποιήστε τις ακόλουθες εντολές για να δημιουργήσετε τους καταλόγους που επιλέξατε, με τα σωστά δικαιώματα και ιδιοκτησία:
|
1 2 3 |
sudo mkdir -p /var/lib/nginx/cache sudo chown www-data /var/lib/nginx/cache sudo chmod 700 /var/lib/nginx/cache |
Στο απόσπασμα κώδικα, η παράμετρος levels= καθορίζει την οργάνωση της προσωρινής μνήμης. Το Nginx θα δημιουργήσει ένα κλειδί προσωρινής μνήμης (cache key) κάνοντας hashing την τιμή ενός κλειδιού (που καθορίζεται με την οδηγία proxy_cache_key). Τα επίπεδα (levels) που καθορίσαμε (1:2) υποδεικνύουν ότι θα δημιουργηθεί ένας κατάλογος με έναν μόνο χαρακτήρα (δηλαδή τον τελευταίο χαρακτήρα της τιμής hash) με έναν υποκατάλογο δύο χαρακτήρων (που λαμβάνεται από τους επόμενους δύο χαρακτήρες από το τέλος της τιμής hash). Στις περισσότερες περιπτώσεις, αυτό δεν θα σας απασχολήσει. Ωστόσο, είναι καλό να γνωρίζετε πώς βοηθά το Nginx να βρίσκει γρήγορα τις σχετικές τιμές.
Η παράμετρος keys_zone= ορίζει το όνομα για μια ζώνη προσωρινής μνήμης (cache zone), στην περίπτωσή μας την έχουμε ονομάσει backendcache. Εδώ, ορίζουμε επίσης πόσα μεταδεδομένα (metadata) θέλουμε να αποθηκεύσουμε. Σε αυτό το παράδειγμα, αποθηκεύουμε 8 MB κλειδιών. Το Nginx μπορεί να αποθηκεύσει περίπου 8000 εγγραφές για κάθε megabyte. Η παράμετρος max_size καθορίζει το μέγιστο μέγεθος των πραγματικών αποθηκευμένων δεδομένων, 50MB για το παράδειγμά μας.
Θα πρέπει επίσης να προσέξετε την οδηγία proxy_cache_key που χρησιμοποιείται. Αυτή η οδηγία καθορίζει το κλειδί που θα χρησιμοποιήσουμε για την αποθήκευση των προσωρινά αποθηκευμένων τιμών. Θα χρησιμοποιήσουμε το ίδιο κλειδί για να ελέγξουμε αν το αίτημα υπάρχει στην προσωρινή μνήμη. Έχουμε καθορίσει ότι αυτό το κλειδί θα είναι ένας συνδυασμός του σχήματος (http ή https), της μεθόδου αιτήματος HTTP, και του ζητούμενου host και URI.
Επιπλέον, έχουμε χρησιμοποιήσει την οδηγία proxy_cache_valid. Αυτή η οδηγία μπορεί να καθοριστεί πολλές φορές για διάφορους κωδικούς κατάστασης (status codes). Μας επιτρέπει να καθορίσουμε πόσο χρόνο θα αποθηκεύονται οι τιμές ανάλογα με τον κωδικό κατάστασης. Στο απόσπασμα κώδικα, καθορίσαμε 10 λεπτά για κωδικούς επιτυχίας και 1 λεπτό για αποκρίσεις 404.
Εφόσον έχουμε διαμορφώσει τη ζώνη προσωρινής μνήμης, το επόμενο βήμα είναι να θέσουμε σε εφαρμογή τη διαμόρφωση λέγοντας στο Nginx πότε να χρησιμοποιεί την προσωρινή μνήμη. Παρακάτω είναι ένα απόσπασμα διαμόρφωσης που δείχνει πώς μπορούμε να εφαρμόσουμε τη χρήση αυτής της προσωρινής μνήμης:
|
1 2 3 4 5 6 7 8 9 |
server { location /proxy-me { proxy_cache backendcache; proxy_cache_bypass $http_cache_control; add_header X-Proxy-Cache $upstream_cache_status; proxy_pass http://backend; } } |
Στην οδηγία proxy_cache, έχουμε καθορίσει ότι η ζώνη προσωρινής μνήμης backendcache θα πρέπει να χρησιμοποιηθεί για αυτό το πλαίσιο. Εάν επιλέξατε διαφορετικό όνομα στη διαμόρφωση της προσωρινής μνήμης, εδώ είναι το σημείο όπου θα το αντικαταστήσετε. Για κάθε έγκυρη καταχώριση, το Nginx θα ελέγχει την προσωρινή μνήμη πριν προωθήσει ένα αίτημα στον backend upstream διακομιστή.
Ορίζουμε την οδηγία proxy_cache_bypass για να χρησιμοποιήσουμε τη μεταβλητή $http_cache_control. Αυτή η μεταβλητή λέει στον διακομιστή εάν πρέπει να απαντήσει με μια αποθηκευμένη απάντηση ή με μια νέα, μη αποθηκευμένη έκδοση του πόρου. Η κατάλληλη ρύθμιση αυτής της οδηγίας επιτρέπει στο Nginx να χειρίζεται σωστά διάφορους τύπους εισερχόμενων αιτημάτων από πελάτες.
Καθορίζεται επίσης μια πρόσθετη κεφαλίδα που ονομάζεται X-Proxy-Cache. Αυτή η κεφαλίδα έχει την τιμή της μεταβλητής $upstream_cache_status. Μας δίνει πληροφορίες σχετικά με το εάν το αίτημα είχε ως αποτέλεσμα επιτυχία προσωρινής μνήμης (cache hit), αστοχία προσωρινής μνήμης (cache miss) ή εάν έγινε ρητή παράκαμψη της προσωρινής μνήμης. Τέτοιες πληροφορίες μπορεί να είναι χρήσιμες για τον πελάτη και κρίσιμες κατά τον εντοπισμό σφαλμάτων των εφαρμογών.
Σημαντικά σημεία σχετικά με την προσωρινή αποθήκευση αποτελεσμάτων
Αν και η προσωρινή αποθήκευση θα βελτιώσει σημαντικά την απόδοση του proxy διακομιστή σας, θα πρέπει να λάβετε υπόψη τα ακόλουθα κατά την εφαρμογή της προσωρινής αποθήκευσης:
Οποιαδήποτε δεδομένα σχετίζονται με τα προσωπικά στοιχεία ενός χρήστη δεν θα πρέπει να αποθηκεύονται στην προσωρινή μνήμη, για να αποφευχθούν σενάρια όπου τα δεδομένα ενός χρήστη είναι ορατά σε άλλον χρήστη.
Οι backend διακομιστές σας θα πρέπει να λαμβάνουν υπόψη όλα τα δυναμικά στοιχεία του ιστότοπού σας. Έχουμε αρκετές κεφαλίδες Cache-Control που μπορούμε να καθορίσουμε στην απάντησή μας για να εξυπηρετήσουμε διαφορετικούς σκοπούς. Ας τις συζητήσουμε:
-
no-cache – καθορίζει ότι ο proxy πρέπει να ελέγχει εάν τα δεδομένα έχουν αλλάξει στο backend πριν σερβίρει μια απάντηση. Αυτό ισχύει για δυναμικά και σημαντικά δεδομένα. Μια κεφαλίδα μεταδεδομένων κατακερματισμού ETag ελέγχεται σε κάθε αίτημα και εάν το backend επιστρέψει την ίδια τιμή κατακερματισμού, τότε σερβίρεται η προηγούμενη τιμή.
-
no-store – καθορίζει τη μη προσωρινή αποθήκευση για τυχόν ληφθέντα δεδομένα, επομένως, κάθε αίτημα θα πηγαίνει στον διακομιστή για νέα δεδομένα. Αυτό είναι το ασφαλέστερο για ευαίσθητα δεδομένα.
-
private – καθορίζει ότι κανένας κοινόχρηστος χώρος προσωρινής μνήμης δεν πρέπει να αποθηκεύει προσωρινά τα δεδομένα. Μπορείτε να χρησιμοποιήσετε αυτήν την κεφαλίδα για να καθορίσετε την προσωρινή αποθήκευση στο πρόγραμμα περιήγησης του χρήστη, αλλά και να ενημερώσετε τον proxy διακομιστή να θεωρεί τα δεδομένα άκυρα για επόμενα αιτήματα.
-
public – καθορίζει μια δημόσια απάντηση και επιτρέπει την προσωρινή αποθήκευση σε οποιοδήποτε σημείο της σύνδεσης.
Μπορείτε να καθορίσετε πόσο χρόνο θέλετε να διαρκέσει η προσωρινή μνήμη σε δευτερόλεπτα χρησιμοποιώντας την κεφαλίδα max-age. Οι διάφορες κεφαλίδες που ορίστηκαν παραπάνω μπορούν να σας βοηθήσουν να εφαρμόσετε την προσωρινή αποθήκευση διατηρώντας παράλληλα τα ευαίσθητα δεδομένα ασφαλή, τα δυναμικά δεδομένα φρέσκα και, κυρίως, βελτιώνοντας την απόδοση του διακομιστή σας.
Εάν οι backend διακομιστές σας εκτελούν διακομιστές Nginx, μπορείτε να καθορίσετε μέσα στα server blocks για πόσο χρονικό διάστημα θα πρέπει να είναι έγκυρη η προσωρινή μνήμη. Μπορείτε να το κάνετε αυτό προσθέτοντας την οδηγία expires στη διαμόρφωση, όπως φαίνεται παρακάτω:
|
1 2 3 4 5 6 7 |
location / { expires 59m; } location /check-me { expires -1; } |
Το πρώτο block επιτρέπει την προσωρινή αποθήκευση περιεχομένου για 59 λεπτά, ενώ το δεύτερο block υποδεικνύει μη προσωρινή αποθήκευση. Αυτές οι ρυθμίσεις ισχύουν για τις επιλογές των κεφαλίδων Cache-Control, για παράδειγμα, «no-cache» για το δεύτερο block.
Μπορείτε να χρησιμοποιήσετε την οδηγία add-header για να ορίσετε πρόσθετες τιμές:
|
1 2 3 4 |
location /private { expires -1; add_header Cache-Control "no-store"; } |
Συμπέρασμα
Σε αυτόν τον οδηγό, μάθαμε για τις ισχυρές δυνατότητες του Nginx. Το Nginx είναι τόσο ένας διακομιστής ιστού όσο και, το σημαντικότερο, ένας αντίστροφος μεσολαβητής. Ο σχεδιασμός του Nginx το καθιστά ικανό να χειρίζεται χιλιάδες ταυτόχρονες συνδέσεις. Αυτό το καθιστά ιδανικό για εξισορρόπηση φορτίου. Λόγω του σχεδιασμού του, η προώθηση αιτημάτων σε άλλους backend διακομιστές για επεξεργασία είναι αρκετά απλή.
Με τις γνώσεις από αυτόν τον οδηγό, θα πρέπει να είστε σε θέση να υλοποιήσετε σύνθετους διακομιστές μεσολάβησης και εξισορροπητές φορτίου, χάρη στην ευελιξία του Nginx.
Ορίστε μερικοί πόροι που μπορείτε να βρείτε στο blog μας που μπορούν να σας εξοικειώσουν περισσότερο με το Nginx:
-
Πώς να ασφαλίσετε το Nginx με το Let’s Encrypt στο Ubuntu 20.04
-
Πώς να εγκαταστήσετε το LEMP stack (Linux, Nginx, MySQL PHP) στο Ubuntu 20.04
Καλή συνέχεια!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.