Alexander A. E. Full Stack Developer

nginx, uwsgi, django y virtualenv

Este es un breve tutorial que indica como configurar django en un servidor de producción por medio de nginx, uwsgi y virtualenv.

En mi caso, seguí estas indicaciones en webfaction sin ningún problema.

nginx: instalación

::sh
mkdir -p ~/{opt,projects,src}
cd ~/src
wget http://nginx.org/download/nginx-1.5.x.tar.gz
tar xf nginx-1.5.x.tar.gz
cd nginx-1.5.x
./configure --prefix=/home/username/opt/nginx  --with-http_ssl_module
make && make install

uwsgi

instalamos uwsgi

    pip install uwsgi

creamos un archivo de prueba:

::python
# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hola mundo cruel"

lanzamos uwsgi2 indicando el archivo que creamos:

    uwsgi --http :16517 --wsgi-file test.py

y si todo va bien.. podemos continuar

django y virtualenv1

creamos un entorno virtual, instalamos django y creamos un proyecto de prueba.

    mkvirtualenv django
    pip install django
    cd ~/projects
    # creamos un proyecto de prueba
    django-admin startproject myapp

para que el entorno virtual sea reconocido adecuadamente, editamos el archivo wsgi.py de nuestro proyecto en django para que quede de la siguiente manera:

::python
# wsgi.py
import os
import sys

from site import addsitedir
addsitedir('/home/username/.envs/django_1_5/lib/python2.7/site-packages')

sys.path = ['/home/username/projects/myapp/',
'/home/username/projects/myapp/myapp/'] + sys.path

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

application = get_wsgi_application()

y podemos probar uwsgi con nuestro proyecto en django:

    uwsgi --http :16517  --wsgi-file /home/username/projects/myapp/myapp/wsgi.py

Si todo bien hasta ahora, podemos configurar nginx para que interactue con uwsgi.

    nginx <-> uwsgi <-> django

nginx: configuración

editamos el archivo nginx.conf para que quede similar a:

# nginx.conf
worker_processes  1;

error_log  logs/error.log;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       16517;
        server_name  nginx1.username.webfactional.com;

        location / {
            include uwsgi_params;
            uwsgi_pass unix:///home/username/projects/myapp/myapp.sock;
        }
    }
}

ejecutamos el worker de uwsgi:

    uwsgi --master --workers 1 --wsgi-file /home/username/projects/myapp/myapp/wsgi.py --uwsgi-socket /home/username/projects/myapp/myapp.sock

iniciamos nginx:

    ~/opt/nginx/sbin/nginx

Y con esto concluye lo básico. Si me doy un tiempo, ampliaré esta entrada con lo necesario para que nginx maneje los archivos static y media de nuestro proyecto en django así como también el añadir a un gestor de procesos como supervisor para que maneje los workers de uwsgi.

Información adicional:
  1. Setting up Django and your web server with uWSGI and nginx
  2. How to use Django with uWSGI
  3. Deploy Django-Nginx-uwsgi pada web faction

  1. Note que estoy usando virtualenvwrapper para administrar el entorno virtual (mkvirtualenv para crear el entorno virtual). ↩

  2. si estamos usando webfaction debimos de haber creado, por medio de su panel, una aplicación personalizada y utilizado el puerto que se nos asigno para la prueba con uwsgi o con nginx (en mi caso el 16517) ↩

Comentarios !

comments powered by Disqus