Η διαμόρφωση του nginx για εργασία ήταν. Προστατέψτε σημαντικούς καταλόγους από αγνώστους. Δημιουργία ενός απλού διακομιστή μεσολάβησης

14 Αυγούστου 2009 στις 7:29 μ.μ

Ρύθμιση του nginx

  • Nginx

Το θέμα της σωστής διαμόρφωσης του nginx είναι πολύ μεγάλο και, φοβάμαι, δεν μπορεί να χωρέσει στο πλαίσιο ενός άρθρου στο Habré. Σε αυτό το κείμενο προσπάθησα να μιλήσω για γενική δομή config, πιο ενδιαφέροντα μικρά πράγματα και λεπτομέρειες μπορεί να έρθουν αργότερα. :)

Ένα καλό σημείο εκκίνησης για τη ρύθμιση του nginx είναι το config που συνοδεύει τη διανομή, αλλά πολλές από τις δυνατότητες αυτού του διακομιστή δεν αναφέρονται καν σε αυτό. Πολύ περισσότερο λεπτομερές παράδειγμαδιαθέσιμο στον ιστότοπο του Igor Sysoev: sysoev.ru/nginx/docs/example.html. Ωστόσο, ας προσπαθήσουμε καλύτερα να φτιάξουμε το config μας από την αρχή, με μπριτζ και ποιήτριες. :)

Ας ξεκινήσουμε με Γενικές Ρυθμίσεις. Αρχικά, θα υποδείξουμε τον χρήστη για λογαριασμό του οποίου θα εκτελείται το nginx (είναι κακό να λειτουργεί ως root, όλοι γνωρίζουν :))

Τώρα ας πούμε στο nginx πόσες διεργασίες εργαζομένων θα γεννηθούν. Συνήθως, καλή επιλογήΜερικές φορές ο αριθμός των διεργασιών είναι ίσος με τον αριθμό των πυρήνων επεξεργαστή στον διακομιστή σας, αλλά αξίζει να πειραματιστείτε με αυτήν τη ρύθμιση. Εάν αναμένεται υψηλό φορτίο HDD, μπορείτε να κάνετε μία διαδικασία για κάθε φυσικό σκληρό δίσκο, καθώς όλη η εργασία θα εξακολουθεί να περιορίζεται από την απόδοσή του.

Worker_processes 2;

Ας διευκρινίσουμε πού να γράψουμε τα αρχεία καταγραφής σφαλμάτων. Στη συνέχεια, για μεμονωμένους εικονικούς διακομιστές, αυτή η παράμετρος μπορεί να παρακαμφθεί, έτσι ώστε σε αυτό το αρχείο καταγραφής να εμφανίζονται μόνο "καθολικά" σφάλματα, για παράδειγμα, που σχετίζονται με την εκκίνηση διακομιστή.

Ειδοποίηση Error_log /spool/logs/nginx/nginx.error_log; # Το επίπεδο ειδοποίησης "ειδοποίησης" μπορεί φυσικά να αλλάξει

Τώρα έρχεται η πολύ ενδιαφέρουσα ενότητα «γεγονότων». Σε αυτό μπορείτε να ορίσετε μέγιστο ποσόσυνδέσεις που θα επεξεργάζεται ταυτόχρονα ένας εργαζόμενος και μια μέθοδος που θα χρησιμοποιείται για τη λήψη ασύγχρονων ειδοποιήσεων σχετικά με συμβάντα στο λειτουργικό σύστημα. Φυσικά, μπορείτε να επιλέξετε μόνο εκείνες τις μεθόδους που είναι διαθέσιμες στο λειτουργικό σας σύστημα και συμπεριλήφθηκαν κατά τη μεταγλώττιση.

Αυτές οι ρυθμίσεις μπορούν να έχουν σημαντικό αντίκτυπο στην απόδοση του διακομιστή σας. Πρέπει να επιλέγονται μεμονωμένα, ανάλογα με το λειτουργικό σύστημα και το υλικό. Μπορώ να δώσω μόνο μερικούς γενικούς κανόνες.

Ενότητες για εργασία με εκδηλώσεις:
- η επιλογή και η δημοσκόπηση είναι συνήθως πιο αργή και φορτώνουν αρκετά τον επεξεργαστή, αλλά είναι διαθέσιμα σχεδόν παντού και λειτουργούν σχεδόν πάντα.
- kqueue και epoll - πιο αποτελεσματικά, αλλά διαθέσιμα μόνο σε FreeBSD και Linux 2.6, αντίστοιχα.
- rtsig - όμορφο αποτελεσματική μέθοδος, και υποστηρίζεται ακόμη και από πολύ παλιά Linux, αλλά μπορεί να προκαλέσει προβλήματα όταν μεγάλος αριθμόςσυνδέσεις?
- /dev/poll - από όσο ξέρω, λειτουργεί σε κάπως πιο εξωτικά συστήματα, όπως το Solaris, και είναι αρκετά αποτελεσματικό εκεί.

Παράμετρος worker_connections:
- Ο συνολικός μέγιστος αριθμός των εξυπηρετούμενων πελατών θα είναι ίσος με worker_processes *worker_connections.
- Μερικές φορές μπορούν να εργαστούν μέσα θετική πλευράακόμα και οι πιο ακραίες τιμές, όπως 128 διεργασίες, 128 συνδέσεις ανά διεργασία ή 1 διεργασία, αλλά με την παράμετρο worker_connections=16384. Στην τελευταία περίπτωση, ωστόσο, πιθανότατα θα χρειαστεί να συντονίσετε το λειτουργικό σύστημα.

Εκδηλώσεις (
Worker_connections 2048;
χρήση kqueue? # Έχουμε BSD :)
}

Η επόμενη ενότητα είναι η μεγαλύτερη και περιέχει τα πιο ενδιαφέροντα πράγματα. Αυτή είναι μια περιγραφή εικονικών διακομιστών και ορισμένων παραμέτρων κοινών σε όλους αυτούς. θα παραλείψω τυπικές ρυθμίσεις, που βρίσκονται σε κάθε διαμόρφωση, όπως διαδρομές προς αρχεία καταγραφής.

Http(
# Όλος ο κωδικός παρακάτω θα βρίσκεται μέσα σε αυτήν την ενότητα %)
# ...
}

Μέσα σε αυτό το τμήμα μπορεί να υπάρχουν κάποιες αρκετά ενδιαφέρουσες παράμετροι.

Η κλήση συστήματος sendfile είναι σχετικά νέα στο Linux. Σας επιτρέπει να στέλνετε δεδομένα στο δίκτυο χωρίς να χρειάζεται να τα αντιγράψετε στον χώρο διευθύνσεων της εφαρμογής. Σε πολλές περιπτώσεις, αυτό βελτιώνει σημαντικά την απόδοση του διακομιστή, επομένως είναι καλύτερο να ενεργοποιείτε πάντα την επιλογή sendfile.

Η παράμετρος keepalive_timeout είναι υπεύθυνη για τον μέγιστο χρόνο διατήρησης μιας σύνδεσης keepalive, εάν ο χρήστης δεν ζητήσει κάτι σε αυτήν. Σκεφτείτε πώς ο ιστότοπός σας στέλνει αιτήματα και προσαρμόστε αυτήν τη ρύθμιση. Για ιστότοπους που χρησιμοποιούν ενεργά AJAX, είναι καλύτερο να διατηρηθεί η σύνδεση περισσότερο για στατικές σελίδες που οι χρήστες θα διαβάζουν για μεγάλο χρονικό διάστημα, είναι καλύτερο να διακόψετε τη σύνδεση νωρίτερα. Λάβετε υπόψη ότι διατηρώντας μια ανενεργή σύνδεση διατήρησης, καταλαμβάνετε μια σύνδεση που θα μπορούσε να χρησιμοποιηθεί διαφορετικά. :)

Keepalive_timeout 15;

Ξεχωριστά, αξίζει να επισημάνετε τις ρυθμίσεις διακομιστή μεσολάβησης nginx. Τις περισσότερες φορές, το nginx χρησιμοποιείται ακριβώς ως διακομιστής μεσολάβησης, επομένως έχουν αρκετά μεγάλης σημασίας. Συγκεκριμένα, είναι λογικό να ορίζεται το μέγεθος της προσωρινής μνήμης για αιτήματα μεσολάβησης όχι μικρότερο από το αναμενόμενο μέγεθος απόκρισης από τον διακομιστή υποστήριξης. Με αργά (ή, αντίθετα, πολύ γρήγορα) backends, είναι λογικό να αλλάζετε τα χρονικά όρια για την αναμονή απάντησης από το backend. Θυμηθείτε, όσο μεγαλύτερα είναι αυτά τα χρονικά όρια, τόσο περισσότερο θα περιμένουν οι χρήστες σας για απάντηση εάν το backend είναι αργό.

Proxy_buffers 8 64k;
proxy_intercept_errors on?
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

Ένα μικρό κόλπο. Σε περίπτωση που το nginx εξυπηρετεί περισσότερους από έναν εικονικούς κεντρικούς υπολογιστές, είναι λογικό να δημιουργήσετε έναν "προεπιλεγμένο εικονικό κεντρικό υπολογιστή" που θα επεξεργάζεται αιτήματα σε περιπτώσεις όπου ο διακομιστής δεν μπορεί να βρει άλλη εναλλακτική χρησιμοποιώντας την κεφαλίδα Host στο αίτημα πελάτη.

# προεπιλεγμένος εικονικός κεντρικός υπολογιστής
υπηρέτης(
ακούστε 80 προεπιλογή?
server_name localhost;
αρνούνται όλα?
}

Αυτό μπορεί να ακολουθείται από μία (ή περισσότερες) ενότητες «διακομιστή». Κάθε ένα από αυτά περιγράφει έναν εικονικό κεντρικό υπολογιστή (τις περισσότερες φορές, με βάση το όνομα). Για τους ιδιοκτήτες πολλών τοποθεσιών σε μία φιλοξενία ή για τους οικοδεσπότες, μπορεί να υπάρχει κάτι σαν οδηγία

Συμπεριλάβετε /spool/users/nginx/*.conf;

Τα υπόλοιπα πιθανότατα θα περιγράψουν τον εικονικό κεντρικό υπολογιστή τους απευθείας στην κύρια διαμόρφωση.

Διακομιστής (
ακούστε 80?

# Σημειώστε ότι η οδηγία διακομιστή_όνομα μπορεί να καθορίσει πολλά ονόματα ταυτόχρονα.
όνομα διακομιστή myserver.ru myserver.com;
access_log /spool/logs/nginx/myserver.access_log χρονομετρημένο;
error_log /spool/logs/nginx/myserver.error_log warn;
# ...

Ας ορίσουμε την προεπιλεγμένη κωδικοποίηση για έξοδο.

Charset utf-8;

Και ας πούμε ότι δεν θέλουμε να δεχόμαστε αιτήματα από πελάτες που έχουν μήκος μεγαλύτερο από 1 megabyte.

Client_max_body_size 1m;

Ας ενεργοποιήσουμε το SSI για τον διακομιστή και ας ζητήσουμε να δεσμευτεί όχι περισσότερο από 1 kilobyte για μεταβλητές SSI.

Si on?
ssi_value_length 1024;

Και τέλος, θα περιγράψουμε δύο τοποθεσίες, η μία από τις οποίες θα οδηγεί στο backend, στον Apache που εκτελείται στη θύρα 9999 και η δεύτερη θα στέλνει στατικές εικόνες από το τοπικό σύστημα αρχείων. Για δύο τοποθεσίες αυτό δεν έχει νόημα, αλλά για έναν μεγαλύτερο αριθμό από αυτές είναι επίσης λογικό να ορίζεται αμέσως μια μεταβλητή στην οποία θα αποθηκευτεί ο ριζικός κατάλογος διακομιστή και στη συνέχεια να χρησιμοποιείται στις περιγραφές τοποθεσιών.

Αποκλειστικός διακομιστής Web που βασίζεται στο nginx – πολύ καλός τρόποςβελτίωση της απόδοσης των ιστοσελίδων. Απλώς δεν έχει αντίστοιχη ταχύτητα επεξεργασίας στατικού περιεχομένου: μπορεί εύκολα να αντέξει πολλές χιλιάδες ταυτόχρονες συνδέσεις και μπορεί εύκολα να βελτιστοποιηθεί και να προσαρμοστεί σε οποιαδήποτε διαμόρφωση. Ωστόσο; Λειτουργώντας ως το front end για τον Apache, το nginx αποδεικνύεται ότι είναι το πιο ευάλωτο σημείο ολόκληρης της υποδομής Ιστού, επομένως πρέπει να δοθεί ιδιαίτερη προσοχή στην ασφάλεια του nginx.

Αυτό το άρθρο είναι ένα είδος εκπαιδευτικού προγράμματος ή, αν θέλετε, μια περίληψη όλων των τεχνικών για τη βελτίωση της ασφάλειας του nginx. Δεν θα περιέχει θεωρία, περιγραφή των βασικών στοιχείων για τη δημιουργία ενός διακομιστή Web και άλλα χνούδια. Αντίθετα, θα λάβετε ολοκληρωμένο, πρακτικό υλικό που περιγράφει όλα τα βασικά βήματα που πρέπει να κάνετε για να έχετε έναν πραγματικά ασφαλή διακομιστή Ιστού.

Εγκατάσταση

Το πακέτο nginx είναι διαθέσιμο σε προμεταγλωττισμένη μορφή για οποιαδήποτε διανομή. Ωστόσο, χτίζοντας μόνοι σας τον διακομιστή, μπορείτε να τον κάνετε πιο συμπαγή και αξιόπιστο και θα έχετε επίσης την ευκαιρία να αλλάξετε τη γραμμή χαιρετισμού του διακομιστή Web για να αποθαρρύνετε τα ανόητα παιδιά σεναρίου.

Αλλάξτε τη γραμμή χαιρετισμού του διακομιστή Web

Κατεβάστε τις πηγές nginx, ανοίξτε το αρχείο src/http/ngx_http_header_filter_module.c και βρείτε τις ακόλουθες δύο γραμμές:

static char ngx_http_server_string = "Διακομιστής: nginx" CRLF;
static char ngx_http_server_full_string = "Διακομιστής: " NGINX_VER CRLF;

Αντικαταστήστε τα με κάτι σαν αυτό:

static char ngx_http_server_string = "Διακομιστής: ][ Διακομιστής Ιστού"CRLF;
static char ngx_http_server_full_string = "Διακομιστής: ][Διακομιστής Ιστού" CRLF;

Καταργήστε όλες τις μονάδες nginx που δεν χρησιμοποιείτε

Ορισμένες μονάδες nginx συνδέονται απευθείας με τον διακομιστή Web κατά τη διάρκεια της μεταγλώττισης και οποιαδήποτε από αυτές είναι γεμάτη με πιθανό κίνδυνο. Ίσως στο μέλλον βρεθεί μια ευπάθεια σε ένα από αυτά και ο διακομιστής σας θα κινδυνεύσει. Απενεργοποιώντας τις περιττές μονάδες, μπορείτε να μειώσετε σημαντικά τον κίνδυνο εμφάνισης αυτής της κατάστασης.

Κατασκευάστε χρησιμοποιώντας τις ακόλουθες εντολές:

# ./configure --without-http_autoindex_module --without-http_ssi_module
# φτιαχνω, κανω
# κάντε εγκατάσταση

Με αυτόν τον τρόπο θα λάβετε nginx με τις μονάδες SSI (Server Side Includes) και Autoindex απενεργοποιημένες εκ των προτέρων (και στις περισσότερες περιπτώσεις άχρηστες). Για να μάθετε ποιες λειτουργικές μονάδες μπορούν να αφαιρεθούν με ασφάλεια από τον διακομιστή Web, εκτελέστε τη δέσμη ενεργειών διαμόρφωσης με τη σημαία '-help'.

Ας αναλύσουμε το nginx.conf

Μετά την εγκατάσταση, το nginx θα πρέπει να ρυθμιστεί. Υπήρχε ήδη υλικό που περιγράφει αυτή τη διαδικασία στις σελίδες του περιοδικού, αλλά θα παραμείνουμε στο θέμα του άρθρου και θα μιλήσουμε για τρόπους αύξησης της ασφάλειας του διακομιστή.

Απενεργοποιήστε την εμφάνιση της έκδοσης διακομιστή σε όλες τις σελίδες σφαλμάτων

Προσθέστε τη γραμμή "server_tokens off" στο αρχείο nginx.conf. Αυτό θα αναγκάσει το nginx να αποκρύψει πληροφορίες σχετικά με τον τύπο και την έκδοση του διακομιστή Web σε σελίδες που δημιουργούνται ως απόκριση σε ένα λανθασμένο αίτημα πελάτη.

Ρυθμίστε προστασία έναντι διαταραχής στοίβας

Προσθέστε τις ακόλουθες γραμμές στην ενότητα διακομιστή:

# vi /etc/nginx/nginx.conf

# Μέγιστο μέγεθος buffer για την αποθήκευση του σώματος του αιτήματος πελάτη
client_body_buffer_size 1K;
# Μέγιστο μέγεθος buffer για την αποθήκευση των κεφαλίδων αιτημάτων πελάτη
client_header_buffer_size 1k;
# Το μέγιστο μέγεθος του σώματος αιτήματος πελάτη, που καθορίζεται στο πεδίο κεφαλίδας Content-Length. Εάν ο διακομιστής πρέπει να υποστηρίζει μεταφορτώσεις αρχείων, αυτή η τιμή πρέπει να αυξηθεί
client_max_body_size 1k;
# Αριθμός και μέγεθος των buffer για την ανάγνωση της κεφαλίδας μεγάλων αιτημάτων πελάτη
large_client_header_buffers 2 1k;

Δώστε προσοχή στην οδηγία large_client_header_buffers. Από προεπιλογή, το nginx εκχωρεί τέσσερα buffer για την αποθήκευση της συμβολοσειράς URI, το μέγεθος καθενός από τα οποία είναι ίσο με το μέγεθος μιας σελίδας μνήμης (για x86 αυτό είναι 4 KB). Τα buffer απελευθερώνονται κάθε φορά που η σύνδεση εισέρχεται σε κατάσταση διατήρησης μετά την επεξεργασία ενός αιτήματος. Δύο buffer 1 KB μπορούν να αποθηκεύσουν URI μήκους μόνο 2 KB, γεγονός που βοηθά στην καταπολέμηση των bots και των επιθέσεων DoS.

Για να βελτιώσετε την απόδοση, προσθέστε τις ακόλουθες γραμμές:

# vi /etc/nginx/nginx.conf

# Λήξη χρονικού ορίου κατά την ανάγνωση του σώματος αιτήματος πελάτη
client_body_timeout 10;
# Λήξη χρονικού ορίου κατά την ανάγνωση της κεφαλίδας αιτήματος πελάτη
client_header_timeout 10;
# Χρονικό όριο μετά το οποίο η σύνδεση διατήρησης ζωντανής λειτουργίας με τον πελάτη δεν θα κλείσει από την πλευρά του διακομιστή
keepalive_timeout 5 5;
# Λήξη χρονικού ορίου κατά την αποστολή απάντησης στον πελάτη
send_timeout 10;

Ελέγξτε τον αριθμό των ταυτόχρονων συνδέσεων

Για να προστατεύσετε τον διακομιστή Web από υπερφόρτωση και απόπειρες πραγματοποίησης επίθεσης DoS, προσθέστε τις ακόλουθες γραμμές στη διαμόρφωση:

# vi /etc/nginx/nginx.conf

# Περιγράφουμε τη ζώνη (όρια) στην οποία θα αποθηκευτούν οι καταστάσεις συνεδρίας. Μια ζώνη 1 MB μπορεί να αποθηκεύσει περίπου 32000 καταστάσεις, ορίσαμε το μέγεθός της στα 5 MB
limit_zone limits $binary_remote_addr 5m;
# Ορίστε τον μέγιστο αριθμό ταυτόχρονων συνδέσεων για μία περίοδο λειτουργίας. Ουσιαστικά, αυτός ο αριθμός καθορίζει τον μέγιστο αριθμό συνδέσεων από μία IP
limit_conn όρια 5;

Η πρώτη οδηγία πρέπει να βρίσκεται στην ενότητα HTTP, η δεύτερη στην ενότητα τοποθεσίας. Όταν ο αριθμός των συνδέσεων υπερβεί τα όρια, ο πελάτης θα λάβει ένα μήνυμα «Η υπηρεσία δεν είναι διαθέσιμη» με κωδικό 503.

Επιτρέπονται οι συνδέσεις μόνο στον τομέα σας

Οι χάκερ μπορούν να χρησιμοποιήσουν bots για να σαρώσουν υποδίκτυα και να βρουν ευάλωτους διακομιστές Ιστού. Συνήθως, τα bots απλώς διασχίζουν εύρη διευθύνσεων IP αναζητώντας ανοιχτές θύρες 80 και στέλνουν ένα αίτημα HEAD για να λάβουν πληροφορίες σχετικά με τον διακομιστή ιστού (ή την αρχική σελίδα). Μπορείτε εύκολα να αποτρέψετε μια τέτοια σάρωση απαγορεύοντας την πρόσβαση στον διακομιστή μέσω διεύθυνσης IP (προσθήκη στην υποενότητα τοποθεσία):

# vi /etc/nginx/nginx.conf

if ($host !~ ^(host.com|www.host.com)$) (
επιστροφή 444;
}

Περιορίστε τον αριθμό των διαθέσιμων μεθόδων πρόσβασης στον διακομιστή Web

Μερικά ρομπότ χρησιμοποιούν διάφορες μεθόδουςκαλεί το διακομιστή για να προσπαθήσει να προσδιορίσει τον τύπο ή/και τη διείσδυσή του, αλλά το RFC 2616 δηλώνει ξεκάθαρα ότι ο διακομιστής Web δεν απαιτείται να τα εφαρμόσει όλα και ότι οι μη υποστηριζόμενες μέθοδοι μπορεί απλώς να μην υποβληθούν σε επεξεργασία. Μόνο σήμερα μέθοδοι GET(αίτημα για ένα έγγραφο), HEAD (αίτημα για κεφαλίδες διακομιστή) και POST (αίτημα για δημοσίευση εγγράφου), ώστε όλα τα άλλα να μπορούν να απενεργοποιηθούν με ασφάλεια τοποθετώντας τις ακόλουθες γραμμές στην ενότητα διακομιστή αρχείο ρυθμίσεων:

# vi /etc/nginx/nginx.conf

if ($request_method !~ ^(GET|HEAD|POST)$) (
επιστροφή 444;
}

Κλείστε τα bots

Ένας άλλος τρόπος αποκλεισμού bots, σαρωτών και άλλων κακών πνευμάτων βασίζεται στον προσδιορισμό του τύπου του πελάτη (user-agent). Δεν είναι πολύ αποτελεσματικό, επειδή τα περισσότερα bots στοχεύουν εντελώς νόμιμα προγράμματα περιήγησης, αλλά σε ορισμένες περιπτώσεις παραμένει χρήσιμο:

# vi /etc/nginx/nginx.conf

# Αποκλεισμός διαχειριστών λήψεων
if ($http_user_agent ~* LWP::Simple|BBBike|wget) (
επιστροφή 403;
}
# Αποκλεισμός ορισμένων τύπων bots
if ($http_user_agent ~* msnbot|scrapbot) (
επιστροφή 403;
}

Αποκλεισμός ανεπιθύμητων παραπομπών

Εάν ο ιστότοπός σας δημοσιεύει αρχεία καταγραφής Ιστού σε δημόσια προσβάσιμη μορφή, μπορείτε εύκολα να γίνετε θύμα ανεπιθύμητης αλληλογραφίας του Referrer (όταν τα spam bots επικοινωνούν με τον διακομιστή σας, υποδεικνύοντας τον σύνδεσμο παραπομπής στην κεφαλίδα - τη διεύθυνση του διαφημιζόμενου ιστότοπου). Αυτός ο τύπος ανεπιθύμητης αλληλογραφίας μπορεί εύκολα να καταστρέψει τις αξιολογήσεις SEO μιας ιστοσελίδας, επομένως πρέπει να αποκλειστεί χωρίς αποτυχία. Ένας τρόπος για να γίνει αυτό είναι να απαριθμήσετε τα περισσότερα συχνές λέξεις, που βρίσκονται στις διευθύνσεις των διαφημιζόμενων ιστότοπων, βρίσκονται στη μαύρη λίστα.

# vi /etc/nginx/nginx.conf

# Ενότητα διακομιστή
εάν ($http_referer ~* (μωρά|προπώληση|κορίτσι|κοσμήματα|αγάπη|γυμνό|οργανικό|πόκερ|πορνό|σεξ|έφηβος))
{
επιστροφή 403;
}

Αποκλεισμός hotlink

Ένα hotlink είναι η συμπερίληψη μιας εικόνας (ή άλλου περιεχομένου) από έναν άλλο ιστότοπο σε μια σελίδα. Ουσιαστικά, πρόκειται για κλοπή, επειδή η εικόνα στην οποία ξοδέψατε περισσότερο από μία ώρα από τον ελεύθερο χρόνο σας όχι μόνο χρησιμοποιείται ελεύθερα από άλλους, αλλά δημιουργεί επίσης φορτίο στον διακομιστή σας Web χωρίς να φέρνει επισκέπτες σε αυτόν. Για την καταπολέμηση των hotlinks, αρκεί να βεβαιωθείτε ότι οι εικόνες αποστέλλονται στον πελάτη μόνο εάν τις ζήτησε ενώ βρίσκεται ήδη στον ιστότοπο (με άλλα λόγια, η κεφαλίδα αιτήματος παραπομπής πρέπει να περιέχει το όνομα του ιστότοπού σας). Προσθέστε τις ακόλουθες γραμμές στην ενότητα διακομιστή του αρχείου διαμόρφωσης nginx.conf (host.com είναι η διεύθυνση του ιστότοπού σας):

# vi /etc/nginx/nginx.conf

τοποθεσία /εικόνες/ (
valid_referers κανένας δεν απέκλεισε το www.host.com host.com;
εάν ($invalid_referer) (
επιστροφή 403;
}
}

Εναλλακτικά, μπορείτε να ρυθμίσετε τις παραμέτρους του διακομιστή ώστε να επιστρέφει ένα ειδικό banner με μήνυμα για κλοπή αντί για την εικόνα που ζητήσατε. Για να το κάνετε αυτό, αντικαταστήστε τη γραμμή "return 403" με τη γραμμή:

ξαναγράψτε ^/images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.host.com/banned.jpg τελευταίο

Προστατέψτε σημαντικούς καταλόγους από αγνώστους

Όπως κάθε άλλος διακομιστής Ιστού, ο nginx σάς επιτρέπει να ρυθμίζετε την πρόσβαση σε καταλόγους με βάση διευθύνσεις IP και κωδικούς πρόσβασης. Αυτή η δυνατότητα μπορεί να χρησιμοποιηθεί για να κλείσετε ορισμένα μέρη του ιστότοπου από αδιάκριτα βλέμματα. Για παράδειγμα, για να αφαιρέσετε το URI από έξω κόσμος:

# vi /etc/nginx/nginx.conf

τοποθεσία /μεταφορτώσεις/ (
# Να επιτρέπεται η πρόσβαση μόνο σε μηχανήματα τοπικό δίκτυο
επιτρέπουν 192.168.1.0/24;
# Ας σκοτώσουμε όλους τους άλλους
αρνούνται όλα?
}

Τώρα μόνο οι χρήστες του τοπικού δικτύου θα έχουν πρόσβαση σε έγγραφα στον κατάλογο μεταφορτώσεων. Για να ορίσετε έναν κωδικό πρόσβασης θα πρέπει να κάνετε περισσότερα σύνθετες ενέργειες. Πρώτα πρέπει να δημιουργήσετε ένα αρχείο κωδικού πρόσβασης ιδιωτικό για το nginx και να το προσθέσετε σε αυτό απαιτούμενοι χρήστες(ας προσθέσουμε τον χρήστη διαχειριστή ως παράδειγμα):

# mkdir /etc/nginx/.htpasswd
# htpasswd -c /etc/nginx/.htpasswd/passwd admin

# vi /etc/nginx/nginx.conf

τοποθεσία /διαχειριστής/ (
auth_basic "Περιορισμένο";
auth_basic_user_file /etc/nginx/.htpasswd/passwd;
}

Νέοι χρήστες μπορούν να προστεθούν χρησιμοποιώντας την ακόλουθη εντολή:

# htpasswd -s /etc/nginx/.htpasswd/passwd χρήστη

Χρησιμοποιήστε SSL

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

Για να ρυθμίσετε την κρυπτογράφηση SSL χρησιμοποιώντας το nginx, απλώς ακολουθήστε μερικά βήματα: απλά βήματα. Πρώτα πρέπει να δημιουργήσετε ένα πιστοποιητικό χρησιμοποιώντας την ακόλουθη σειρά εντολών:

# cd /etc/nginx
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server.key -out server.csr
# cp server.key server.key.org
# openssl rsa -in server.key.org -out server.key
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Στη συνέχεια, περιγράψτε το πιστοποιητικό στο αρχείο διαμόρφωσης nginx:

# vi /etc/nginx/nginx.conf

υπηρέτης(
server_name host.com;
ακούστε 443;
ssl σε?
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
access_log /etc/nginx/logs/ssl.access.log;
error_log /etc/nginx/logs/ssl.error.log;
}

Μετά από αυτό, μπορείτε να επανεκκινήσετε τον διακομιστή Web:

# /etc/init.d/nginx reload

Φυσικά, χωρίς υποστήριξη από την ίδια την τοποθεσία Web, είναι άσκοπο να γίνει αυτό.

άλλες μεθόδους

Ορίστε τις σωστές τιμές για τις μεταβλητές του συστήματος

Ανοίξτε το αρχείο /etc/sysctl.conf και τοποθετήστε τις ακόλουθες γραμμές σε αυτό:

# vi /etc/sysctl.conf

# Προστασία από επιθέσεις στρουμφ
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Προστασία από μη έγκυρα μηνύματα ICMP
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Προστασία από την πλημμύρα ΣΥΝ
net.ipv4.tcp_syncookies = 1
# Απενεργοποίηση δρομολόγησης πηγής
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Προστασία κατά της πλαστογράφησης
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Δεν είμαστε ρούτερ
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Ενεργοποίηση ExecShield
kernel.exec-shield = 1
kernel.randomize_va_space = 1
# Επέκταση του εύρους των διαθέσιμων θυρών
net.ipv4.ip_local_port_range = 2000 65000
# Αυξήστε το μέγιστο μέγεθος των buffer TCP
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

Τοποθετήστε τον ριζικό κατάλογο του διακομιστή web σε ένα αποκλειστικό διαμέρισμα

Τοποθετώντας τον ριζικό κατάλογο του διακομιστή Web σε ένα αποκλειστικό διαμέρισμα και απαγορεύοντας την τοποθέτηση εκτελέσιμων αρχείων ή αρχείων συσκευής εκεί, θα προστατεύσετε το υπόλοιπο σύστημα από οποιονδήποτε έχει πρόσβαση στη ρίζα του διακομιστή Web. Σε αυτήν την περίπτωση, η καταχώρηση στο αρχείο /etc/fstab θα πρέπει να μοιάζει κάπως έτσι:

/dev/sda5 /nginx ext4 προεπιλογές,nosuid,noexec,nodev 1 2

Τοποθετήστε το nginx σε περιβάλλον chroot/jail

Οποιοδήποτε σύγχρονο σύστημα *nix σάς επιτρέπει να κλειδώνετε την εφαρμογή σε ένα απομονωμένο περιβάλλον εκτέλεσης. Στο Linux, μπορείτε να χρησιμοποιήσετε τεχνολογίες KVM, Xen, OpenVZ και VServer για αυτό, στο FreeBSD - Jail, στο Solaris - Zones. Εάν καμία από αυτές τις τεχνολογίες δεν είναι διαθέσιμη, μπορείτε να βάλετε το nginx σε ένα κλασικό chroot, το οποίο, αν και πολύ πιο εύθραυστο, μπορεί να σταματήσει τους περισσότερους χάκερ.

Εγκαταστήστε κανόνες SELinux για την προστασία του nginx

Μια καλή εναλλακτική απομονωμένα περιβάλλονταΟι εκτελέσεις είναι τοπικά συστήματα ανίχνευσης και πρόληψης εισβολής, όπως το SELinux ή το AppArmor. Εάν ρυθμιστούν σωστά, μπορούν να αποτρέψουν απόπειρες παραβίασης του διακομιστή Web. Από προεπιλογή, κανένα από αυτά δεν έχει ρυθμιστεί να λειτουργεί σε συνδυασμό με το nginx, ωστόσο, στο πλαίσιο του έργου SELinuxNginx(http://sf.net/projects/selinuxnginx/) έχουν δημιουργηθεί κανόνες για το SELinux που μπορεί να χρησιμοποιήσει ο καθένας. Το μόνο που μένει είναι να κατεβάσετε και να εγκαταστήσετε:

# tar -zxvf se-ngix_1_0_10.tar.gz
# cd se-ngix_1_0_10/nginx
# φτιαχνω, κανω
# /usr/sbin/semodule -i nginx.pp

Ρύθμιση τείχους προστασίας

Συνήθως, το nginx εγκαθίσταται σε αποκλειστικές μηχανές, έτοιμες για υψηλό φορτίο, επομένως είναι συχνά η μόνη υπηρεσία δικτύου που εκτελείται στον διακομιστή. Για να ασφαλίσετε τον διακομιστή, αρκεί να δημιουργήσετε ένα πολύ μικρό σύνολο κανόνων που θα ανοίγουν τις θύρες 80, 110 και 143 (αν, φυσικά, το nginx λειτουργήσει και ως διακομιστής μεσολάβησης IMAP/POP3) και θα κλείσει οτιδήποτε άλλο από τον έξω κόσμο .

Περιορίστε τον αριθμό των συνδέσεων χρησιμοποιώντας ένα τείχος προστασίας

Για έναν ιστότοπο με ελαφρά φόρτωση, είναι καλή ιδέα να περιορίσετε τον αριθμό των προσπαθειών σύνδεσης από μία μόνο διεύθυνση IP ανά λεπτό. Αυτό μπορεί να σας προστατεύσει από ορισμένους τύπους επιθέσεων DoS και ωμής βίας. Στο Linux, αυτό μπορεί να γίνει χρησιμοποιώντας την τυπική ενότητα κατάστασης iptables/netfilter:

# iptables -A INPUT -p tcp --dport 80 -i eth0 \
κατάσταση --κράτοςΝΕΟ -m πρόσφατο --σύνολο
# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m κατάσταση --κατάσταση ΝΕΟ -m πρόσφατη --ενημέρωση \
--δευτερόλεπτα 60 --πλήθος επισκέψεων 15 -j DROP

Οι κανόνες μειώνουν το όριο στον αριθμό των συνδέσεων από μία IP ανά λεπτό σε 15. Το ίδιο μπορεί να γίνει χρησιμοποιώντας το pf:

# vi /etc/pf.conf

webserver_ip="1.1.1.1"
τραπέζι επιμένω
αποκλείστε γρήγορα από
περάστε το $ext_if proto tcp στο $webserver_ip \
λιμάνι www flags S/SA κρατήστε κατάσταση \
(max-src-conn 100, max-src-conn-rate 15/60,\
παραφορτώνω ξεπλύνετε)

Εκτός από το όριο στον αριθμό των διαδοχικών συνδέσεων (15 ανά λεπτό), αυτός ο κανόνας θέτει ένα πρόσθετο όριο στον αριθμό των ταυτόχρονων συνδέσεων ίσο με 100.

Ρύθμιση PHP

Εάν χρησιμοποιείτε το nginx σε συνδυασμό με την PHP, μην ξεχάσετε να το ρυθμίσετε επίσης. Έτσι θα πρέπει να μοιάζει το αρχείο διαμόρφωσης /etc/php/php.ini του ασφαλούς διακομιστή:

# vi /etc/php/php.ini

# Απενεργοποιήστε τις επικίνδυνες λειτουργίες
disable_functions = phpinfo, σύστημα, mail, exec
# Μέγιστος χρόνος εκτέλεσης σεναρίου
max_execution_time = 30
# Μέγιστος χρόνος που μπορεί να αφιερώσει το σενάριο για την επεξεργασία δεδομένων αιτήματος
max_input_time = 60
# Μέγιστη ποσότητα μνήμης που εκχωρείται σε κάθε σενάριο
Όριο_μνήμης = 8M
# Μέγιστο μέγεθος δεδομένων που αποστέλλονται στο σενάριο χρησιμοποιώντας τη μέθοδο POST
post_max_size = 8M
# Μέγιστο μέγεθος μεταφορτωμένων αρχείων
upload_max_filesize = 2M
# Μην εμφανίζετε σφάλματα σεναρίου PHP στους χρήστες
display_errors = Απενεργοποίηση
# Ενεργοποιήστε την ασφαλή λειτουργία
safe_mode = Ενεργό
# Ενεργοποίηση ασφαλούς λειτουργίας SQL
sql.safe_mode = Ενεργό
# Να επιτρέπεται η εκτέλεση εξωτερικών εντολών μόνο σε αυτόν τον κατάλογο
safe_mode_exec_dir = /path/to/protected/directory
# Προστασία από διαρροή πληροφοριών σχετικά με την PHP
expose_php = Απενεργοποίηση
# Διατηρούμε αρχεία καταγραφής
log_errors = Ενεργό
# Αποτρέψτε το άνοιγμα απομακρυσμένων αρχείων
allow_url_fopen = Απενεργοποίηση

συμπεράσματα

Εφαρμόζοντας τις συστάσεις που περιγράφονται σε αυτό το άρθρο, θα αποκτήσετε έναν πολύ πιο ασφαλή διακομιστή Web. Λάβετε όμως υπόψη ότι δεν ταιριάζουν όλες οι τεχνικές στη διαμόρφωσή σας. Για παράδειγμα, η προστασία ωμής βίας που βασίζεται στη μείωση του μεγέθους των buffer που εκχωρούνται από το nginx για την επεξεργασία αιτημάτων πελατών μπορεί να οδηγήσει σε μείωση της απόδοσης και σε ορισμένες περιπτώσεις σε αποτυχίες στην επεξεργασία αιτημάτων. Ο περιορισμός του αριθμού των συνδέσεων θα επηρεάσει σοβαρά την απόδοση ακόμη και μιας τοποθεσίας Web με μέτρια φόρτωση, αλλά θα είναι επωφελής εάν η σελίδα έχει χαμηλή επισκεψιμότητα. Ελέγχετε πάντα πώς οι αλλαγές που κάνετε επηρεάζουν την απόδοση και τη συνολική υγεία της ιστοσελίδας.

Για τον ήρωα της ημέρας

Ο Nginx είναι ένας από τους πιο ισχυρούς και δημοφιλείς διακομιστές Ιστού στον κόσμο. Σύμφωνα με το Netcraft, χρησιμοποιείται για την υποστήριξη περισσότερων από 12 εκατομμυρίων τοποθεσιών Web σε όλο τον κόσμο, συμπεριλαμβανομένων των μαστοδόνων όπως οι Rambler, Yandex, Begun, WordPress.com, Wrike, vkontakte.ru, megashara.com, Librusec και Taba.ru. Μια ικανή αρχιτεκτονική που βασίζεται σε συνδέσεις πολυπλεξίας χρησιμοποιώντας κλήσεις συστήματος Select, epoll (Linux), kqueue (FreeBSD) και μηχανισμό διαχείρισης μνήμης που βασίζεται σε pools (μικρά buffers από 1 έως 16 KB) επιτρέπει στο nginx να μην κρεμάει ακόμη και κάτω από πολύ υψηλά φορτία, αντέχοντας πάνω από 10.000 ταυτόχρονες συνδέσεις (το λεγόμενο πρόβλημα C10K). Αρχικά γράφτηκε από τον Igor Sysoev για το Rambler και άνοιξε το 2004 με άδεια τύπου BSD.

Σε επαφή με

Πάνω από το 50% της κυκλοφορίας παγκοσμίως εξυπηρετείται από την τεχνολογία Apache και Nginx– διακομιστές ιστού που είναι ανοιχτοί πηγή. Το Nginx εκτελεί τη λειτουργία frontend, ο Apache εκτελεί τη λειτουργία backend. Η Nginx είναι η πρώτη που δέχεται αιτήματα χρηστών και απαντά σε αυτά με το απαραίτητο περιεχόμενο - εικόνες, αρχεία, σενάρια. Το Heavy Apache, με τη σειρά του, δεν ασχολείται με αυτό, αλλά επεξεργάζεται τη δυναμική. Αιτήματα διακομιστή μεσολάβησης Nginx και απαντήσεις επιστροφής. Αυτός ο συνδυασμός είναι εξαιρετικός για μεγάλους ιστότοπους που επισκέπτονται πολλοί χρήστες. Για μικρές τοποθεσίες, αυτός ο συνδυασμός δεν θα αυξήσει την παραγωγικότητα. Το Apache και το Nginx μειώνουν το φόρτο στον διακομιστή γενικά λόγω του γεγονότος ότι Λαβές Nginx στατικό περιεχόμενο, και το Apache είναι δυναμικό.

Το Apache και το Nginx δεν πρέπει να θεωρούνται εναλλάξιμες τεχνολογίες, παρόλο που έχουν πολλά παρόμοια χαρακτηριστικά. Κάθε διακομιστής ιστού έχει τα δικά του πλεονεκτήματα και η χρήση του εξαρτάται από την εργασία που εκτελείται. Σε αυτό το άρθρο Ας δούμε κάθε τεχνολογία ανάλογα με το πεδίο εφαρμογής.Το άρθρο θα είναι χρήσιμο στους κατόχους εικονικών και αποκλειστικών φυσικών διακομιστών.

Λειτουργικό και γρήγορο, το Nginx κυκλοφόρησε το 2004 και μετά από αυτή την κυκλοφορία άρχισε να κερδίζει τη δημοτικότητά του. Λόγω του ελαφρού βάρους και της επεκτασιμότητας του, λειτουργεί καλά σε οποιοδήποτε υλικό. Το Nginx χρησιμοποιείται με δύο τρόπους: ως διακομιστής ιστού ή ως διακομιστής μεσολάβησης.

Τι κάνει ο Nginx ως διακομιστής ιστού;

  • δημιουργεί αυτόματα περιγραφείς κρυφής μνήμης και λίστες αρχείων, διατηρεί αρχεία ευρετηρίουκαι στατικά ερωτήματα.
  • επιταχύνει την ανοχή σφαλμάτων, το proxy και την εξισορρόπηση φορτίου.
  • αποθήκευση κρυφής μνήμης με FastCGI και επιταχύνει τον διακομιστή μεσολάβησης.
  • υποστηρίζει SSL.
  • υποστηρίζει Perl?
  • έχει φίλτρα και αρθρωτότητα.
  • επαληθεύει το HTTP και φιλτράρει το SSL.

Ως διακομιστής μεσολάβησης Nginx:

  • πλήρης παροχή StartTLS και SSL.
  • ευκολία ελέγχου ταυτότητας (USER/PASS, LOGIN).
  • χρησιμοποιεί έναν εξωτερικό διακομιστή HTTP για να ανακατευθύνει στο backend POP3/IMAP.

Όπως μπορείτε να δείτε, το Nginx εκτελεί πολλές λειτουργίες χωρίς να υπερφορτώνει το σύστημα. Σύμφωνα με επίσημα στοιχεία, η τεχνολογία χρησιμοποιείται από περισσότερους από 56 εκατομμύρια ιστότοπους σε όλο τον κόσμο (για παράδειγμα, Rambler, Yandex, Mail, Begun, WordPress.com, vk.com, Facebook, Rutracker.org), αλλά το Nginx είναι κατώτερο από Apache σε δημοτικότητα. Γιατί το Apache είναι τόσο δημοφιλές;

Διακομιστής ιστού Apache – cross-platform λογισμικό, που δημιουργήθηκε το 1995. Χάρη στην εκτενή τεκμηρίωση και την καλή ενσωμάτωση με λογισμικό τρίτων, το Apache έχει αποκτήσει τεράστια δημοτικότητα. Υποστηρίζει το ακόλουθο λειτουργικό σύστημα - Linux, BSD, Mac OS, Microsoft Windows, Novell NetWare, BeOS. .

Πλεονεκτήματα του διακομιστή ιστού Apache:

  • υποστήριξηγλώσσες προγραμματισμού PHP, Python, Ruby, Perl, ASP, Tcl;
  • ευκολία σύνδεσης εξωτερικών μονάδων.
  • τεχνολογική υποστήριξη CGI και FastCGI;
  • η παρουσία μηχανισμών που διασφαλίζουν την ασφάλεια και τη διαφοροποίηση της πρόσβασης στα δεδομένα·
  • τη δυνατότητα χρήσης DBMS για έλεγχο ταυτότητας χρήστη.
  • ευέλικτη και αξιόπιστη διαμόρφωση συστήματος.
  • κατάλληλο για εφαρμογές που απαιτούν ισχυρός κρυπτογραφική προστασίαδεδομένα;
  • τη δυνατότητα δημιουργίας προσαρμοσμένων καταλόγων για τον ιστότοπο.
  • δυνατότητα διαμόρφωσης εικονικών κεντρικών υπολογιστών, με τη βοήθεια του οποίου στο ένα φυσικός διακομιστήςΜπορείτε να δημιουργήσετε πολλά εικονικά.
  • κρατά αρχεία καταγραφής του τι συμβαίνει στον διακομιστή σας.
  • ενεργός Ανατροφοδότησημε προγραμματιστέςκαι έγκαιρη επίλυση σφαλμάτων λογισμικού.

Όμως παρ' όλα τα πλεονεκτήματα Διακομιστής ιστού Apacheκάπως δύσκολο να ρυθμιστεί και να λειτουργήσει, επομένως δεν θα είναι σε θέση κάθε αρχάριος να το αντιμετωπίσει. Αν όμως το έργο σας χρειάζεται το συγκεκριμένο λογισμικό, τότε θα κάνετε τη σωστή επιλογή υπέρ του Apache.

Θέλετε να ασφαλίσετε την PHP στον διακομιστή σας; Περισσότερες λεπτομέρειες για αυτό.

Αφού μάθετε τα πλεονεκτήματα και τα μειονεκτήματα του Apache και του Nginx, μπορείτε να επιλέξετε χρήσιμες λύσειςγια τον ιστότοπό σας, ανάλογα με τους στόχους που επιδιώκετε. Αλλά ίσως χρειαστείτε τον συνδυασμό Apache+Nginxγια να πετύχετε το καλύτερο αποτέλεσμα. Για παράδειγμα, το Nginx χρησιμοποιείται συχνά πριν από το Apache ως αντίστροφο διακομιστή μεσολάβησης. Αυτός ο συνδυασμός σας επιτρέπει να χειρίζεστε πολλά ανταγωνιστικά αιτήματακαι τα ταξινομεί. Αυτά τα αιτήματα που το Nginx δεν μπορεί να χειριστεί αποστέλλονται στον Apache, μειώνοντας έτσι το φόρτο του τελευταίου. Σε αυτή την περίπτωση, η ανοχή σφαλμάτων αυξάνεται. Πριν επιλέξετε έναν διακομιστή ιστού, πρέπει να πραγματοποιήσετε υποχρεωτικές δοκιμές για την απόδοση και τις δυνατότητες κάθε λύσης.

Για περισσότερες πληροφορίες σχετικά με όλες τις τεχνολογίες που υποστηρίζονται από τη φιλοξενία HyperHost, επισκεφτείτε το.

Αυτό το άρθρο παρέχεται για γενική εξοικείωση με τις δυνατότητες συνδυασμού διακομιστών web Apache και Nginx. Περισσότερο περισσότερες πληροφορίες V .

Εάν χρειάζεστε τη βοήθειά μας, επικοινωνήστε μαζί μας!

Θα χαρούμε να απαντήσουμε σε όλες τις ερωτήσεις σας σχετικά με τη ρύθμιση διακομιστών ιστού. Μπορείτε επίσης να λάβετε πάντα δωρεάν διαχείριση από εμάς. Είναι όλα τεχνική υποστήριξηοι οικοδεσπότες είναι ίδιοι; Σχετικά με τις δυνατότητες της δωρεάν και επί πληρωμή διαχείριση σε ένα ειδικό.

17248 φορές 9 Προβλήθηκαν φορές σήμερα

Ο διακομιστής ιστού Nginx είναι ένας από τους πιο δημοφιλείς διακομιστές ιστού με πολύ υψηλή απόδοση και γρήγορη επεξεργασία στατικών αιτημάτων από χρήστες. Στο σωστή ρύθμισηΜπορείτε να έχετε πολύ υψηλή απόδοση από αυτόν τον διακομιστή ιστού. Το Nginx είναι πολύ γρήγορο στο χειρισμό στατικών αρχείων, είτε αυτό σελίδες htmlή άλλους τύπους πόρων.

Σε ένα από τα προηγούμενα άρθρα εξετάσαμε ήδη τη ρύθμιση των κύριων παραμέτρων του, σε αυτό το άρθρο θέλω να σταθώ περισσότερο στην απόδοση και την προετοιμασία του διακομιστή web για χρήση σε συνθήκες μάχης. Σχετικά με Διανομή Linux, τότε σήμερα θα εξετάσουμε το CentOS, αυτό το σύστημα χρησιμοποιείται συχνά σε διακομιστές και ενδέχεται να προκύψουν κάποιες δυσκολίες με τη ρύθμιση του Nginx. Στη συνέχεια θα εξετάσουμε τη ρύθμιση του Nginx CentOS, ας μιλήσουμε για το πώς να ενεργοποιήσετε την πλήρη υποστήριξη για το http2, google page speedκαι διαμορφώστε το κύριο αρχείο διαμόρφωσης.

Τα επίσημα αποθετήρια CentOS περιλαμβάνουν το Nginx και πιθανότατα είναι ήδη εγκατεστημένο στο σύστημά σας. Θέλουμε όμως ο ιστότοπος να λειτουργεί χρησιμοποιώντας το πρωτόκολλο http2, το οποίο σας επιτρέπει να μεταφέρετε όλα τα δεδομένα με μία σύνδεση και αυτό αυξάνει την απόδοση. Για να εργαστείτε μέσω http2, θα χρειαστεί να διαμορφώσετε ένα πιστοποιητικό SSL, αλλά αυτό είναι ήδη γραμμένο στο άρθρο για την απόκτηση πιστοποιητικού Lets Encrypt Nginx. Αλλά δεν είναι μόνο αυτό. Για εναλλαγή από το κανονικό SSL στο HTTP2.0, τα περισσότερα προγράμματα περιήγησης χρησιμοποιούν πλέον το πρωτόκολλο ALPN και υποστηρίζεται από το OpenSSL 1.02. Ενώ τα αποθετήρια έχουν μόνο OpenSSL 1.01. Επομένως, πρέπει να εγκαταστήσουμε μια έκδοση του Nginx που έχει κατασκευαστεί με OpenSSL 1.02. Μπορείτε να χρησιμοποιήσετε το Broken Repo για αυτό:

sudo yum -y εγκατάσταση yum-utils
# sudo yum-config-manager --add-repo https://brouken.com/brouken.repo

Εάν χρησιμοποιείτε το αποθετήριο EPEL, τότε πρέπει να υποδείξετε ότι δεν χρειάζεται να πάρετε το Nginx από αυτό:

sudo yum-config-manager --save --setopt=epel.exclude=nginx*;

Τώρα για να εγκαταστήσετε τη σωστή έκδοση του Nginx, απλώς πληκτρολογήστε:

sudo yum εγκατάσταση nginx

Το περισσότερο τελευταία έκδοση Nginx 1.13.2, με πλήρη υποστήριξη ALPN. Στη συνέχεια, ας προχωρήσουμε στη ρύθμιση.

2. Ρύθμιση του Nginx

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

παγκόσμιες επιλογές
εκδηλώσεις ()
http(
υπηρέτης(
τοποθεσία()
}
υπηρέτης()
}

Πρώτα υπάρχουν καθολικές επιλογές, οι οποίες ορίζουν τις βασικές παραμέτρους του προγράμματος, για παράδειγμα, ποιος χρήστης θα εκκινηθεί και τον αριθμό των διεργασιών. Στη συνέχεια υπάρχει μια ενότητα εκδηλώσεις, το οποίο περιγράφει πώς το Nginx θα ανταποκρίνεται στις εισερχόμενες συνδέσεις, ακολουθούμενο από την ενότητα http, το οποίο συνδυάζει όλες τις ρυθμίσεις σχετικά με τη λειτουργία του πρωτοκόλλου http. Περιέχει μια ενότητα υπηρέτης, κάθε τέτοια ενότητα είναι υπεύθυνη για έναν ξεχωριστό τομέα, η ενότητα διακομιστή περιέχει ενότητες τοποθεσία, καθένα από τα οποία είναι υπεύθυνο για ένα συγκεκριμένο Αίτημα URL, σημειώστε ότι δεν είναι αρχείο στον διακομιστή, όπως στο Apache, αλλά η διεύθυνση URL αιτήματος.

Βασικός γενικές ρυθμίσειςθα το κάνουμε στο αρχείο /etc/nginx/nginx.conf. Στη συνέχεια, ας δούμε τι ακριβώς θα αλλάξουμε και ποιες τιμές είναι σκόπιμο να ορίσουμε. Ας ξεκινήσουμε με τις καθολικές επιλογές:

  • χρήστης- ο χρήστης για λογαριασμό του οποίου θα εκκινηθεί ο διακομιστής πρέπει να είναι ο κάτοχος του καταλόγου με τα αρχεία του ιστότοπου και το php-fpm πρέπει να εκτελείται για λογαριασμό του.
  • worker_processes- ο αριθμός των διεργασιών Nginx που θα εκκινηθούν πρέπει να οριστεί ακριβώς όσες έχετε πυρήνες, για παράδειγμα, εγώ έχω 4.
  • worker_cpu_affinity- αυτή η παράμετρος σάς επιτρέπει να αντιστοιχίσετε κάθε διεργασία σε έναν ξεχωριστό πυρήνα επεξεργαστή, έτσι ώστε το ίδιο το πρόγραμμα να επιλέξει σε τι θα επισυναφθεί.
  • worker_rlimit_nofile- ο μέγιστος αριθμός αρχείων που μπορεί να ανοίξει το πρόγραμμα, για κάθε σύνδεση χρειάζεστε τουλάχιστον δύο αρχεία και κάθε διαδικασία θα έχει τον αριθμό των συνδέσεων που καθορίζετε, οπότε ο τύπος είναι: worker_processes * Worker_connections * 2, παράμετρος εργαζόμενος_συνδέσειςΑς το δούμε παρακάτω.
  • pcre_jit- ενεργοποιήστε αυτήν την επιλογή για να επιταχύνετε την επεξεργασία κανονικές εκφράσειςΧρησιμοποιώντας τη συλλογή JIT.

Στην ενότητα συμβάντων θα πρέπει να διαμορφώσετε δύο παραμέτρους:

  • εργαζόμενος_συνδέσεις- ο αριθμός των συνδέσεων για μία διεργασία πρέπει να είναι επαρκής για την επεξεργασία των εισερχόμενων συνδέσεων. Αρχικά, πρέπει να γνωρίζουμε πόσες από αυτές τις εισερχόμενες συνδέσεις υπάρχουν, για αυτό εξετάζουμε τα στατιστικά στοιχεία στον διακομιστή ip_address/nginx_status. Θα δούμε πώς να το ενεργοποιήσετε παρακάτω. Στη γραμμή Active Connections βλέπουμε τον αριθμό των ενεργών συνδέσεων με τον διακομιστή, πρέπει επίσης να λάβουμε υπόψη ότι μετρώνται και οι συνδέσεις με php-fpm. Στη συνέχεια, δώστε προσοχή στα αποδεκτά πεδία και τα πεδία χειρισμού, το πρώτο εμφανίζει επεξεργασμένες συνδέσεις, το δεύτερο - τον αριθμό των αποδεκτών συνδέσεων. Οι τιμές πρέπει να είναι ίδιες. Εάν διαφέρουν, σημαίνει ότι δεν υπάρχουν αρκετές συνδέσεις. Δείτε παραδείγματα, η πρώτη εικόνα είναι το πρόβλημα, η δεύτερη είναι η σειρά. Για τη διαμόρφωσή μου, ο βέλτιστος αριθμός μπορεί να είναι 200 ​​συνδέσεις (800 συνολικά, λαμβάνοντας υπόψη 4 διαδικασίες):

  • multi_accept- επιτρέπει στο πρόγραμμα να δέχεται πολλές συνδέσεις ταυτόχρονα, επιταχύνει επίσης την εργασία με μεγάλο αριθμό συνδέσεων.
  • accept_mutex- ορίστε την τιμή αυτής της παραμέτρου σε off, έτσι ώστε όλες οι διεργασίες να λαμβάνουν αμέσως ειδοποίηση για νέες συνδέσεις.

Συνιστάται επίσης να χρησιμοποιήσετε την οδηγία use epoll στην ενότητα συμβάντων, καθώς αυτή είναι η πιο αποτελεσματική μέθοδος για την επεξεργασία εισερχόμενων συνδέσεων για Linux, αλλά αυτή η μέθοδος χρησιμοποιείται από προεπιλογή, επομένως δεν βλέπω νόημα να την προσθέσω με μη αυτόματο τρόπο. Ας δούμε μερικές ακόμη παραμέτρους από την ενότητα http:

  • αποστολή αρχείου- χρησιμοποιήστε τη μέθοδο αποστολής δεδομένων sendfile. Η πιο αποτελεσματική μέθοδος για Linux.
  • tcp_nodelay, tcp_nopush- στέλνει τις κεφαλίδες και το σώμα της αίτησης σε ένα πακέτο, λειτουργεί λίγο πιο γρήγορα.
  • keepalive_timeout- timeout για τη διατήρηση μιας σύνδεσης με τον πελάτη, εάν δεν έχετε πολύ αργά σενάρια, τότε θα είναι αρκετά 10 δευτερόλεπτα, ορίστε την τιμή όσο χρειάζεται, ώστε ο χρήστης να μπορεί να συνδεθεί στον διακομιστή.
  • reset_timedout_connection- διακοπή συνδέσεων μετά από ένα τάιμ άουτ.
  • open_file_cache- πληροφορίες κρυφής μνήμης για ανοιχτά αρχεία. Για παράδειγμα, open_file_cache max=200000 inactive=120s; max - μέγιστος αριθμός αρχείων στην κρυφή μνήμη, χρόνος προσωρινής αποθήκευσης.
  • open_file_cache_valid- όταν πρέπει να ελέγξετε τη συνάφεια των αρχείων. Για παράδειγμα: open_file_cache_valid 120s;
  • open_file_cache_min_uses- προσωρινή αποθήκευση μόνο αρχείων που έχουν ανοιχτεί καθορισμένη ποσότηταμια φορά;
  • open_file_cache_errors- θυμηθείτε τα σφάλματα ανοίγματος αρχείων.
  • if_modified_of- καθορίζει τον τρόπο επεξεργασίας των κεφαλίδων if-modified-αφού. Με αυτήν την κεφαλίδα, το πρόγραμμα περιήγησης μπορεί να λάβει μια απάντηση 304 εάν η σελίδα δεν έχει αλλάξει από τότε τελευταία προβολή. Πιθανές επιλογές: μην αποστέλλεται - αποστέλλεται, αποστολή εάν η ώρα ταιριάζει ακριβώς - ακριβής, αποστολή εάν η ώρα ταιριάζει ακριβώς ή περισσότερο - πριν.

Έτσι θα μοιάζει η ρύθμιση του nginx conf:

χρήστης nginx?
worker_processes 4;
worker_cpu_affinity auto;
worker_rlimit_nofile 10000;
pcre_jit on?

error_log /var/log/nginx/error.log warn;
load_module "modules/ngx_pagespeed.so";

εκδηλώσεις (
multi_accept on;
accept_mutex off;
Worker_connections 1024;
}

sendfile on?
tcp_nopush on;
tcp_nodelay ενεργοποιημένο;

open_file_cache max=200000 inactive=20s;
open_file_cache_valid 120s;
open_file_cache_errors on;

reset_timedout_connection ενεργοποιημένο?
client_body_timeout 10;
keepalive_timeout 65;

περιλαμβάνουν /etc/nginx/sites-enabled.*.conf

3. Ρύθμιση του http2

Δεν θα περιγράψω λεπτομερώς τη ρύθμιση της ενότητας διακομιστή, επειδή το έκανα ήδη στο άρθρο εγκατάστασης του Nginx στο Ubuntu και δεν έχω τίποτα να προσθέσω εδώ, Ρύθμιση SSLΑυτό είναι ένα αρκετά ευρύ θέμα και θα συζητηθεί επίσης σε ξεχωριστό άρθρο. Αλλά για να ρυθμίσετε το http2 πρέπει να έχετε ήδη SSL. Στη συνέχεια, απλώς προσαρμόστε την οδηγία ακρόασης στην ενότητα του διακομιστή σας:

ακούστε 194.67.215.125:443 default_server;

ακούστε 194.67.215.125:443 http2 default_server;

Σαν αυτό με απλό τρόπομπορείτε να ενεργοποιήσετε το http2 εάν το έχετε εγκαταστήσει στο παρελθόν σωστή έκδοση Nginx.

4. Ρύθμιση PageSpeed

Το Google Pagespeed είναι μια λειτουργική μονάδα Nginx που εκτελεί διάφορες βελτιστοποιήσεις για να διασφαλίσει ότι οι σελίδες φορτώνουν πιο γρήγορα, ο διακομιστής ιστού λειτουργεί πιο αποτελεσματικά και οι χρήστες αισθάνονται λιγότερη ενόχληση. Αυτό περιλαμβάνει προσωρινή αποθήκευση, βελτιστοποίηση κώδικας html, βελτιστοποίηση εικόνας, συνδυασμός javascript και κώδικας cssκαι πολλα ΑΚΟΜΑ. Όλα αυτά γίνονται σε επίπεδο Nginx, επομένως είναι πιο αποτελεσματικό από ό,τι αν το κάνατε στην PHP. Αλλά υπάρχει ένα μειονέκτημα: η ενότητα αφαιρεί την κεφαλίδα Τελευταία τροποποίηση.

Το γεγονός είναι ότι το PageSpeed ​​θέτει μια πολύ μεγάλη γραμμή προσωρινής μνήμης για όλα τα αρχεία και προσθέτει τον κατακερματισμό του στο όνομα του αρχείου. Με αυτόν τον τρόπο, η ταχύτητα φόρτωσης πόρων είναι πολύ υψηλότερη, καθώς το πρόγραμμα περιήγησης θα ζητά μόνο αρχεία με το νέο κατακερματισμό και το LastModified αφαιρείται, ώστε οι χρήστες να μπορούν να δουν τις αλλαγές εάν αλλάξει κάποιο αρχείο. Τώρα ας δούμε πώς να εγκαταστήσετε τη μονάδα. Θα πρέπει να το δημιουργήσουμε από τον πηγαίο κώδικα.

Πρώτα εγκαταστήστε τα εργαλεία για τη συναρμολόγηση, είναι πολύ σημαντικό, αν δεν το εγκαταστήσετε, τότε θα λάβετε ένα σφάλμα και δεν θα ξέρετε τι να κάνετε:

yum εγκατάσταση wget gcc cmake unzip gcc-c++ pcre-devel zlib-devel

Λήψη και εξαγωγή πηγών Nginx για την έκδοσή σας, για παράδειγμα 1.13.3:

wget -c https://nginx.org/download/nginx-1.13.3.tar.gz
# tar -xzvf nginx-1.13.3.tar.gz

Η ρύθμιση του διακομιστή nginx δεν περιλαμβάνει επανασυναρμολόγηση και αντικατάσταση του προγράμματος από το αποθετήριο, χρησιμοποιούμε απλώς αυτές τις πηγές για τη δημιουργία της ενότητας. Λήψη και εξαγωγή πηγών PageSpeed:

wget -c https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip
# unzip v1.12.34.2-stable.zip

Κατεβάστε και αποσυσκευάστε τη βιβλιοθήκη βελτιστοποίησης PageSpeed ​​στο φάκελο με τις πηγές της λειτουργικής μονάδας:

cd ngx_pagespeed-1.12.34.2-stable/
# wget -c https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
# tar -xvzf 1.12.34.2-x64.tar.gz

Λήψη και αποσυσκευασία πηγών OpenSSL 1.02:

wget -c https://www.openssl.org/source/openssl-1.0.2k.tar.gz -O /opt/lib/$OPENSSL.tar.gz
# tar xvpzf openssl-1.0.2k.tar.gz

Τώρα πρέπει να συναρμολογήσουμε τη μονάδα. Πρώτα, κοιτάξτε τις επιλογές με τις οποίες έχει κατασκευαστεί το τρέχον Nginx:

Τώρα ας πάμε στο φάκελο με το Nginx, ας αντικαταστήσουμε όλες τις ληφθείσες επιλογές, την επιλογή --add-dynamic-module για PageSpeed, OpenSSL και προσπαθήστε να δημιουργήσετε:

cd nginx-1.13.3
# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx .conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx .pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache /nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path= /var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --με-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-secure_link_module --with th-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-t O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic" --with- ld-opt= --with-openssl=$HOME/openssl-1.0.2k --add-dynamic-module=$HOME/ngx_pagespeed-1.12.34.2-stable $(PS_NGX_EXTRA_FLAGS)
# φτιαχνω, κανω

Εάν όλα έγιναν σωστά, τότε στην έξοδο θα λάβετε τη μονάδα ngx_pagespeed.so στο φάκελο obj, πρέπει να την αντιγράψετε στο φάκελο /etc/nginx/modules:

cp ngx_pagespeed.so /etc/nginx/modules/ngx_pagespeed.so

Δημιουργήστε έναν φάκελο για την προσωρινή μνήμη:

mkdir -p /var/ngx_pagespeed_cache
# chown -R nginx:nginx /var/ngx_pagespeed_cache

Τώρα προσθέστε την ακόλουθη γραμμή για να ενεργοποιήσετε τη λειτουργική μονάδα στο /etc/nginx/nginx.conf:

load_module "modules/ngx_pagespeed.so";