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 di supervisione
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.
Tutto ok !!! Era qualcosa di cui ero totalmente all'oscuro, aggiornerò la voce 😛 e non appena tornerò lunedì apporterò modifiche nell'applicazione xD
grazie
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!
hahaha ctm I ieri ho documentato Django e tu stai già attraversando la galassia 999999 Saluti uomini xD
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 =)
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.
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?
Ha funzionato!!!!
ottimo tutorial ma potresti fare uno di come caricare la mia app su un web server già in produzione
grazie