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:
- Setting up Django and your web server with uWSGI and nginx
- How to use Django with uWSGI
- Deploy Django-Nginx-uwsgi pada web faction
-
Note que estoy usando virtualenvwrapper para administrar el entorno virtual (mkvirtualenv para crear el entorno virtual). ↩
-
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