Django είναι ένα δωρεάν και ανοικτού κώδικα πλαίσιο εφαρμογών ιστού που είναι κατασκευασμένο στη γλώσσα προγραμματισμού Python . Το Django είναι εξαιρετικά γρήγορο, ασφαλές και εξαιρετικά επεκτάσιμο. Στα χέρια ενός έμπειρου προγραμματιστή, το Django μπορεί να δημιουργήσει γρήγορα έναν ισχυρό ιστότοπο. Μπορεί να ενσωματωθεί απρόσκοπτα με δημοφιλείς διακομιστές ιστού (Apache, Nginx), και βάσεις δεδομένων (MySQL, MariaDB, PostgreSQL, Oracle, και SQLite), κ.λπ. Το Django τροφοδοτεί μερικούς από τους μεγαλύτερους ιστότοπους στον κόσμο, όπως το Instagram, το Mozilla και τη NASA. Αυτός ο οδηγός παρουσιάζει τη ρύθμιση της βάσης μιας εφαρμογής ιστού με τη βοήθεια του Django με PostgreSQL, Nginx, και Gunicorn σε Ubuntu 20.04.
Προαπαιτούμενα
Αυτός ο οδηγός απαιτεί να εκτελείτε έναν διακομιστή Ubuntu 20.04 ρυθμισμένο με ένα βασικό τείχος προστασίας και έναν μη-root χρήστη με δικαιώματα sudo. Δείτε αυτόν τον λεπτομερή οδηγό για το πώς να ρυθμίσετε έναν διακομιστή Ubuntu. Ακολουθήστε αυτόν τον οδηγό για να configure a non-root user with sudo privilege. Μπορείτε επίσης να ρυθμίσετε ένα τείχος προστασίας Iptables ακολουθώντας τα βήματα αυτού του οδηγού.
Θα εγκαταστήσουμε το Django μέσα σε ένα εικονικό περιβάλλον. Η ύπαρξη ενός περιβάλλοντος ειδικού για το έργο επιτρέπει την ευκολότερη διαχείριση πολλαπλών έργων από τον ίδιο διακομιστή. Μόλις ρυθμιστούν οι βάσεις δεδομένων και οι εφαρμογές, θα αναπτύξουμε τον διακομιστή εφαρμογών Gunicorn. Ο Gunicorn θα είναι η διεπαφή εφαρμογής που μεταφράζει τα αιτήματα των πελατών από HTTP σε κλήσεις Python τις οποίες μπορεί να χρησιμοποιήσει η εφαρμογή μας. Στη συνέχεια, θα αναπτύξουμε το Nginx μπροστά από τον Gunicorn για τη γρήγορη διαχείριση συνδέσεων και τα εύκολα στην υλοποίηση χαρακτηριστικά ασφαλείας του.
Εγκατάσταση των Απαραίτητων Πακέτων
Αρχικά, ξεκινήστε εγκαθιστώντας όλα τα απαραίτητα πακέτα. Ευτυχώς, όλα αυτά τα πακέτα είναι άμεσα διαθέσιμα από τα επίσημα αποθετήρια πακέτων του Ubuntu. Ανοίξτε το τερματικό και ενημερώστε την προσωρινή μνήμη πακέτων του APT:
|
1 |
sudo apt update |
Η λίστα πακέτων εξαρτάται από το αν η εφαρμογή ιστού πρόκειται να χρησιμοποιήσει Python 2 ή Python 3. Εκτελέστε την ακόλουθη εντολή για να εγκαταστήσετε το Django με Python 3:
|
1 |
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl |
Το Django 1.11 LTS είναι η τελευταία έκδοση του Django που θα υποστηρίζει την Python 2. Εάν σκοπεύετε να χρησιμοποιήσετε το Django με Python 2, τότε εγκαταστήστε τα ακόλουθα πακέτα:
|
1 |
sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl |
Βάση Δεδομένων και Χρήστης PostgreSQL
Όσον αφορά τη λύση της βάσης δεδομένων, θα χρησιμοποιήσουμε την PostgreSQL. Είναι ένα ισχυρό, ανοικτού κώδικα αντικειμενοστρεφές-σχεσιακό σύστημα βάσεων δεδομένων. Η PostgreSQL προσφέρει αξιοπιστία, στιβαρότητα και απόδοση. Για λεπτομερή βήματα σχετικά με τη ρύθμιση της PostgreSQL, δείτε αυτόν τον οδηγό για τη ρύθμιση της PostgreSQL στον διακομιστή Ubuntu. Για τον τρέχοντα οδηγό, θα δημιουργήσουμε μια αποκλειστική βάση δεδομένων και έναν χρήστη για την εφαρμογή Django μας.
Από προεπιλογή, η PostgreSQL εφαρμόζει το "peer authentication" ως σχήμα ελέγχου ταυτότητας για τοπικές συνδέσεις. Εν συντομία, το "peer authentication" θα εγκρίνει τη σύνδεση εάν το όνομα χρήστη του λειτουργικού συστήματος του χρήστη ταιριάζει με ένα έγκυρο όνομα χρήστη της PostgreSQL. Κατά την εγκατάσταση, η PostgreSQL ρύθμισε έναν χρήστη λειτουργικού συστήματος postgres για να αντιστοιχεί στον postgres διαχειριστικό χρήστη PostgreSQL. Συνδεθείτε στη διαδραστική συνεδρία κελύφους της PostgreSQL ως postgres χρησιμοποιώντας την ακόλουθη εντολή:
|
1 |
sudo -u postgres psql |
Θα βρεθείτε στη γραμμή εντολών της PostgreSQL. Το πρώτο βήμα είναι να δημιουργήσετε μια αποκλειστική βάση δεδομένων για το έργο. Για λόγους επίδειξης, η βάση δεδομένων θα ονομαστεί viktor_project:
|
1 |
CREATE DATABASE viktor_project; |
Το επόμενο βήμα είναι να δημιουργήσετε έναν αποκλειστικό χρήστη για τη βάση δεδομένων του έργου. Ο χρήστης θα πρέπει να έχει ένα ισχυρό όνομα χρήστη. Για λόγους επίδειξης, το όνομα χρήστη θα είναι viktor_project_user:
|
1 |
CREATE USER viktor_project_user WITH PASSWORD 'password123'; |
Τώρα, θα τροποποιήσουμε ορισμένες παραμέτρους:
- Ορισμένες παράμετροι σύνδεσης. Εν συντομία, δεν θα απαιτείται η υποβολή ερωτημάτων και ο ορισμός των σωστών τιμών κάθε φορά που δημιουργείται μια σύνδεση. Αυτό βελτιώνει σημαντικά την απόδοση της βάσης δεδομένων.
- Προεπιλεγμένη κωδικοποίηση σε
UTF-8. Είναι μια καθολική κωδικοποίηση και το Django την αναμένει. - Προεπιλεγμένο σχήμα απομόνωσης συναλλαγών σε «read committed». Εμποδίζει την ανάγνωση από μη ολοκληρωμένες συναλλαγές.
- Ζώνη ώρας σε
UTC.
Όλες αυτές οι αλλαγές παραμέτρων συνιστώνται από το ίδιο το Django project. Για να εφαρμόσετε αυτές τις αλλαγές, εκτελέστε τις ακόλουθες εντολές. Μην ξεχάσετε να αλλάξετε το όνομα χρήστη της βάσης δεδομένων στο σωστό:
|
1 2 3 |
ALTER ROLE viktor_project_user SET client_encoding TO 'utf8'; ALTER ROLE viktor_project_user SET default_transaction_isolation TO 'read committed'; ALTER ROLE viktor_project_user SET timezone TO 'UTC'; |
Αλλάξτε τον διαχειριστή της βάσης δεδομένων στον αποκλειστικό χρήστη της βάσης δεδομένων:
|
1 |
GRANT ALL PRIVILEGES ON DATABASE viktor_project TO viktor_project_user; |
Η εργασία μας με την PostgreSQL ολοκληρώθηκε προς το παρόν. Έξοδος από το διαδραστικό κέλυφος της PostgreSQL:
|
1 |
\q |
Εικονικό περιβάλλον Python
Με τη βάση δεδομένων έτοιμη, μπορούμε τώρα να επικεντρωθούμε στη δημιουργία των υπόλοιπων απαιτήσεων του έργου. Για ευκολότερη διαχείριση, θα δημιουργήσουμε ένα εικονικό περιβάλλον και θα εγκαταστήσουμε όλες τις απαιτήσεις Python εκεί. Για να δημιουργήσουμε ένα εικονικό περιβάλλον, χρειαζόμαστε το virtualenv. Μπορεί να εγκατασταθεί εύκολα με το pip.
Οι ακόλουθες εντολές θα αναβαθμίσουν το pip και θα εγκαταστήσουν το virtualenv. Για την Python 3, εκτελέστε τις ακόλουθες εντολές:
|
1 2 |
sudo -H pip3 install --upgrade pip sudo -H pip3 install virtualenv |
Για την Python 2, εκτελέστε αντ' αυτού τις ακόλουθες εντολές:
|
1 2 |
sudo -H pip install --upgrade pip sudo -H pip install virtualenv |
Μόλις virtualenv εγκατασταθεί, ήρθε η ώρα να δημιουργήσετε ένα εικονικό περιβάλλον. Στη συνέχεια, δημιουργήστε έναν αποκλειστικό κατάλογο για το εικονικό περιβάλλον:
|
1 |
mkdir -v ~/viktor_project |
Μετά από αυτό, αλλάξτε τον τρέχοντα ενεργό κατάλογο στον αποκλειστικό κατάλογο για το εικονικό περιβάλλον:
|
1 |
cd ~/viktor_project |
Μέσα στον κατάλογο, εκτελέστε την ακόλουθη εντολή. Το εργαλείο virtualenv θα δημιουργήσει ένα εικονικό περιβάλλον με το όνομα του έργου:
|
1 |
virtualenv viktor_project |
Θα δημιουργήσει έναν υποκατάλογο με το όνομα του έργου. Ο υποκατάλογος θα περιέχει μια τοπική έκδοση της Python και του pip. Προσφέρει ευελιξία για την εγκατάσταση και τη διαμόρφωση ενός απομονωμένου περιβάλλοντος Python για το έργο.
Η ακόλουθη εντολή θα ενεργοποιήσει το εικονικό περιβάλλον:
|
1 |
source viktor_project/bin/activate |
Η προτροπή του τερματικού θα αλλάξει υποδεικνύοντας ότι λειτουργείτε μέσα σε ένα εικονικό περιβάλλον Python. Τώρα που βρισκόμαστε μέσα στο εικονικό περιβάλλον, θα εγκαταστήσουμε τις απαραίτητες απαιτήσεις Python. Χρειαζόμαστε τα Django, Gunicorn και psycopg2 (προσαρμογέας PostgreSQL). Η ακόλουθη εντολή θα δώσει εντολή στο τοπικό pip να εγκαταστήσει τα στοιχεία:
|
1 |
pip install django gunicorn psycopg2-binary |
Ακόμα κι αν χρησιμοποιείτε Python 3, το pip είναι η σωστή εντολή. Αυτό συμβαίνει επειδή μέσα στο εικονικό περιβάλλον, το pip3 μετονομάζεται σε pip.
Νέο Django Project
Με τα στοιχεία της Python στη θέση τους, μπορούμε να αρχίσουμε να εργαζόμαστε με τα πραγματικά αρχεία του Django project.
-
Δημιουργία ενός Django project
Ο κατάλογος του έργου έχει ήδη δημιουργηθεί. Θα πούμε στο Django να εγκαταστήσει τα αρχεία του εκεί. Αυτή η διαδικασία θα δημιουργήσει έναν κατάλογο δεύτερου επιπέδου που θα περιέχει τους πραγματικούς κώδικες. Ο κατάλογος θα περιέχει επίσης ένα σενάριο διαχείρισης. Το κλειδί είναι ότι λέμε ρητά στο Django τον κατάλογο προορισμού αντί να το αφήσουμε να αποφασίσει τον κατάλογο σε σχέση με τον τρέχοντα:
|
1 |
django-admin.py startproject viktor_project ~/viktor_project |
Το Django θα δημιουργήσει το έργο ανάλογα. Εδώ είναι μερικά από τα σημαντικά αρχεία και καταλόγους στους οποίους θα εστιάσουμε. Τα ονόματα καταλόγων και αρχείων χρησιμοποιούνται σύμφωνα με την επίδειξη.
~/viktor_project/manage.py: Το σενάριο διαχείρισης έργου από το Django.~/viktor_project/viktor_project/: Είναι το πακέτο που περιέχει το έργο Django. Θα πρέπει να περιέχει τα αρχεία __init__.py, settings.py, urls.py, asgi.py και wsgi.py.
-
Προσαρμογή ρυθμίσεων έργου
Μετά τη δημιουργία του έργου, το πρώτο πράγμα που πρέπει να κάνετε είναι να προσαρμόσετε τις ρυθμίσεις του. Ανοίξτε το settings.py σε έναν επεξεργαστή κειμένου:
|
1 |
nano ~/viktor_project/viktor_project/settings.py |
Η πρώτη οδηγία που αναζητούμε είναι η ALLOWED_HOSTS. Ορίζει τους διακομιστές ή τα ονόματα τομέα που μπορούν να συνδεθούν στο στιγμιότυπο Django. Εάν οποιοδήποτε εισερχόμενο αίτημα με μια κεφαλίδα Host δεν ταιριάζει με τη λίστα των ALLOWED_HOSTS, θα δημιουργήσει μια εξαίρεση. Συνιστάται από το Django για την αποφυγή ορισμένων τύπων ευπαθειών ασφαλείας:
|
1 |
ALLOWED_HOSTS = ['<server_ip_or_domain_name_1>',' server_ip_or_domain_name_2','localhost'] |
Η επόμενη ενότητα στην οποία θα εστιάσουμε είναι η DATABASE. Διαχειρίζεται την πρόσβαση στη βάση δεδομένων. Από προεπιλογή, περιέχει ρυθμίσεις για τη μηχανή βάσης δεδομένων SQLite. Ωστόσο, πρόκειται να χρησιμοποιήσουμε τη βάση δεδομένων PostgreSQL για το έργο. Το Django θα χρησιμοποιήσει τον προσαρμογέα psycopg2 για να επικοινωνήσει με την PostgreSQL:
|
1 2 3 4 5 6 7 8 9 10 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'viktor_project', 'USER': 'viktor_project_user', 'PASSWORD': 'password123', 'HOST': 'localhost', 'PORT': '', } } |
Τώρα, μεταβείτε στο κάτω μέρος του αρχείου. Προσθέστε τις ακόλουθες γραμμές για να υποδείξετε τη θέση των στατικών αρχείων. Αυτό βοηθά το Nginx να χειρίζεται αιτήματα για αυτά τα στοιχεία:
|
1 2 |
import os STATIC_ROOT = os.path.join(BASE_DIR, 'static/') |
Η εργασία μας με το settings.py ολοκληρώθηκε προς το παρόν. Αποθηκεύστε το αρχείο και κλείστε τον επεξεργαστή.
-
Ολοκλήρωση της αρχικής ρύθμισης του έργου
Μπορούμε τώρα να μεταφέρουμε το αρχικό σχήμα της βάσης δεδομένων στην αποκλειστική βάση δεδομένων PostgreSQL. Εκτελέστε την ακόλουθη εντολή:
|
1 2 |
~/viktor_project/manage.py makemigrations ~/viktor_project/manage.py migrate |
Στη συνέχεια, πρέπει να δημιουργήσουμε έναν υπερχρήστη για το έργο. Για να δημιουργήσετε έναν υπερχρήστη, εκτελέστε την ακόλουθη εντολή:
|
1 |
~/viktor_project/manage.py createsuperuser |
Συγκεντρώστε όλα τα στατικά αρχεία στη θέση που καθορίσαμε στο settings.py. Τα στατικά αρχεία θα συλλεχθούν σε έναν ξεχωριστό κατάλογο που ονομάζεται “static” κάτω από τον κατάλογο του έργου:
|
1 |
~/viktor_project/manage.py collectstatic |
Τώρα, πρέπει να κάνουμε κάποιες ρυθμίσεις στο τείχος προστασίας του διακομιστή. Εάν ακολουθήσατε τον οδηγό ρύθμισης παραμέτρων του διακομιστή, τότε έχετε ήδη ρυθμίσει και ενεργοποιήσει το UFW. Θα δημιουργήσουμε μια εξαίρεση για τη θύρα 8000. Αυτή είναι η προεπιλεγμένη θύρα που χρησιμοποιεί το Django. Δείτε αυτόν τον οδηγό για να μάθετε περισσότερα σχετικά με τα βασικά και τη χρήση του τείχους προστασίας UFW.
|
1 |
sudo ufw allow 8000 |
Στη συνέχεια, επαληθεύστε την ενέργεια:
|
1 |
sudo ufw status |
Τέλος, μπορούμε να δοκιμάσουμε τον διακομιστή σε λειτουργία. Εκκινήστε τον διακομιστή ανάπτυξης του Django:
|
1 |
~/viktor_project/manage.py runserver 0.0.0.0:8000 |
Εάν η ρύθμιση παραμέτρων ολοκληρώθηκε με επιτυχία, ο διακομιστής ανάπτυξης του Django θα πρέπει να ξεκινήσει και να δέχεται εισερχόμενα αιτήματα. Ανοίξτε ένα πρόγραμμα περιήγησης και μεταβείτε στην IP/τομέα του διακομιστή σας στη θύρα 8000:
|
1 |
http://<server_or_domain>:8000 |
Θα πρέπει να μεταφερθείτε στην προεπιλεγμένη αρχική σελίδα του Django. Για να αποκτήσετε πρόσβαση στον πίνακα διαχείρισης, προσθέστε το /admin στο URL. Ο πίνακας διαχείρισης είναι προσβάσιμος μόνο από τον υπερχρήστη που δημιουργήσαμε προηγουμένως:
|
1 |
http://<server_or_domain>:8000/admin |
Μετά τη σύνδεση, θα μεταβείτε στην προεπιλεγμένη διεπαφή διαχειριστή του Django:
Ολοκληρώσαμε τις δοκιμές προς το παρόν. Για να σταματήσετε τον διακομιστή, πατήστε “Ctrl + C” από το παράθυρο του τερματικού.
-
Δοκιμή του Gunicorn
Πριν βγούμε από το εικονικό περιβάλλον, θέλουμε να βεβαιωθούμε ότι το Gunicorn μπορεί να εξυπηρετήσει τις εφαρμογές. Ο τρόπος για να το δοκιμάσουμε είναι χρησιμοποιώντας το Gunicorn για να φορτώσουμε τη μονάδα WSGI του έργου.
Η εντολή Gunicorn βρίσκεται μέσα στον κατάλογο του έργου:
|
1 2 |
cd ~/viktor_project gunicorn --bind 0.0.0.0:8000 viktor_project.wsgi |
Αυτό θα εκκινήσει το Gunicorn στην ίδια διεπαφή στην οποία εκτελούνταν το Django. Μπορούμε να δοκιμάσουμε ξανά την εφαρμογή από ένα κανονικό πρόγραμμα περιήγησης ιστού. Σημειώστε ότι η διεπαφή διαχειριστή δεν θα έχει εφαρμοσμένο στυλ επειδή το Gunicorn εξακολουθεί να μην γνωρίζει πώς να βρει τα στατικά περιεχόμενα CSS:
|
1 |
http://<server_or_domain>:8000 |
Όταν τελειώσετε, πατήστε “Ctrl + C” από το παράθυρο του τερματικού για να σταματήσετε τον διακομιστή Gunicorn.
-
Έξοδος από το εικονικό περιβάλλον
Η διαμόρφωση της εφαρμογής Django ολοκληρώθηκε. Εκτελέστε την ακόλουθη εντολή για να εξέλθετε από το εικονικό περιβάλλον:
|
1 |
deactivate |
Αρχεία Socket και Service του Gunicorn
Επαληθεύσαμε ότι το Gunicorn μπορεί να αλληλεπιδράσει με την εφαρμογή Django. Ωστόσο, χρειαζόμαστε έναν πιο στιβαρό τρόπο διαχείρισης του διακομιστή εφαρμογών. Εδώ μπαίνει στην εξίσωση το systemd. Το systemd είναι ένα από τα πιο δημοφιλή συστήματα init που είναι διαθέσιμα στο Linux. Ακολουθεί ένας λεπτομερής οδηγός για πώς να διαχειρίζεστε τις υπηρεσίες και τις μονάδες του systemd.
Μπορούμε να δημιουργήσουμε αρχεία socket και service για το Gunicorn ώστε να επιτρέψουμε στο systemd να το διαχειρίζεται σαν να είναι υπηρεσία. Κατά την εκκίνηση, θα δημιουργηθεί το socket του Gunicorn. Το socket θα ακούει για εισερχόμενες συνδέσεις. Όταν πραγματοποιείται μια σύνδεση, τότε το systemd θα ξεκινά τις διεργασίες του Gunicorn για να χειριστεί τη σύνδεση.
-
Socket Gunicorn
Ας ξεκινήσουμε δημιουργώντας ένα socket Gunicorn. Το αρχείο πρέπει να δημιουργηθεί με δικαιώματα sudo:
|
1 |
sudo nano /etc/systemd/system/gunicorn.socket |
Εισαγάγετε τον ακόλουθο κώδικα μέσα στο αρχείο:
|
1 2 3 4 5 6 7 |
[Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target |
Όπως μπορείτε να δείτε, υπάρχουν τρία τμήματα του κώδικα.
[Unit]:Αυτό το τμήμα περιγράφει το socket.[Socket]:Ορίζει την τοποθεσία του socket.[Install]:Αυτό το μέρος διασφαλίζει ότι το systemd δημιουργεί το socket την κατάλληλη στιγμή.
Αποθηκεύστε το αρχείο και κλείστε το πρόγραμμα επεξεργασίας.
-
Υπηρεσία Gunicorn
Στη συνέχεια, θα δημιουργήσουμε ένα αρχείο υπηρεσίας για το Gunicorn. Παρόμοια με το αρχείο socket, πρέπει επίσης να δημιουργηθεί με δικαιώματα sudo:
|
1 |
sudo nano /etc/systemd/system/gunicorn.service |
Εισαγάγετε τον ακόλουθο κώδικα:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] User=cloudsigma Group=www-data WorkingDirectory=/home/cloudsigma/viktor_project ExecStart=/home/cloudsigma/viktor_project/viktor_project/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ viktor_project.wsgi:application [Install] WantedBy=multi-user.target |
Ο κώδικας περιέχει πολλαπλά τμήματα:
[Unit]:Αυτό το τμήμα καθορίζει μεταδεδομένα και εξαρτήσεις. Περιγράφει επίσης την εκκίνηση μόνο αφού επιτευχθεί ο στόχος δικτύου.[Service]:Αυτή η ενότητα καθορίζει τον χρήστη και την ομάδα υπό την οποία θα εκτελείται η διεργασία. Η ιδιοκτησία της ομάδας έχει οριστεί σε “www-data” έτσι ώστε το Nginx να μπορεί να επικοινωνεί με το Gunicorn. Επίσης, χαρτογραφεί τους καταλόγους εργασίας και καθορίζει τις εντολές εκκίνησης.[Install]:Αυτή η ενότητα λέει στο systemd με τι να συνδέσει αυτήν την υπηρεσία εάν είναι ενεργοποιημένη κατά την εκκίνηση. Θα πρέπει να ξεκινά αφού αρχίσει να εκτελείται το κανονικό σύστημα πολλαπλών χρηστών.
Στη συνέχεια, αποθηκεύστε το αρχείο και κλείστε τον επεξεργαστή.
-
Ενεργοποίηση του Gunicorn socket
Το Gunicorn socket είναι έτοιμο για χρήση. Επομένως, μπορείτε να εκτελέσετε τις ακόλουθες εντολές. Θα ξεκινήσει και θα ενεργοποιήσει το socket. Το αρχείο socket θα δημιουργηθεί στο /run/gunicorn.sock κατά την εκκίνηση. Όταν πραγματοποιείται μια σύνδεση στο socket, το systemd θα ξεκινά την υπηρεσία Gunicorn για να τη χειριστεί:
|
1 2 |
sudo systemctl start gunicorn.socket sudo systemctl enable gunicorn.socket |
Ελέγξτε την κατάσταση του Gunicorn socket:
|
1 |
sudo systemctl status gunicorn.socket |
Τώρα, ελέγξτε την ύπαρξη του αρχείου socket:
|
1 |
file /run/gunicorn.sock |
Εάν η κατάσταση από το systemctl υποδεικνύει σφάλμα ή το αρχείο gunicorn.sock δεν βρέθηκε, αυτό σημαίνει ότι το socket δεν δημιουργήθηκε σωστά. Δείτε το αναλυτικό αρχείο καταγραφής για στοιχεία:
|
1 |
sudo journalctl -u gunicorn.socket |
Μην ξεχάσετε να ρίξετε άλλη μια ματιά στο αρχείο gunicorn.socket για πιθανά σφάλματα.
-
Ενεργοποίηση socket
Έχουμε ξεκινήσει το gunicorn.socket μέχρι στιγμής. Ωστόσο, χωρίς κανένα αίτημα σύνδεσης, το gunicorn.service δεν θα ενεργοποιηθεί. Στη συνέχεια, επαληθεύστε την κατάσταση του Gunicorn:
|
1 |
sudo systemctl status gunicorn |
Μπορούμε να δοκιμάσουμε τον μηχανισμό ενεργοποίησης του socket στέλνοντας ένα αίτημα σύνδεσης χρησιμοποιώντας το curl:
|
1 |
curl --unix-socket /run/gunicorn.sock localhost |
Θα πρέπει να λάβετε μια έξοδο HTML από την εφαρμογή. Αυτό υποδεικνύει ότι το Gunicorn ξεκίνησε με επιτυχία και ήταν σε θέση να εξυπηρετήσει την εφαρμογή Django. Επαληθεύστε την τρέχουσα κατάσταση της υπηρεσίας Gunicorn:
|
1 |
sudo systemctl status gunicorn |
Εάν υπάρχει οποιαδήποτε απροσδόκητη συμπεριφορά ή έξοδος (που υποδεικνύει σφάλμα), δείτε τα αναλυτικά αρχεία καταγραφής για στοιχεία:
|
1 |
sudo journalctl -u gunicorn |
Εάν έγιναν αλλαγές στο αρχείο gunicorn.service, τότε πρέπει να επαναφορτώσετε τον δαίμονα για να διαβάσει ξανά τον ορισμό της υπηρεσίας. Απαιτείται επίσης επανεκκίνηση της υπηρεσίας Gunicorn:
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart gunicorn |
Διαμόρφωση του Nginx
Τώρα, θα διαμορφώσουμε το Nginx ώστε να μεταβιβάζει την εισερχόμενη κίνηση στη διεργασία. Αρχικά, δημιουργήστε ένα νέο server block στο Nginx:
|
1 |
sudo nano /etc/nginx/sites-available/viktor_project |
Στη συνέχεια, εισαγάγετε τον ακόλουθο κώδικα:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
server { listen 80; server_name 31.171.250.71; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/cloudsigma/viktor_project; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } } |
Ακολουθούν πολλαπλά blocks στη διαμόρφωση:
service:Αυτό το block ορίζει ότι ο διακομιστής θα πρέπει να ακούει κανονικά στη θύρα 80 και θα πρέπει να ανταποκρίνεται στο όνομα τομέα ή τη διεύθυνση IP του διακομιστή.location:Αυτή είναι η πρώτη καταχώριση location. Ορίζει πού θα βρεθούν τα στατικά στοιχεία.location:Αυτή είναι η δεύτερη καταχώριση location. Αυτό το block ορίζει τυπικές παραμέτρους διαμεσολάβησης και πώς να μεταβιβάζεται η κίνηση στο Gunicorn socket.
Αποθηκεύστε το αρχείο και κλείστε τον επεξεργαστή. Συνδέστε το αρχείο στον κατάλογο “sites-enabled” για να το ενεργοποιήσετε:
|
1 |
sudo ln -s /etc/nginx/sites-available/viktor_project /etc/nginx/sites-enabled |
Μετά από αυτό, ελέγξτε αν υπάρχει κάποιο σφάλμα σύνταξης στις ρυθμίσεις του Nginx:
|
1 |
sudo nginx -t |
Αν δεν βρήκατε κάποιο σφάλμα, τότε επανεκκινήστε το Nginx για να εφαρμόσετε την αλλαγή:
|
1 |
sudo systemctl restart nginx |
Πρέπει να τροποποιήσουμε ξανά τους κανόνες του UFW. Δεν χρειαζόμαστε πλέον πρόσβαση στον διακομιστή ανάπτυξης, οπότε μπορούμε να αφαιρέσουμε την εξαίρεση για τη θύρα 8000. Επιπλέον, θέλουμε να ανοίξουμε τη θύρα 80 για κανονική κίνηση:
|
1 2 |
sudo ufw delete allow 8000 sudo ufw allow 'Nginx Full' |
Επαληθεύστε αυτές τις αλλαγές στους κανόνες του τείχους προστασίας:
|
1 |
sudo ufw status |
Ο διακομιστής θα πρέπει τώρα να είναι προσβάσιμος από ένα κανονικό πρόγραμμα περιήγησης ιστού.
Διαδικασίες Αντιμετώπισης Προβλημάτων
Αν όλα τα βήματα ακολουθήθηκαν σωστά, η εφαρμογή Django θα πρέπει να είναι προσβάσιμη μέσω του διαδικτύου. Αν όχι, αυτό υποδηλώνει ότι η εγκατάσταση δεν πήγε όπως είχε προγραμματιστεί. Πρέπει να κάνουμε αντιμετώπιση προβλημάτων για να βρούμε την πηγή του ζητήματος.
-
Το Nginx εμφανίζει την προεπιλεγμένη σελίδα
Αν το Nginx εμφανίζει την προεπιλεγμένη σελίδα αντί για τον διακομιστή μεσολάβησης της εφαρμογής, αυτό συνήθως σημαίνει ότι το server_name είχε ρυθμιστεί λάθος στο server block.
Σε αυτό το παράδειγμα, το server block είναι αποθηκευμένο στην ακόλουθη τοποθεσία:
|
1 |
/etc/nginx/sites-available/viktor_project |
Το server_name καθορίζει ποιο server block θα χρησιμοποιήσει το Nginx για να απαντήσει στα αιτήματα. Αν εμφανίζεται η προεπιλεγμένη σελίδα, τότε το Nginx πιθανότατα δεν μπόρεσε να αντιστοιχίσει το αίτημα με ένα συγκεκριμένο server block, οπότε επιστρέφει στο προεπιλεγμένο block:
|
1 |
/etc/nginx/sites-available/default |
Ελέγξτε αν το server block του Django έργου σας έχει ένα σωστό server_name.
-
502 Bad Gateway
Το σφάλμα 502 υποδεικνύει ότι το Nginx δεν μπόρεσε να προωθήσει το αίτημα με επιτυχία. Υπάρχει ένα ευρύ φάσμα πιθανών προβλημάτων παραμετροποίησης που μπορούν να οδηγήσουν στο σφάλμα 502, επομένως χρειαζόμαστε ενδείξεις για να κάνουμε σωστή αντιμετώπιση προβλημάτων.
Η κύρια πηγή ενδείξεων είναι τα αρχεία καταγραφής σφαλμάτων (error logs) του Nginx. Γενικά, θα υποδείξουν τις συνθήκες που προκάλεσαν τα προβλήματα κατά τη μεσολάβηση. Ελέγξτε το αρχείο καταγραφής σφαλμάτων του Nginx χρησιμοποιώντας την ακόλουθη εντολή:
|
1 |
sudo tail -F /var/log/nginx/error.log |
Μόλις ανοίξει το αρχείο καταγραφής, δοκιμάστε να αποκτήσετε πρόσβαση στον διακομιστή άλλη μια φορά. Θα πρέπει να δημιουργήσει ένα νέο μήνυμα σφάλματος στο αρχείο καταγραφής. Αυτό μπορεί να βοηθήσει στον περιορισμό του προβλήματος. Ακολουθούν μερικά πιθανά μηνύματα:
- connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)
Υποδεικνύει ότι το Nginx δεν μπόρεσε να βρει το gunicorn.sock στην τοποθεσία που ορίζεται στις ρυθμίσεις. Η τοποθεσία περιγράφεται από την οδηγία proxy_pass κάτω από το site block. Ελέγξτε αν το proxy_pass υποδεικνύει τη σωστή τοποθεσία του gunicorn.sock που δημιουργήθηκε από τη μονάδα systemd gunicorn.socket:
|
1 |
/etc/nginx/sites-available/viktor_project |
Αν το gunicorn.sock δεν βρέθηκε κάτω από τον κατάλογο /run , σημαίνει ότι το systemd δεν μπόρεσε να το δημιουργήσει. Θα πρέπει να ελέγξετε ξανά τα βήματα ρύθμισης του αρχείου socket του Gunicorn.
- connect() to unix:/run/gunicorn.sock failed (13: Permission denied)
Υποδεικνύει ότι το Nginx δεν μπόρεσε να συνδεθεί στο socket του Gunicorn λόγω προβλημάτων δικαιωμάτων. Αυτό μπορεί να συμβεί εάν η διαδικασία εκτελέστηκε ως χρήστης root αντί για έναν χρήστη sudo . Παρόλο που το systemd δημιούργησε επιτυχώς το gunicorn.sock , το Nginx δεν μπορεί να το χρησιμοποιήσει.
Ένας πιθανός ένοχος μπορεί να είναι τα περιορισμένα δικαιώματα μεταξύ του ριζικού καταλόγου (/) και του αρχείου gunicorn.sock . Ελέγξτε τα δικαιώματα και την ιδιοκτησία του αρχείου socket και καθενός από τους γονικούς του καταλόγους:
|
1 |
namei -l /run/gunicorn.sock |
Η πρώτη στήλη περιγράφει τα δικαιώματα του αρχείου. Η δεύτερη στήλη περιγράφει τον ιδιοκτήτη χρήστη και η τρίτη στήλη τον ιδιοκτήτη ομάδας. Εάν κάποιος από τους καταλόγους που οδηγούν στο gunicorn.sock δεν έχει τα κατάλληλα δικαιώματα ανάγνωσης και εκτέλεσης, το Nginx θα αποτύχει να αποκτήσει πρόσβαση στο socket.
-
Το Django εμφανίζει το μήνυμα «could not connect to the server: Connection refused»
Υποδεικνύει ότι το Django απέτυχε να συνδεθεί στον διακομιστή PostgreSQL. Βεβαιωθείτε ότι ο διακομιστής PostgreSQL είναι σε λειτουργία:
|
1 |
sudo systemctl status postgresql |
Αν δεν εκτελείται, τότε εκτελέστε τις ακόλουθες εντολές για να το εκκινήσετε και να το ενεργοποιήσετε:
|
1 2 |
sudo systemctl start postgresql sudo systemctl enable postgresql |
Αν εξακολουθείτε να αντιμετωπίζετε αυτό το σφάλμα, τότε βεβαιωθείτε ότι τα διαπιστευτήρια της βάσης δεδομένων έχουν οριστεί σωστά στο settings.py:
|
1 |
~/viktor_project/viktor_project/settings.py |
Περισσότερη αντιμετώπιση προβλημάτων
Για πρόσθετη αντιμετώπιση προβλημάτων, υπάρχουν διάφορα αρχεία καταγραφής. Αυτά τα αρχεία καταγραφής μπορούν να βοηθήσουν στον περιορισμό των πηγών των προβλημάτων.
Ακολουθεί μια λίστα με αρχεία καταγραφής που μπορούν να βοηθήσουν:
- Αρχεία καταγραφής Nginx
|
1 |
sudo journalctl -u nginx |
- Αρχεία καταγραφής πρόσβασης-Nginx
|
1 |
sudo less /var/log/nginx/access.log |
- Αρχεία καταγραφής σφαλμάτων-Nginx
|
1 |
sudo less /var/log/nginx/error.log |
- Αρχεία καταγραφής εφαρμογής-Gunicorn
|
1 |
sudo journalctl -u gunicorn |
- Αρχεία καταγραφής Socket-Gunicorn
|
1 |
sudo journalctl -u gunicorn.socket |
|
1 |
sudo systemctl restart gunicorn |
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart gunicorn.socket gunicorn.service |
|
1 2 |
sudo nginx -t sudo systemctl restart nginx |
Τελικές Σκέψεις
Αυτός ο οδηγός δείχνει με επιτυχία πώς να θέσετε τα θεμέλια του Django. Το Django παρέχει πολλά από τα κοινά στοιχεία μιας διαδικτυακής εφαρμογής, επιτρέποντάς σας να εστιάσετε στα μοναδικά στοιχεία. Το έργο Django θα λειτουργεί μέσα στο εικονικό περιβάλλον. Το Gunicorn διαχειρίζεται την επικοινωνία μεταξύ των αιτημάτων των πελατών και του Django. Τέλος, το Nginx λειτουργεί ως αντίστροφος μεσολαβητής για τη διαχείριση των συνδέσεων των πελατών.
Καλή συνέχεια!










Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.