Come distribuire un'applicazione Django:

Che ne dite di salutare tutti, questo è il mio primo articolo in <» DesdeLinux (tra i tanti che ho nelle mie bozze xD), spero che vi sia utile 😀

Ebbene, nel mio nuovo e attuale lavoro, al momento è in corso la migrazione di diversi sistemi su Django (che strano eh ?? xD) e uno dei miei compiti, oltre allo sviluppo, è la messa in produzione di questi, quindi da buon apprendista, dato che era la prima volta che mettevo in produzione un'applicazione su un server reale: $ ho iniziato a leggere il documento ufficiale di ciascuno dei pacchetti richiesti dello stack (Gunicorn e Supervisord più di tutti), e vedendo che il tutorial In spagnolo non mi erano molto chiari in alcuni aspetti, ho deciso di creare una mini guida con i passaggi che ho seguito per mettere in produzione l'applicazione, basata sugli stack Django, Gunicorn, Supervisord, Nginx e Postgresql.

Nel caso in cui lavoro, i server girano ancora su Debian Squeeze, ma la guida dovrebbe essere pienamente valida per altre distribuzioni ... quindi andiamo subito al punto e cominciamo:

Lavorerò come un super utente. Innanzitutto sono necessari i seguenti pacchetti:

PIP -> Strumento per installare e gestire i pacchetti per Python
aptitude install python-pip

Nginx -> Web server (lo useremo come proxy inverso e per memorizzare nella cache i file statici 'img, js, css') Lo installiamo con:
aptitude install nginx

Supervisore -> Applicazione per gestire e monitorare la nostra applicazione, sebbene sia usata per molto di più. Lo installiamo con:
aptitude install supervisor

ambiente virtuale -> Ci aiuta a creare un ambiente di esecuzione virtuale personalizzato per la nostra applicazione. Lo installiamo con:
aptitude install python-virtualenv

gunicorn -> web server per python (non lo installeremo ancora)

Presumo che dovrebbero già avere postgresql installato e configurato

psicopg2 -> Connettore Postgresql per python (non lo installeremo ancora)

Crea un ambiente virtuale con virtualenv:

Per prima cosa ci sposteremo nella directory di lavoro che useremo per la messa in produzione:
cd /var/www/

Quindi in questa directory creeremo l'ambiente virtuale:
virtualenv ENV-nombreApp

Ci spostiamo nella directory che ho appena creato virtualenv
cd ENV-nombreAPP

Copiamo l'applicazione in questa directory e ora procediamo ad attivare l'ambiente con:
source bin/activate

Il prompt dovrebbe ora apparire come (ENV)usuario@host:

Questo ora farà in modo che tutto ciò che facciamo venga memorizzato nella directory / var / www / ENV-appname / senza influire sui pacchetti di sistema

Ora passiamo alla directory dell'applicazione:
cd nombreApp

Procediamo con l'installazione dell'elenco delle dipendenze dell'applicazione (se necessario), in cui sono specificate nel file requirements.txt:
pip install -r requirements.txt

Possiamo anche installare i pacchetti individualmente, ad esempio, per installare il connettore di postgresql:
pip install psycopg2

Installazione e configurazione di GUnicorn:

Per installarlo lo facciamo allo stesso modo:
pip install gunicorn

Ora lo configureremo, per questo creeremo un file chiamato gunicorn-deploy.py nella radice della nostra applicazione, (sebbene il nome possa essere qualsiasi cosa) con il seguente contenuto:

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

Configurazione supervisione:

Ora impostiamo il file supervisore, per questo generiamo il file di configurazione con

echo_supervisord_conf > /etc/supervisord.conf

Ora modifichiamo il file di configurazione:
vim /etc/supervisord.conf

E rimuovere il commento dalle seguenti righe rimuovendo il; (punto e virgola):

[unix_http_server] file = / tmp / supervisor.sock [supervisord] logfile = / var / log / supervisord.log logfile_maxbytes = 50MB logfile_backups = 10 loglevel = debug pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [program: appname] command = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -Appname / appname / gunicorn-deploy.py directory = / var / www / ENV-appname / appname / autostart = true autorestart = true user = Username redirect_stderr = true stdout_logfile = / var / www / logs / appname / supervisord.log

Ora creeremo lo script per supervisord per iniziare con il sistema, per questo creeremo il file:
vim /etc/init.d/supervisord

E aggiungiamo il seguente contenuto:

 # Supervisord auto-start # # descrizione: Auto-avvia supervisord # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 in start) echo -n "Avvio di supervisord:" $ SUPERVISORD echo ;; stop) echo -n "Arresto supervisord:" $ SUPERVISORCTL shutdown echo ;; riavvio) echo -n "Arresto supervisord:" $ SUPERVISORCTL shutdown echo echo -n "Avvio supervisord:" $ SUPERVISORD echo ;; che C

E ora diamo i permessi di esecuzione al file in modo che possa iniziare con il sistema:
sudo chmod +x /etc/init.d/supervisord

Aggiorniamo i link per avviare il servizio:
sudo update-rc.d supervisord defaults

Iniziamo il servizio:
sudo /etc/init.d/supervisord start

Configurazione di nginx:

Anche questo passaggio è abbastanza semplice, creeremo il seguente file di configurazione di nginx per la nostra applicazione:

vim /etc/nginx/sites-enabled/nombreApp

E aggiungeremo il seguente contenuto a te

server {ascolta 9001; # porta dove vogliono che nginx server_name ascolti www.domain.com; # o 192.168.0.100, indirizzo a cui accederemo access_log /var/log/nginx/Appname.access.log; # dove avremo la posizione del registro dell'applicazione / {# dove nginx chiamerà quando si accede a www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } location / static / {# dove nginx accederà quando entreremo in www.domain.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

E riavviamo nginx:
service nginx restart

Configurazione di Django:

Modifichiamo il file di configurazione di django:
vim nombreApp/settings.py

Cerchiamo la riga che dice DEBUG = Vero e cambiamo il valore, residuo DEBUG = Falso

Aggiungiamo i parametri DB:

DATABASES = {"default": {"ENGINE": "django.db.backends.postgresql_psycopg2", # o mysql, o qualunque cosa stiano utilizzando "NAME": "DBName", "USER": "DBUser", "PASSWORD" : 'password DB', 'HOST': 'localhost', # o quello di cui hanno bisogno 'PORT': '', # o quello che stanno usando}}

Cerchiamo la linea ALLOWED_HOSTS = [] e aggiungiamo il dominio o l'indirizzo attraverso il quale accediamo, lasciando qualcosa di simile ALLOWED_HOSTS = ["www.domain.com"]

Configuriamo la directory per i file statici, cerchiamo la riga che dice STATIC_ROOT = ' ' e cambiamo il valore, posizionando il percorso assoluto dove vogliamo che siano i nostri file statici, nel mio caso l'ho lasciato più o meno così STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Quasi finito, eseguiamo il seguente comando:
./manage.py collectstatic

Questo creerà una cartella con il nome 'statica nel percorso che specifichiamo nel file impostazioni.py ', è lì che saranno tutti i nostri file statici.

E infine riavviamo il supervisore per prendere le nuove modifiche:
supervisorctl restart nombreApp

E questo sarebbe tutto, alla fine non era tanto vero? mi sembrava semplice 😀

Spero vi sia utile, saluti 😉

Documentazione GUnicorn

Documentazione di supervisione


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   f3niX suddetto

    Capisco che l'app Django non deve essere collocata nella radice della cartella del server web (/ var / www)? Per sicurezza, non so se mi sbaglio.

    Saluti.

    1.    uKh suddetto

      Tutto ok !!! Era qualcosa di cui ero totalmente all'oscuro, aggiornerò la voce 😛 e non appena tornerò lunedì apporterò modifiche nell'applicazione xD
      grazie

  2.   Rodrigo Bravo (Goidor) suddetto

    Fratello Epale buon tutorial. Recentemente sono stato anche io nello stesso ma in Debian 7 ho dovuto cercare e leggere più o meno. Ti consiglio di creare l'ambiente virtuale di virtualenv nella home dell'utente in una cartella nascosta.

    Saluti!

  3.   Servi Fenriz suddetto

    hahaha ctm I ieri ho documentato Django e tu stai già attraversando la galassia 999999 Saluti uomini xD

  4.   daniel2ac suddetto

    Articolo molto buono =) solo una settimana fa ho distribuito la mia app django ma l'ho fatto con uwsgi e nginx, sai quale vantaggio ha gunicorn? L'ho visto menzionato molto.
    È bello vedere che django sta diventando molto popolare, la verità è il miglior framework che ho visto =)

  5.   ozkar suddetto

    Per lo STATIC_ROOT quello che faccio è definire una variabile globale. Qualcosa come questo:

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

    Dove backend è un'app che ho creato. In questo modo mi assicuro che dove distribuisco il progetto, il percorso globale sia lo stesso.

  6.   sgmarti suddetto

    Interessante, proverò in futuro.

    A proposito, qualcuno sa come abilitare gli accenti e i caratteri non ASCII in un'applicazione django?

    Ho cercato ovunque, nessuno dei seguenti metodi funziona per me:
    sys.setdefaultencoding ('utf-8') # in sites.py

    # - * - coding: utf-8 - * - # in ogni file python

    La modifica di site.py e l'inserimento di utf-8 invece di ascii dovrebbe funzionare, ma $ file models.py mi informa che il mio file è ancora un ascii.

    Eventuali suggerimenti?

    1.    sgmarti suddetto

      Ha funzionato!!!!

  7.   anime230 suddetto

    ottimo tutorial ma potresti fare uno di come caricare la mia app su un web server già in produzione
    grazie