Que tal un saludo a todos, este es mi primer articulo en <Ā» DesdeLinux (de varios que tengo en mis borradores xD), espero les sea de utilidad ļ
Bueno, en mi nuevo y actual trabajo, en estos momentos se esta realizando la migración de varios sistemas hacia Django (que raro eh?? xD) y una de mis tareas, aparte del desarrollo, es la puesta en producción de estos, entonces como buen aprendiz,Ā puesto que era mi primera vez poner en producción una aplicación en un servidor real :$ me puse a leer la doc oficial de cada uno de los paquetes requeridos del stack (Gunicorn y Supervisord mas que todo),Ā y viendo que los tutoriales en espaƱol que hay no me fueron muy claros en algunos aspectos, decidĆ crear una mini guĆa con los pasos que segui para poner en producción la aplicacion, basĆ”ndonos en el stack Django, Gunicorn, Supervisord, Nginx y Postgresql.
En el caso donde trabajo, los servidores aun corren con Debian Squeeze, pero la guĆa deberĆa ser totalmente valida para otras distribuciones⦠entonces vayamos directo al grano y comencemos:
Yo trabajare como super usuario. Primero que nada, se requieren los siguientes paquetes:
PIP -> Herramienta para instalar y administrar paquetes para Python
aptitude install python-pip
Nginx -> Servidor web (lo utilizaremos como proxy invertso y para cachear los archivos estaticos āimg, js, cssā ) Lo instalamos con:
aptitude install nginx
Supervisord ā > Aplicación para administrar y supervisar nuestra aplicación, aunque sirve para mucho mas. Lo instalamos con:
aptitude install supervisor
Virtualenv -> Nos sirve para crear un entorno virtual de ejecución personalizado para nuestra aplicación. Lo instalamos con:
aptitude install python-virtualenv
Gunicorn -> Servidor web para python (esto no lo instalaremos todavĆa)
Asumo que ya deberĆan tener instalado y configurado postgresql
psycopg2 -> Conector de postgresql para python (tampoco lo instalaremos todavia)
Crear entorno virtual con virtualenv:
Primero vamos a movernos hasta el directorio de trabajo que utilizaremos para la puesta en producción:
cd /var/www/
Luego en dicho directorio crearemos el entorno virtual:
virtualenv ENV-nombreApp
Nos movemos hasta el directorio que acabo de crear virtualenv
cd ENV-nombreAPP
Copiamos la aplicación en este directorio y ahora procedemos a activar el entorno con:
source bin/activate
El prompt deberĆ” quedar ahora como (ENV)usuario@host:
Esto harĆ” que ahora todo lo que hagamos este almacenado en el directorio /var/www/ENV-nombreAPP/ sin afectar los paquetes del sistema
Ahora nos movemos al directorio de la aplicación:
cd nombreApp
Procedemos a instalar la lista de dependencias de la aplicación (de ser necesario), en el cual las mismas estÔn especificadas en el archivo requirements.txt:
pip install -r requirements.txt
TambiƩn podemos instalar paquetes de manera individual, por ejemplo, para instalar el conector de postgresql:
pip install psycopg2
Instalación y configuración de GUnicorn:
Para instalarlo lo hacemos de la misma manera:
pip install gunicorn
Ahora vamos a configurarlo, para ello vamos a crear un archivo llamado gunicorn-deploy.py en la raĆz de nuestra aplicación, (aunque el nombre puede ser cualquiera) con el siguiente contenido:
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
Configuracion de Supervisord:
Ahora configuremos el supervisord, para eso generamos el fichero de configuración con
echo_supervisord_conf > /etc/supervisord.conf
Ahora editamos el archivpo de configuración:
vim /etc/supervisord.conf
Y descomentamos las siguientes lineas quitandole el ;Ā (punto y 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
Ahora crearemos el script para que supervisord inicie con el sistema, para eso crearemos el archivo:
vim /etc/init.d/supervisord
Y le agregamos el siguiente contenido:
# Supervisord auto-start
#
# description: Auto-starts supervisord
# processname: supervisord
# pidfile: /var/run/supervisord.pid
SUPERVISORD=/usr/local/bin/supervisord
SUPERVISORCTL=/usr/local/bin/supervisorctl
case $1 in
start)
echo -n "Iniciando supervisord:"
$SUPERVISORD
echo
;;
stop)
echo -n "Deteniendo supervisord:"
$SUPERVISORCTL shutdown
echo
;;
restart)
echo -n "Deteniendo supervisord:"
$SUPERVISORCTL shutdown
echo
echo -n "Iniciando supervisord: "
$SUPERVISORD
echo
;;
esac
Y ahora le damos permisos de ejecución al archivo para que pueda iniciar con el sistema:
sudo chmod +x /etc/init.d/supervisord
Actualizamos los enlaces para arrancar el servicio:
sudo update-rc.d supervisord defaults
Iniciamos el servicio:
sudo /etc/init.d/supervisord start
Configurando nginx:
Este paso también es bastante sencillo, crearemos el siguiente archivo de configuración de nginx para nuestra aplicación:
vim /etc/nginx/sites-enabled/nombreApp
Y le agregaremos el siguiente contenido
server {
listen 9001; # puerto donde quieren que escuche nginx
server_name www.dominio.com; # o 192.168.0.100, dirección a la cual accederemos
access_log /var/log/nginx/nombreApp.access.log; # donde tendremos el log de la aplicación
location / { # a donde llamara nginx al acceder a www.dominio.com/
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $http_host;
}
location /static/ { # a donde accedera nginx cuando ingresemos en www.dominio.com/static/
alias /var/www/ENV-nombreApp/nombreApp/staticfiles/;
}
}
Y reiniciamos nginx:
service nginx restart
Configurando Django:
Vamos a modificar el archivo de configuración de django:
vim nombreApp/settings.py
Buscamos la linea que dice DEBUG = True y le cambiamos el valor, quedando DEBUG = False
Agregamos los parƔmetros de la DB:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # o mysql, o lo que estƩn usando
'NAME': 'nombreDB',
'USER': 'usuarioDB',
'PASSWORD': 'contrasenaDB',
'HOST': 'localhost', # o el que necesiten
'PORT': '', # o el que esten usando
}
}
Buscamos la linea ALLOWED_HOSTS=[] y le agregamos el dominio o la dirección por medio del cual accederemos, quedando algo como ALLOWED_HOSTS=[āwww.dominio.comā]
Configuramos el directorio para los archivos estÔticos, buscamos la linea que dice STATIC_ROOT = ' ' y le cambiamos el valor, colocÔndole la ruta absoluta donde queremos que estén nuestros archivos estÔticos, en mi caso lo deje mas o menos asà STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'
Ya casi por finalizar, ejecutamos el siguiente comando:
./manage.py collectstatic
Esto nos creara una carpetaĀ con el nombre āstatics en la ruta que especificamos en el settings.py ā, es allĆ donde estarĆ”n todos nuestros archivos estĆ”ticos.
Y por ultimo reiniciamos el supervisord para que tome los nuevos cambios:
supervisorctl restart nombreApp
Y eso seria todo, al final no era para tanto verdad? a mi me pareció sencillo ļ
Espero les sea de utilidad, saludos ļ