Skip to content

Instalando mod_wsgi, nginx y cmemcache en Ubuntu Intrepid para Django

marzo 21, 2009

Es un resumen breve para configurar nuestro servidor apache con mod_wsgi, memcache y nginx, el cual lo he recopilado de varios sitios, el cual espero pueda ser de ayuda y tambien pueda permitirnos a abrir debatos en lo que se refiere a las mejores practicas para configurar tus host para aplicaciones django.

Por que mod_wsgi y no mod_apache, puedes encontrar en este resumen mas detalles en los siguientes links:

Primero instalamos todos los paquetes requeridos:

$ sudo apt-get install subversion gcc curl
$ sudo apt-get install build-essential python-dev python-setuptools
$ sudo apt-get install python-egenix-mxdatetime memcached postfix

Para configurar memcache, necesitamos realizar dos pasos, el primero será inicializar memcache:

$ sudo memcached -u www-data -p 11211 -m 32 -d

(Inicializa memcached bajo el usuario www-data con 32 megabytes de ram)
Ahora necesitaremos construir el cmemcache, para ello obtenemos la siguiente librería:

$ sudo apt-get install libmemcache-dev

Ahora obtenemos el cmemcache y haremos un build del mismo:

$ wget http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2
$ tar -xjvf cmemcache-0.95.tar.bz2
$ cd cmemcache-0.95
$ sudo python setup.py install

Instalación y configuración de Nginx

Primero debemos instalar nginx:

$ sudo apt-get install nginx

Luego inicializar nginx:

$ sudo /etc/init.d/nginx start

Podemos probarlo realizando curl 127.0.0.1 que nos devolverá una pagina html con titulo: Welcome to nginx!!

A continuación editamos la configuración básica de nginx, actualizando los siguientes datos:

$ sudo vim /etc/nginx/nginx.conf

worker_processes 4;  #4 indica que el servidor usa 4 procesadores
tcp_nopush on;       # activar esta línea
keepalive_timeout  2;
gzip  on;
gzip_comp_level 2;
gzip_proxied any;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

Luego debemos añadir un nuevo archivo de configuración llamado proxy.conf que deberá contener lo siguiente:

$ sudo vim /etc/nginx/proxy.conf

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

Puesto que nginx usa el Puerto 80 debemos cambiar la configuración de nuestro apache para que use el puerto 8080, para ello modificamos el archivo /etc/apache2/ports.conf y remplazamos el 80 por 8080.

Puesto que nginx no soporta la opción keepAlive debemos desactivar la misma en nuestro apache, para ello editamos el archivo /etc/apache2/apache2.conf y ponemos: KeepAlive off.

Ahora nos toca crear la estructura de directorios para nuestro dominio:

$ mkdir –p /home/<username>/webapps/<midominio>/{public,private,log,backup}

Para habilitar nginx en nuestro dominio debemos añadir nuestro dominio a los sitios habilitados y disponibles en nginx, para ello debemos añadir el siguiente archivo:

$ sudo vim /etc/nginx/sites-available/<midominio>

Cuyo contenido debería tener algo parecido a:

server {
listen 80;
server_name <midominio> http://www.<midominio>;
access_log /home/<username>/webapps/<midominio>/log/access.log;
error_log /home/<username>/webapps/<midominio>/log/error.log;

# main
location / {
proxy_pass              http://127.0.0.1:8080/;
proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real_IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
location /media/ {
root    /home/<username>/webapps/<midominio>/public/;
}
}

Luego debemos crear un link del mismo archivo a sites-enabled:

$ sudo ln -s /etc/nginx/sites-available/<midominio> /etc/nginx/sites-enabled/<midominio>
$ sudo /etc/init.d/nginx restart

Para probar nginx, primero añadimos nuestro dominio al archivo de host usando nuestra ip.

$ sudo vim /etc/hosts

Dicho archivo debería verse algo asi:

127.0.0.1      localhost
<mi ip>       http://www.<midominio&gt;

Luego en un browser ingresar a tu dominio y debera aparecer la pagina de error de nginx.

Instalar y Configurar mod_wsgi, con apache, nginx

Obtenemos mod_wsgi para nuestro servidor apache:

sudo apt-get install libapache2-mod-wsgi apache2-mpm-worker apache2-threaded-dev

En primera instancia debemos deshabilitar los sitios por defecto de apache:

$ sudo a2dissite 000-default

Asignamos los permisos correctamente:

$ sudo usermod -a -G www-data <username>

– Aseguramos que el directorio /home/<username>/webapps sea de <username> y que además este en el grupo www-data:

$ sudo chgrp -R www-data /home/<username>/

Nos aseguramos que todos los archivos nuevos de nuestro directorio webapps, heredaran los permisos:

$ sudo chmod -R 2750 /home/<username>/webapps

Otorgar permisos de escritura al usuario apache en el directorio privado de nuestro dominio:

$ sudo chmod -R 2770 /home/<username>/webapps/<midominio>/private

Obtener tu proyecto django y colocarlo dentro del directorio /home/<username>/webapps/<midominio>/

A continuación creamos el archivo wsgi:

vim /home/<username>/webapps/<midominio>/miproyecto.wsgi

El cual tendrá el siguiente contenido:

import os, sys
sys.stdout = sys.stderr

if ‘/home/<username>/webapps/<midominio>’ not in sys.path:
sys.path.append(‘/home/<username>/webapps/<midominio>’)
if ‘/home/<username>/webapps/<midominio>/<miproyecto>’ not in sys.path:
sys.path.append(‘/home/<username>/webapps/<midominio>/<miproyecto>’)
os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘<miproyecto>.settings’

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

Por ultimo lo que nos toca es configurar el virtual host en el apache.
$ sudo vim /etc/apache2/sites-available/<midominio>

<VirtualHost *:8080>
ServerName http://www.<midominio&gt;
ServerAlias <midominio>

<Directory /home/<username>/webapps/<midominio>/<miproyecto>/>
Order deny,allow
Allow from all
</Directory>

LogLevel warn
ErrorLog   /home/<username>/webapps/<midominio>/log/apache_error.log
CustomLog  /home/<username>/webapps/<midominio>/log/apache_access.log combined

WSGIDaemonProcess <midominio> user=www-data group=www-data threads=25
WSGIProcessGroup <midominio>
WSGIScriptAlias /  /home/<username>/webapps/<midominio>/<miproyecto>/<miproyecto>.wsgi
</VirtualHost>

Creamos un link del archivo para colocarlo entre los sitios habilitados de apache:

Ln –s /etc/apache2/sites-available/<midominio> /etc/apache2/sites-enable/<midominio>

Por ultimo le decimos a apache que agregue nuestro dominio:

$ sudo a2ensite <midominio>
$ sudo /etc/init.d/apache2 reload

Reiniciamos nuestro apache y listo!! Tenemos nuestro dominio en http://www.<midominio&gt;

Referencias:
http://articles.slicehost.com/2008/5/16/ubuntu-hardy-nginx-virtual-hosts
http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/
http://lethain.com/entry/2007/jul/17/dreamier-dream-server-nginx/
http://lethain.com/entry/2009/feb/13/the-django-and-ubuntu-intrepid-almanac/

Anuncios
3 comentarios leave one →
  1. Ana Vidal Soria permalink
    febrero 12, 2011 9:49 pm

    Hola! Intento montar en Apache una aplicación hecha en Django… Pero el comando chgrp -R www-data /home/usuario/ me arroja chgrp: no se puede acceder a «/home/usuario/.gvfs»: Permiso denegado

  2. febrero 14, 2011 2:19 am

    Ana, estas usando sudo?

    Además, creo que hay un typo en el artículo. Tendrías que cambiar a el directorio webapps, más o menos así:

    $ sudo chgrp -R www-data /home/usuario/webapps/

    Saludos!

  3. Francisco permalink
    abril 15, 2011 7:47 pm

    Gracias totales!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: