Πώς να αναπτύξετε μια εφαρμογή Django:

Τι θα λέγατε για χαιρετισμούς σε όλους, αυτό είναι το πρώτο μου άρθρο στο <» DesdeLinux (de varios que tengo en mis borradores xD), espero les sea de utilidad 😀

Λοιπόν, στη νέα και τρέχουσα δουλειά μου, αυτή τη στιγμή γίνεται η μετάβαση πολλών συστημάτων στο Django (τι περίεργο ε;; xD) και ένα από τα καθήκοντά μου, εκτός από την ανάπτυξη, είναι να τα βάλω στην παραγωγή, οπότε πόσο καλό μαθητευόμενος, καθώς ήταν η πρώτη μου φορά που έβαζα μια εφαρμογή σε παραγωγή σε πραγματικό διακομιστή :$ άρχισα να διαβάζω το επίσημο έγγραφο για κάθε ένα από τα απαιτούμενα πακέτα της στοίβας (του Gunicorn και του Supervisord πάνω απ' όλα) και βλέποντας ότι τα σεμινάρια στο Ισπανικά ότι δεν μου ήταν πολύ ξεκάθαρα σε ορισμένες πτυχές, αποφάσισα να δημιουργήσω έναν μίνι οδηγό με τα βήματα που ακολούθησα για να βάλω την εφαρμογή στην παραγωγή, με βάση τη στοίβα Django, Gunicorn, Supervisord, Nginx και Postgresql.

Στην περίπτωση που εργάζομαι, οι διακομιστές εξακολουθούν να εκτελούν το Debian Squeeze, αλλά ο οδηγός θα πρέπει να είναι πλήρως έγκυρος για άλλες διανομές... οπότε ας πάμε κατευθείαν στο θέμα και ας ξεκινήσουμε:

Θα εργαστώ ως σούπερ χρήστης. Πρώτα απ 'όλα, απαιτούνται τα ακόλουθα πακέτα:

PIP -> Εργαλείο εγκατάστασης και διαχείρισης πακέτων για Python
aptitude install python-pip

nginx -> Διακομιστής Ιστού (θα τον χρησιμοποιήσουμε ως αντίστροφο διακομιστή μεσολάβησης και για να αποθηκεύσουμε προσωρινά τα στατικά αρχεία 'img, js, css') Τον εγκαθιστούμε με:
aptitude install nginx

Επόπτης – > Εφαρμογή για τη διαχείριση και την παρακολούθηση της εφαρμογής μας, αν και χρησιμοποιείται για πολύ περισσότερα. Το εγκαθιστούμε με:
aptitude install supervisor

virtualenv -> Μας βοηθά να δημιουργήσουμε ένα εξατομικευμένο εικονικό περιβάλλον εκτέλεσης για την εφαρμογή μας. Το εγκαθιστούμε με:
aptitude install python-virtualenv

οπλίτης -> Διακομιστής Ιστού για python (δεν θα το εγκαταστήσουμε ακόμα)

Υποθέτω ότι πρέπει να έχετε ήδη εγκατεστημένο και ρυθμισμένο το postgresql.

psychopg2 -> Υποδοχή Postgresql για python (δεν θα την εγκαταστήσουμε ακόμη)

Δημιουργήστε εικονικό περιβάλλον με το virtualenv:

Πρώτα θα μεταφερθούμε στον κατάλογο εργασίας που θα χρησιμοποιήσουμε για την παραγωγή:
cd /var/www/

Στη συνέχεια, στον εν λόγω κατάλογο θα δημιουργήσουμε το εικονικό περιβάλλον:
virtualenv ENV-nombreApp

Μεταφερόμαστε στον κατάλογο που μόλις δημιούργησα το virtualenv
cd ENV-nombreAPP

Αντιγράφουμε την εφαρμογή σε αυτόν τον κατάλογο και τώρα προχωράμε στην ενεργοποίηση του περιβάλλοντος με:
source bin/activate

Η προτροπή θα πρέπει τώρα να μοιάζει (ENV)usuario@host:

Αυτό θα κάνει τώρα όλα όσα κάνουμε αποθηκευμένα στον κατάλογο /var/www/ENV-appname/ χωρίς να επηρεάζονται τα πακέτα συστήματος

Τώρα μεταβαίνουμε στον κατάλογο της εφαρμογής:
cd nombreApp

Προχωράμε στην εγκατάσταση της λίστας των εξαρτήσεων εφαρμογής (εάν είναι απαραίτητο), στην οποία καθορίζονται στο αρχείο απαιτήσεις.txt:
pip install -r requirements.txt

Μπορούμε επίσης να εγκαταστήσουμε πακέτα μεμονωμένα, για παράδειγμα, για να εγκαταστήσουμε τον σύνδεσμο του postgresql:
pip install psycopg2

Εγκατάσταση και διαμόρφωση του GUnicorn:

Για να το εγκαταστήσουμε το κάνουμε με τον ίδιο τρόπο:
pip install gunicorn

Τώρα θα το ρυθμίσουμε, για αυτό θα δημιουργήσουμε ένα αρχείο που ονομάζεται gunicorn-deploy.py στη ρίζα της εφαρμογής μας, (αν και το όνομα μπορεί να είναι οτιδήποτε) με το ακόλουθο περιεχόμενο:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Διαμόρφωση επόπτη:

Τώρα ας ορίσουμε το επόπτης, για αυτό δημιουργούμε το αρχείο ρυθμίσεων με

echo_supervisord_conf > /etc/supervisord.conf

Τώρα επεξεργαζόμαστε το αρχείο ρυθμίσεων:
vim /etc/supervisord.conf

Και αποσχολιάζουμε τις ακόλουθες γραμμές αφαιρώντας το ; (άνω τελεία):

[unix_http_server] file=/tmp/supervisor.sock [supervisord] logfile=/var/log/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=εντοπισμός σφαλμάτων pidfile=/var/run/supervisord.pid1024spcinerf200 [XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX/XNUMX minprod. face:supervisor] supervisor.rp cinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix: [program:appName] command=/var/www/ENV-appName/bin/django_unicorn_rpcinterface. κατάλογος py=/var/www/ENV-appName/appName/ autostar t=true autorestart=true user=userName redirect_stderr=true stdout_logfile=/var/www/logs/appName/supervisord.log

Τώρα θα δημιουργήσουμε το σενάριο για τον επόπτη για να ξεκινήσει με το σύστημα, για αυτό θα δημιουργήσουμε το αρχείο:
vim /etc/init.d/supervisord

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

 # Επόπτης auto-start # # περιγραφή: Αυτόματη εκκίνηση επόπτη # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD=/usr/local/bin/supervisord SUPERVISORCTL=/usr/local/bin/supervisorctl υπόθεση $1 "Supervisorctl" supervis "Supervisorctl $XNUMX ":RDStarting $XNUMX "; stop) echo -n "Διακοπή επόπτη:" $SUPERVISORCTL τερματισμός ηχώ ;; επανεκκίνηση) echo -n "Διακοπή επόπτη:" $SUPERVISORCTL τερματισμός λειτουργίας echo echo -n "Έναρξη επόπτη: " $SUPERVISORD echo ;; ότι C

Και τώρα δίνουμε στο αρχείο δικαιώματα εκτέλεσης ώστε να μπορεί να ξεκινήσει με το σύστημα:
sudo chmod +x /etc/init.d/supervisord

Ενημερώνουμε τους συνδέσμους για να ξεκινήσουμε την υπηρεσία:
sudo update-rc.d supervisord defaults

Ξεκινάμε την υπηρεσία:
sudo /etc/init.d/supervisord start

Διαμόρφωση του nginx:

Αυτό το βήμα είναι επίσης αρκετά απλό, θα δημιουργήσουμε το ακόλουθο αρχείο ρυθμίσεων nginx για την αίτησή μας:

vim /etc/nginx/sites-enabled/nombreApp

Και θα προσθέσουμε το ακόλουθο περιεχόμενο σε αυτό

διακομιστής { ακούω 9001; # θύρα όπου θέλετε το nginx να ακούει το όνομα_διακομιστή www.domain.com; # o 192.168.0.100, διεύθυνση στην οποία θα έχουμε πρόσβαση στο access_log /var/log/nginx/nombreApp.access.log; # όπου θα έχουμε την τοποθεσία αρχείου καταγραφής της εφαρμογής / { # όπου θα καλεί το nginx κατά την πρόσβαση στο www.domain.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $http_host; } τοποθεσία /static/ { # όπου θα έχει πρόσβαση το nginx όταν εισάγουμε www.domain.com/static/ alias /var/www/ENV-appname/appname/staticfiles/; } }

Και κάνουμε επανεκκίνηση του nginx:
service nginx restart

Διαμόρφωση Django:

Ας τροποποιήσουμε το αρχείο διαμόρφωσης django:
vim nombreApp/settings.py

Ψάχνουμε τη γραμμή που λέει DEBUG=Αλήθεια και αλλάζουμε την τιμή, απομένουν DEBUG=Λάθος

Προσθέτουμε τις παραμέτρους του DB:

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ = { 'προεπιλογή': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # ή mysql, ή οτιδήποτε άλλο χρησιμοποιούν 'NAME': 'DBname', 'USER': 'DBuser', 'PASSWORD' : 'password', 'HOST': 'localhost', # ή αυτό που χρειάζεστε 'PORT': '', # ή αυτό που χρησιμοποιείτε } }

ψάχνουμε για τη γραμμή ALLOWED_HOSTS=[] και προσθέτουμε τον τομέα ή τη διεύθυνση μέσω της οποίας θα έχουμε πρόσβαση, αφήνοντας κάτι σαν ALLOWED_HOSTS=['www.domain.com']

Ρυθμίζουμε τον κατάλογο για τα στατικά αρχεία, ψάχνουμε τη γραμμή που λέει STATIC_ROOT = ' ' και αλλάζουμε την τιμή, τοποθετώντας την απόλυτη διαδρομή εκεί που θέλουμε να είναι τα στατικά μας αρχεία, στην περίπτωσή μου το αφήνω λίγο πολύ έτσι STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Σχεδόν στο τέλος, εκτελούμε την ακόλουθη εντολή:
./manage.py collectstatic

Αυτό θα δημιουργήσει έναν φάκελο με το όνομα 'στατική στη διαδρομή που καθορίσαμε στο settings.py », εκεί θα βρίσκονται όλα τα στατικά μας αρχεία.

Και τέλος επανεκκινούμε τον επόπτη για να γίνουν οι νέες αλλαγές:
supervisorctl restart nombreApp

Και αυτό θα ήταν όλο, τελικά δεν ήταν τόσο μεγάλη υπόθεση σωστά; Μου φάνηκε απλό

Ελπίζω να είναι χρήσιμο για εσάς, χαιρετισμούς 😉

Τεκμηρίωση GUnicorn

Τεκμηρίωση επόπτη


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   f3niX dijo

    Καταλαβαίνω ότι δεν πρέπει να βάλετε την εφαρμογή Django στη ρίζα του φακέλου του διακομιστή web (/var/www); Για ασφάλεια, δεν ξέρω αν κάνω λάθος.

    Χαιρετισμούς.

    1.    urKh dijo

      Απόλυτο δίκιο!!! Ήταν κάτι που αγνοούσα εντελώς, θα ενημερώσω την ανάρτηση 😛 και μόλις επιστρέψω τη Δευτέρα θα κάνω αλλαγές στην εφαρμογή xD
      Ευχαριστίες

  2.   Ροντρίγκο Μπράβο (goidor) dijo

    Γεια σου αδερφέ, καλό σεμινάριο. Ήμουν επίσης πρόσφατα στο ίδιο πράγμα, αλλά στο Debian 7, έπρεπε να ψάξω και να διαβάσω περισσότερο ή λιγότερο. Σας συνιστώ να δημιουργήσετε το εικονικό περιβάλλον του virtualenv στο σπίτι του χρήστη σε έναν κρυφό φάκελο.

    Χαιρετισμούς!

  3.   σερβ Φενρίζ dijo

    χαχαχα ctm με χθες τεκμηριώνοντας τον Django και ήδη περνάς από τον γαλαξία 999999 Greetings men xD

  4.   καιiel2ac dijo

    Πολύ καλό άρθρο =) Μόλις πριν από μια εβδομάδα ανέπτυξα την εφαρμογή django αλλά το έκανα με το uwsgi και το nginx, ξέρετε τι πλεονέκτημα έχει το gunicorn; Το έχω δει να αναφέρεται πολύ.
    Είναι ωραίο να βλέπεις ότι το django γίνεται πολύ δημοφιλές, η αλήθεια είναι το καλύτερο πλαίσιο που έχω δει =)

  5.   Οζκάρ dijo

    Για το STATIC_ROOT αυτό που κάνω είναι να ορίσω μια καθολική μεταβλητή. Κάτι σαν αυτό:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    Όπου το backend είναι μια εφαρμογή που δημιούργησα. Γι' αυτό φροντίζω ότι όπου κι αν αναπτύξω το έργο, η παγκόσμια διαδρομή είναι η ίδια.

  6.   καλός dijo

    Ενδιαφέρον, θα προσπαθήσω ξανά αργότερα.

    Παρεμπιπτόντως, γνωρίζει κανείς πώς να ενεργοποιήσω τόνους και χαρακτήρες που δεν είναι ascii σε μια εφαρμογή django;

    Έχω ψάξει παντού, καμία από τις παρακάτω μεθόδους δεν λειτουργεί για μένα:
    sys.setdefaultencoding('utf-8') # στο sites.py

    # -*- κωδικοποίηση: utf-8 -*- # σε κάθε αρχείο python

    Η επεξεργασία site.py και η τοποθέτηση utf-8 αντί για ascii υποτίθεται ότι λειτουργεί, αλλά το $ file models.py με ενημερώνει ότι το αρχείο μου εξακολουθεί να είναι ascii.

    Οποιεσδήποτε προτάσεις?

    1.    καλός dijo

      Δούλεψε!!!!

  7.   anime230 dijo

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