Que tal una salutació a tots, aquest és el meu primer article a <» Des de Linux (de diversos que tinc als meus esborranys xD), espero els sigui d'utilitat
Bé, en el meu nou i actual treball, a hores d'ara s'està realitzant la migració de diversos sistemes cap a Django (que estrany eh ?? xD) i una de les meves tasques, a part de el desenvolupament, és la posada en producció d'aquests, llavors com bon aprenent, ja que era la meva primera vegada posar en producció una aplicació en un servidor real: $ em vaig posar a llegir la doc oficial de cada un dels paquets requerits de l'stack (Gunicorn i Supervisord mes que tot), i veient que els tutorials en espanyol que hi ha no em van ser molt clars en alguns aspectes, vaig decidir crear una mini guia amb els passos que segui per posar en producció l'aplicació, basant-nos en el stack Django, Gunicorn, Supervisord, Nginx i Postgresql.
En el cas on treball, els servidors encara corren amb Debian Squeeze, però la guia hauria de ser totalment vàlida per a altres distribucions ... llavors anem directe a el gra i comencem:
Jo treballés com super usuari. Primer de tot, es requereixen els següents paquets:
PIP -> Eina per a instal·lar i administrar paquets per Python
aptitude install python-pip
Nginx -> Servidor web (el farem servir com a proxy invertso i per escorcollar els arxius estàtics 'img, js, css') El instal·lem amb:
aptitude install nginx
Supervisord -> Aplicació per administrar i supervisar la nostra aplicació, encara que serveix per a molt mes. El instal·lem amb:
aptitude install supervisor
Virtualenv -> Ens serveix per crear un entorn virtual d'execució personalitzat per a la nostra aplicació. El instal·lem amb:
aptitude install python-virtualenv
Gunicorn -> Servidor web per python (això no ho instal·larem encara)
Assumeixo que ja haurien de tenir instal·lat i configurat postgresql
psíquic 2 -> Connector de postgresql per python (tampoc ho instal·larem encara)
Crear entorn virtual amb virtualenv:
Primer anem a moure'ns fins al directori de treball que utilitzarem per a la posada en producció:
cd /var/www/
Després en aquest directori crearem l'entorn virtual:
virtualenv ENV-nombreApp
Ens movem fins al directori que acabo de crear virtualenv
cd ENV-nombreAPP
Copiem l'aplicació en aquest directori i ara procedim a activar l'entorn amb:
source bin/activate
El prompt ha de quedar ara com (ENV)usuario@host:
Això farà que ara tot el que fem aquest emmagatzemat al directori / Var / www / ENV-nombreAPP / sense afectar els paquets de sistema
Ara ens movem a directori de l'aplicació:
cd nombreApp
Procedim a instal·lar la llista de dependències de l'aplicació (de ser necessari), en el qual les mateixes estan especificades a l'arxiu requisits.txt:
pip install -r requirements.txt
També podem instal·lar paquets de manera individual, per exemple, per instal·lar el connector de postgresql:
pip install psycopg2
Instal·lació i configuració d'GUnicorn:
Per instal·lar-ho fem de la mateixa manera:
pip install gunicorn
Ara anem a configurar-lo, per això crearem un fitxer anomenat gunicorn-deploy.py en l'arrel de la nostra aplicació, (encara que el nom pot ser qualsevol) amb el següent contingut:
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
Configuració de Supervisord:
Ara configurem el supervisor, Per a això generem el fitxer de configuració amb
echo_supervisord_conf > /etc/supervisord.conf
Ara editem el archivpo de configuració:
vim /etc/supervisord.conf
I descomentem les següents línies quitandole el; (Punt i coma):
[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: nombreApp] command = / var / www / ENV-nombreApp / bin / django_unicorn -c / var / www / ENV -nombreApp / nombreApp / gunicorn-deploy.py directory = / var / www / ENV-nombreApp / nombreApp / autostart = true autorestart = true user = nombreUser redirect_stderr = true stdout_logfile = / var / www / logs / nombreApp / supervisord.log
Ara crearem el script perquè supervisord iniciï amb el sistema, per a això crearem l'arxiu:
vim /etc/init.d/supervisord
I li afegim el següent contingut:
# Supervisord acte-start # # description: Acte-starts supervisord # processname: supervisord # PidFile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl casi $ 1 in start) echo -n "Iniciant supervisord:" $ SUPERVISORD fet ;; stop) echo -n "Aturant supervisord:" $ SUPERVISORCTL shutdown fet ;; restart) echo -n "Aturant supervisord:" $ SUPERVISORCTL shutdown fet echo -n "Iniciant supervisord:" $ SUPERVISORD fet ;; esac
I ara li donem permisos d'execució a l'arxiu perquè pugui iniciar amb el sistema:
sudo chmod +x /etc/init.d/supervisord
Actualitzem els enllaços per arrencar el servei:
sudo update-rc.d supervisord defaults
Iniciem el servei:
sudo /etc/init.d/supervisord start
Configurant nginx:
Aquest pas també és bastant senzill, crearem el següent fitxer de configuració de nginx per a la nostra aplicació:
vim /etc/nginx/sites-enabled/nombreApp
I li afegirem el següent contingut
server {listen 9001; # Port on volen que escolti nginx SERVER_NAME www.dominio.com; # O 192.168.0.100, direcció a la qual accedirem access_log /var/log/nginx/nombreApp.access.log; # On tindrem el log de l'aplicació location / {# a on cridés nginx a l'accedir a www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } Location / static / {# a on accedira nginx quan ingressem en www.dominio.com/static/ àlies / var / www / ENV-nombreApp / nombreApp / staticfiles /; }}
I reiniciem nginx:
service nginx restart
Configurant Django:
Anem a modificar el fitxer de configuració de django:
vim nombreApp/settings.py
Busquem la línia que diu DEBUG = True i li canviem el valor, quedant DEBUG = False
Afegim els paràmetres de la DB:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', # o mysql, o el que estiguin fent servir 'NAME': 'NomDB', 'USER': 'usuarioDB', 'PASSWORD' : 'contrasenaDB', 'HOST': 'localhost', # o el que necessitin 'PORT': '', # o el que estiguin usant}}
Busquem la línia ALLOWED_HOSTS = [] i li afegim el domini o la direcció per mitjà de qual accedirem, quedant alguna cosa com ALLOWED_HOSTS = [ 'www.dominio.com']
Configurem el directori per als fitxers estàtics, busquem la línia que diu STATIC_ROOT = ' ' i li canviem el valor, col·locant-la ruta absoluta on volem que estiguin nostres arxius estàtics, en el meu cas ho deixi més o menys així STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'
Ja gairebé per acabar, executem la següent comanda:
./manage.py collectstatic
Això ens creés una carpeta amb el nom 'estàtica en la ruta que especifiquem en el settings.py ', És allà on hi seran tots els nostres arxius estàtics.
I per últim reiniciem el supervisord perquè prengui els nous canvis:
supervisorctl restart nombreApp
I això seria tot, al final no era per a tanta veritat? a mi em va semblar senzill
Espero us sigui d'utilitat, salutacions