Diferència entre revisions de la pàgina «Django en producció»
(Hi ha 10 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 17: | Línia 17: | ||
# Creeu un virtualenv per al projecte i feu-hi un source com indica l'article [[Virtualenv]] | # Creeu un virtualenv per al projecte i feu-hi un source com indica l'article [[Virtualenv]] | ||
# Instal·leu Django (si és el projecte que hi ha en aquest article instal·leu la versió 1.7 com s'indica) | # Instal·leu Django (si és el projecte que hi ha en aquest article instal·leu la versió 1.7 com s'indica) | ||
− | # ... | + | # Descarregueu el projecte de Django del repositori de GITHUB pertinent, hauria de ser similar a:<pre>(env) $ git clone https://github.com/emieza/provadjango.git</pre> |
+ | # Instal·leu la base de dades amb un ''makemigrations'' i un ''migrate'' | ||
+ | # Correu el servidor amb la comanda: <pre>(env) $ python manage.py runserver 0.0.0.0:8080 &</pre> | ||
+ | Pareu atenció a les novetats d'aquesta darrera comanda: | ||
+ | * Mitjançant 0.0.0.0 permetrem que qualsevol màquina pugui accedir al servidor (abans amb 127.0.0.1 només es podia accedir des de localhost). | ||
+ | * El port d'accés és el 8080 | ||
+ | * El "&" final permet que el procés sigui independent de la nostra ''shell'', i ara la podrem tancar sense problema. | ||
+ | |||
+ | === Matar el procés === | ||
+ | Com que hem independitzat el procés de la ''shell'', per parar-lo no ens serveix un CTRL-C de costum. | ||
+ | |||
+ | Per parar aquest procés caldrà localitzar el PID i fer-li un KILL, o sigui: | ||
+ | $ ps aux | grep python | ||
+ | ...localitzem el seu PID, posem que fos el 10194 i el matem: | ||
+ | $ kill 10194 | ||
<br> | <br> | ||
== Django en producció amb Apache i WSGI == | == Django en producció amb Apache i WSGI == | ||
+ | Referències: | ||
+ | * [https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/modwsgi/#using-mod-wsgi-daemon-mode Doc oficial de Django] | ||
+ | * [https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-ubuntu-14-04 Tutorial de DigitalOcean per posar aplicacions Django en producció]. | ||
− | ... | + | Tingues en compte el següent: |
+ | # Hauràs de '''migrar de nou la BD si no ho has fet prèviament''' (estarà buida quan facis un clone del projecte en producció). | ||
+ | # La versió en producció de Django NO és la ''development'' i tenen algunes diferències. | ||
+ | # '''La versió producció de Django no serveix arxius estàtics'''. | ||
+ | #* Això es fa per una qüestió de ''performance'' (rendiment). És millor que els arxius estàtics els serveixi el servidor web, que és l'especialista en el tema. Si ho fes Django com ho fa en el servidor de desenvolupament, seria lent (no ho notaries en aplicacions petites però sí si tens moltes visites). | ||
+ | #* Fixa't en el procediment que us he passat en que en un moment donat es fa <pre>$ python manage.py collectstatic</pre> | ||
+ | #*: ...aquest és el moment de recollir tots els arxius interns de les plantilles de Django i posar-los a la carpeta que haguem indicat a la variable STATIC_ROOT dintre de settings.py. Si no ho has fet prèviament, fes-ho. | ||
+ | #* Si no segueixes aquestes passes l'aplicació funcionarà, però es veurà "rara", sense estils CSS i tal. | ||
+ | #* Finalment hauràs de tunejar el VirtualServer de Apache amb un "Alias" per fer que /static accedeixi a la carpeta on acabem d'enxufar tots els arxius estàtics de les plantilles internes de Django. | ||
+ | # Hauràs també de corregir certs '''problemes de permisos'''. Això es deu a que l'usuari que executa Apache no és root, sinó '''www-data''' (per seguretat), i no pot entrar a tot arreu. Per tant, caldrà canviar alguns ajustos per fer que Apache pugui entrar a les teves carpetes d'usuari on tens els arxius de l'aplicació. | ||
+ | #: Els passos estan indicats al tutorial, només fem referència per aclariment. | ||
<br> | <br> | ||
− | == Django en producció amb | + | == Django en producció amb Heroku == |
+ | Heroku és un sistema PaaS servidor d'aplicacions. Ens permetrà posar en marxa una aplicació web Django sense necessitat de configurar el servidor. Heroku ens ofereix una sèrie d'eines amb combinació amb GIT, per poder pujar la aplicació a la seva infraestructura i posar-la en marxa. | ||
+ | |||
+ | Pots seguir el tutorial oficial de Heroku per a Python. Posa en marxa una aplicació [[Django]]: | ||
+ | https://devcenter.heroku.com/articles/getting-started-with-python#introduction | ||
+ | |||
+ | Per adaptar una aplicació Django que tinguis ja feta, cal adaptar els següents arxius: | ||
+ | |||
+ | === requirements.txt === | ||
+ | Es sol generar dintre del [[Virtualenv]] (important) amb: | ||
+ | (env) $ pip freeze > requirements.txt | ||
+ | |||
+ | Conté els paquets que necessita la nostra app, com a mínim seran Django i gunicorn, i tots els plugins que necessitis, per ex.: | ||
+ | Django==1.10.4 | ||
+ | django-ipware==1.1.6 | ||
+ | gunicorn==19.6.0 | ||
− | ... | + | === Procfile === |
+ | Aquest arxiu conté la configuració per poder posar en marxa la nostra app Django. [https://devcenter.heroku.com/articles/getting-started-with-python#define-a-procfile A l'exemple de la doc oficial] és per una app genèrica, caldrà que modifiquis la primera paraula amb el nom de la carpeta on tens l'arxiu <code>wsgi.py</code> | ||
+ | web: gunicorn karaokelist.wsgi --log-file - | ||
<br> | <br> |
Revisió de 19:14, 23 feb 2018
En aquest article veurem diverses maneres de posar en producció en un servidor el framework web Django.
Abans que res cal que compteu amb un projecte propi en Django, a l'estil d'aquest, que és el mateix que hi ha al tutorial oficial de Django:
https://github.com/emieza/provadjango
Si voleu utilitzar aquest projecte de prova meu, tingueu en compte que està fet amb Django 1.7, i que per tant cal instal·lar aquesta versió concreta en el vostre Virtualenv amb
(env) $ pip install django==1.7
Contingut
Django en producció amb el servidor de desenvolupament[modifica]
Aquesta versió és una xapussa per fer proves però que en ocasions és útil per depurar algun possible problema del servidor. Per tant, aquest NO és un mètode recomanable per producció, simplement és per fer proves i una primer aproximació al tema.
- Obriu el port 8080 del vostre servidor, si és que te un firewall (com és el cas del AWS).
- Instal·leu Virtualenv en el servidor.
- Creeu un virtualenv per al projecte i feu-hi un source com indica l'article Virtualenv
- Instal·leu Django (si és el projecte que hi ha en aquest article instal·leu la versió 1.7 com s'indica)
- Descarregueu el projecte de Django del repositori de GITHUB pertinent, hauria de ser similar a:
(env) $ git clone https://github.com/emieza/provadjango.git
- Instal·leu la base de dades amb un makemigrations i un migrate
- Correu el servidor amb la comanda:
(env) $ python manage.py runserver 0.0.0.0:8080 &
Pareu atenció a les novetats d'aquesta darrera comanda:
- Mitjançant 0.0.0.0 permetrem que qualsevol màquina pugui accedir al servidor (abans amb 127.0.0.1 només es podia accedir des de localhost).
- El port d'accés és el 8080
- El "&" final permet que el procés sigui independent de la nostra shell, i ara la podrem tancar sense problema.
Matar el procés[modifica]
Com que hem independitzat el procés de la shell, per parar-lo no ens serveix un CTRL-C de costum.
Per parar aquest procés caldrà localitzar el PID i fer-li un KILL, o sigui:
$ ps aux | grep python
...localitzem el seu PID, posem que fos el 10194 i el matem:
$ kill 10194
Django en producció amb Apache i WSGI[modifica]
Referències:
Tingues en compte el següent:
- Hauràs de migrar de nou la BD si no ho has fet prèviament (estarà buida quan facis un clone del projecte en producció).
- La versió en producció de Django NO és la development i tenen algunes diferències.
- La versió producció de Django no serveix arxius estàtics.
- Això es fa per una qüestió de performance (rendiment). És millor que els arxius estàtics els serveixi el servidor web, que és l'especialista en el tema. Si ho fes Django com ho fa en el servidor de desenvolupament, seria lent (no ho notaries en aplicacions petites però sí si tens moltes visites).
- Fixa't en el procediment que us he passat en que en un moment donat es fa
$ python manage.py collectstatic
- ...aquest és el moment de recollir tots els arxius interns de les plantilles de Django i posar-los a la carpeta que haguem indicat a la variable STATIC_ROOT dintre de settings.py. Si no ho has fet prèviament, fes-ho.
- Si no segueixes aquestes passes l'aplicació funcionarà, però es veurà "rara", sense estils CSS i tal.
- Finalment hauràs de tunejar el VirtualServer de Apache amb un "Alias" per fer que /static accedeixi a la carpeta on acabem d'enxufar tots els arxius estàtics de les plantilles internes de Django.
- Hauràs també de corregir certs problemes de permisos. Això es deu a que l'usuari que executa Apache no és root, sinó www-data (per seguretat), i no pot entrar a tot arreu. Per tant, caldrà canviar alguns ajustos per fer que Apache pugui entrar a les teves carpetes d'usuari on tens els arxius de l'aplicació.
- Els passos estan indicats al tutorial, només fem referència per aclariment.
Django en producció amb Heroku[modifica]
Heroku és un sistema PaaS servidor d'aplicacions. Ens permetrà posar en marxa una aplicació web Django sense necessitat de configurar el servidor. Heroku ens ofereix una sèrie d'eines amb combinació amb GIT, per poder pujar la aplicació a la seva infraestructura i posar-la en marxa.
Pots seguir el tutorial oficial de Heroku per a Python. Posa en marxa una aplicació Django:
https://devcenter.heroku.com/articles/getting-started-with-python#introduction
Per adaptar una aplicació Django que tinguis ja feta, cal adaptar els següents arxius:
requirements.txt[modifica]
Es sol generar dintre del Virtualenv (important) amb:
(env) $ pip freeze > requirements.txt
Conté els paquets que necessita la nostra app, com a mínim seran Django i gunicorn, i tots els plugins que necessitis, per ex.:
Django==1.10.4 django-ipware==1.1.6 gunicorn==19.6.0
Procfile[modifica]
Aquest arxiu conté la configuració per poder posar en marxa la nostra app Django. A l'exemple de la doc oficial és per una app genèrica, caldrà que modifiquis la primera paraula amb el nom de la carpeta on tens l'arxiu wsgi.py
web: gunicorn karaokelist.wsgi --log-file -
Django en producció amb Gunicorn[modifica]
...