Tengo que instalar en una maquina virtual con virtualbox un deployment de un proyecto que debo entregar dejaré aqui los pasos que me funcionaron, ya tenía un post de deployment con uwsgi, pero ha quedado un poco desactualizado.
Bien voy colocando cada uno de los comandos:
$ sudo apt-get install python-virtualenv
Hay algunas otras herramientas que necesitamos instalar para el uso de django en ubuntu:
$ sudo apt-get install mysql-server
$ sudo apt-get install libmysql++-dev
$ sudo apt-get install python-dev
$ sudo apt-get install python-mysqldb
$ sudo apt-get install build-essential python
Crear una carpeta donde tendremos nuestras aplicaciones web:
$ sudo mkdir -p /webapps/carpeta_proyecto
$ sudo chown administrador /webapps/carpeta_proyecto
Creamos nuestro directorio virtual:
$ cd /webapps/carpeta_proyecto
$ virtualenv venv
$ source venv/bin/activate
Cargamos en ese directorio una carpeta con el código de nuestro proyecto, en mi caso lo tengo en bitbucket por lo que usando este comando descargo el código.
(venv)$ git clone http://bitbucket.org/tu_usuario/miproyecto.git
De esta forma tendremos dos directorios uno con el nombre de nuestro proyecto <
miproyecto> y por otro lado tendremos un directorio con el entorno virtual <
venv>.
Ahora instalamos el entorno en mi proyecto tengo un archivo requirements.txt, pero igual mínimo necesitamos instalar django y la librería de mysql, lo instalamos usando pip.
(venv)$ pip install django
(venv)$ pip install python-mysql
Es probable que para el proyecto tengan que correr un python manage.py syncdb o migrate para que puedan cargar la base de datos del proyecto, hasta este punto debemos poder probar el proyecto y ver que se encuentre funcionando correctamente usando un runserver.
Una vez que lo anterior se encuentre funcionando vamos ahora a realizar directamente el deployment.
Primero iniciamos instalando gunicorn, para eso utilizamos:
(venv)$ pip install gunicorn
Podemos probar el funcionamiento de gunicorn utilizando:
(venv)$ cd miproyecto
(venv)$ gunicorn miproyecto.wsgi:application --bind 0.0.0.0:8080
NOTA: La carpeta miproyecto, es el directorio que django crea cuando ejecutamos un startproject.
Al ejecutar el comando anterior gunicorn inicia un servidor en el puerto 8080 para ejecutar nuestro proyecto,
sin embargo puede ser que el contenido estático no funcione correctamente.
Ahora para hacerlo más dinámico realizamos lo siguiente, creamos un archivo en mi caso yo lo deje en carpeta_proyecto/deployment/
gunicorn_run y le copiamos dentro el siguiente contenido:
#!/bin/bash
NAME="miproyecto_app" # Nombre de la app
DJANGODIR=/webapps/carpeta_proyecto/miproyecto # directorio del proyecto de Django
SOCKFILE=/webapps/carpeta_proyecto/deployment/gunicorn.sock # Nos comunicaremos utilizando este unix socket
USER=miusuario # Correr con el usuario
GROUP=grupousuario # Correr como el grupo
NUM_WORKERS=3 # Cuantos - worker processes - de Gunicorn
DJANGO_SETTINGS_MODULE=miproyecto.settings # Archivo settings de Django
DJANGO_WSGI_MODULE=miproyecto.wsgi # Archivo WSGI del proyecto
echo "Starting $NAME as `whoami`"
# Activando el entorno
cd $DJANGODIR
source ../venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Crear el directorio para correrlo en caso de no existir
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Iniciando Django Gunicorn
exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-
Posteriormente convertimos el archivo como ejecutable usando el comando:
(venv)$ sudo chmod u+x gunicorn_run
Para probar el gunicorn podemos ejecutar el archivo de esta forma hacemos lo siguiente:
(venv)$ ./gunicorn_run
Una vez que se haya logrado ejecutar sin problemas, ahora, instalamos supervisor.
(venv)$ sudo apt-get install supervisor
Después de instalar supervisor vamos a crear el archivo
/etc/supervisor/conf.d/miproyecto.conf con el siguiente contenido:
[program:miproyecto]
command = /webapps/carpeta_proyecto/deployment/gunicorn_run ; Comando para iniciar la app
user = miusuario ; Usuario que lo va ejecutar
stdout_logfile = /webapps/carpeta_proyecto/logs/gunicorn_supervisor.log ; Ruta del archivo log
redirect_stderr = true ; Alamcenar stderr en el mismo log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8 ; Establecer UTF-8 por default
Creamos el directorio logs y el archivo para almacenar el gunicorn_supervisor.log dentro del directorio de carpeta_proyecto.
(venv)$ mkdir /webapps/carpeta_proyecto/logs
(venv)$ touch /webapps/carpeta_proyecto/logs/gunicorn_supervisor.log
Posteriormente utilizamos para cargar el supervisor:
(venv)$ sudo supervisorctl reread
miproyecto: available
(venv)$ sudo supervisorctl update
miproyecto: added process group
Ahora para revisar el estatus del proyecto podemos utilizar:
(venv)$ sudo supervisorctl status miproyecto
miproyecto RUNNING pid 2277, uptime 0:01:40
Podemos iniciar, parar o reiniciar el proyecto utilizando:
(venv)$ sudo supervisorctl stop miproyecto
miproyecto: stopped
(venv)$ sudo supervisorctl start miproyecto
miproyecto: started
(venv)$ sudo supervisorctl restart miproyecto
miproyecto: stopped
miproyecto: started
Ahora vamos con Nginx, para instalarlo utilizamos:
(venv)$ sudo apt-get install nginx
Para iniciar el servicio podemos utilizar:
$ sudo service nginx start
Con esto el servidor de nginx se activará, puede probarse, por omisión el puerto es el 80. Ahora bien lo que haremos es crear el archivo
/etc/nginx/sites-available/miproyecto con el siguiente contenido:
upstream miproyecto_app_server {
# fail_timeout=0 means we always retry an upstream even if it failed
# to return a good HTTP response (in case the Unicorn master nukes a
# single worker for timing out).
server unix:/webapps/carpeta_proyecto/deployment/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name example.com;
client_max_body_size 4G;
access_log /webapps/carpeta_proyecto/logs/nginx-access.log;
error_log /webapps/carpeta_proyecto/logs/nginx-error.log;
location /static/ {
# path to static folder
alias /webapps/carpeta_proyecto/miproyecto/static/;
}
location /media/ {
# path to media folder
alias /webapps/carpeta_proyecto/miproyecto/media/;
}
location / {
# an HTTP header important enough to have its own Wikipedia entry:
# http://en.wikipedia.org/wiki/X-Forwarded-For
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# enable this if and only if you use HTTPS, this helps Rack
# set the proper protocol for doing redirects:
# proxy_set_header X-Forwarded-Proto https;
# pass the Host: header from the client right along so redirects
# can be set properly within the Rack application
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
# set "proxy_buffering off" *only* for Rainbows! when doing
# Comet/long-poll stuff. It's also safe to set if you're
# using only serving fast clients with Unicorn + nginx.
# Otherwise you _want_ nginx to buffer responses to slow
# clients, really.
# proxy_buffering off;
# Try to serve static files from nginx, no point in making an
# *application* server like Unicorn/Rainbows! serve static files.
if (!-f $request_filename) {
proxy_pass http://miproyecto_app_server;
break;
}
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /webapps/carpeta_proyecto/miproyecto/static/;
}
}
De la misma manera que en los archivos anteriores personalizamos el contenido donde el color esta en negritas.
Ahora creamos el symbolic link en la carpeta sites-enabled (Esta carpeta nos permite indicar a nginx cuales sitios están habilitados).
$ sudo ln -s /etc/nginx/sites-available/
miproyecto /etc/nginx/sites-enabled/
miproyecto
Posteriormente reiniciamos nuestro servidor nginx:
$ sudo service nginx restart
Si hay algún error hay que revisar los directorios de los archivos, por otro lado en caso de que aparezca la pantalla de
bienvenida de nginx al momento de volver a probar
es debido al archivo default, en caso de que no vayamos a utilizar podemos eliminar su archivo símbolico desde el directorio de sites-enabled, una vez realizado lo anterior reiniciamos de nuevo el servidor de nginx.
$ sudo service nginx restart
Posterior a esto deberá funcionar correctamente el sitio.
Espero te sea de utilidad !
Referencias:
http://michal.karzynski.pl/blog/2013/06/09/django-nginx-gunicorn-virtualenv-supervisor/
http://michal.karzynski.pl/blog/2013/10/29/serving-multiple-django-applications-with-nginx-gunicorn-supervisor/