Desde hace un mes, estoy jugando con nginx para mi panel de control de Hosting Amaterasu y una de las cosas que he aprendido y quiero compartir, es el deploy de aplicaciones Django.
Crearé este tutorial, asumiendo que ustedes tienen en su servidor o equipo donde instalarán la aplicación Ubuntu/Debian.
El primer paso, es instalar las python-setuptools:
sudo apt-get install python-setuptools
El segundo paso, es instalar pip que será el gestor de paquetes para proyectos python que vamos a usar
sudo easy_install pip
El tercer paso, es instalar virtualenv, que nos permite crear entornos virtuales (una especie de instalaciones independientes de python, para no instalar directamente en los path de la instalación principal de python)
sudo pip install virtualenv
Como cuarto paso, nos vamos a la carpeta root de nginx donde vamos a colocar nuestra aplicación django y ejecutamos el siguiente comando:
virtualenv --distribute nombre_entorno_virtual
Con esto creamos en la carpeta nombre_entorno_virtual
una instalación de python exclusiva para la app que vamos a instalar.
El quinto paso, es colocar la carpeta de la aplicación Django, en el mismo lugar que la carpeta nombre_entorno_virtual
en el caso de este blog, las dos carpetas estan ubicadas en /var/www/sitios/houseofsysadmin.com/
El sexto paso, es activar el entorno virtual que hemos creado, para ello ejecutamos el siguiente comando:
source nombre_entorno_virtual/bin/activate
El septimo paso, es instalar los requerimientos o dependencias de la aplicación Django.
pip install -r mi_aplicacion/requirements/requirements.txt
Normalmente, los requerimientos/dependencias vienen en un archivo requirements.txt.
El octavo paso, es instalar gunicorn y supervisord
pip install gunicorn
sudo pip install supervisord
Como pueden notar, hay una diferencia en la instalación de las 2 aplicaciones, la primera, se instala en el entorno virtual que creamos, mientras que la segunda, se instala en la instalación de python del sistema operativo.
Como noveno paso, creamos dentro de mi_aplicacion la carpeta deploy (puede tener cualquier otro nombre, yo prefiero este) y dentro de la carpeta deploy, creamos el archivo gunicorn.conf.py
con el siguiente contenido:
bind = "127.0.0.1:8003"
logfile = "/var/www/sitios/houseofsysadmin.com/logs/gunicorn.log"
workers = 2
loglevel = 'info'
#daemon = True
debug = True
El décimo paso, es crear la configuración de supervisord para que arranque y gestione nuestros servicios:
nano /etc/supervisord.conf
El contenido del archivo, debe ser el siguiente:
[unix_http_server]
file=/tmp/supervisor.sock ; (the path to the socket file)
[supervisord]
logfile=/var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=debug ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[program:houseofsysadmin]
command=/ruta/a/nombre_entorno_virtual/bin/gunicorn_django -c deploy/gunicorn.conf.py
directory=/ruta/a/mi_aplicacion/
user=www-data
autostart=true
autorestart=true
stdout_logfile=/ruta/a/mi_aplicacion/logs/supervisord.log
redirect_stderr=true
Nos aseguramos que supervisord arranque con el sistema con el siguiente script en /etc/init.d/supervisord
# 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 "Starting supervisord: "
$SUPERVISORD
echo
;;
stop)
echo -n "Stopping supervisord: "
$SUPERVISORCTL shutdown
echo
;;
restart)
echo -n "Stopping supervisord: "
$SUPERVISORCTL shutdown
echo
echo -n "Starting supervisord: "
$SUPERVISORD
echo
;;
esac
Luego hacemos los cambios necesarios para poder agregar supervidord al arranque del sistema:
sudo chmod +x /etc/init.d/supervisord
sudo update-rc.d supervisord defaults
sudo /etc/init.d/supervisord start
Para ver el status de los procesos iniciados por supervisor usamos el comando:
supervisorctl status
Y para iniciar, parar o reiniciar un servicio, usamos:
supervisorctl start nombre_proceso
supervisorctl stop nombre_proceso
supervisorctl restart nombre_proceso.
Como último paso, configuramos nginx para que pueda actuar como proxy inverso para Gunicorn:
sudo apt-get install nginx
Cambiamos el archivo /etc/nginx/sites-available/default
para que quede parecido al siguiente:
server {
#listen 80; ## listen for ipv4; this line is default and implied
#listen [::]:80 default ipv6only=on; ## listen for ipv6
root /var/www;
index index.html index.htm;
# Increasing the number of MB per upload
client_max_body_size 20M;
# Make site accessible from http://localhost/
server_name domain.com www.domain.com;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8003;
break;
}
}
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}
location /static/ {
alias /ruta/a/mi_aplicacion/static/;
}
location /media/ {
alias /ruta/a/mi_aplicacion/media/;
}
Como siempre, comentarios, dudas y demás, son bienvenidas!
或是邮件反馈可也:
askdama[AT]googlegroups.com
订阅 substack 体验古早写作:
关注公众号, 持续获得相关各种嗯哼: