Instalando mod_wsgi, nginx y cmemcache en Ubuntu Intrepid para Django
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:
- http://code.google.com/p/modwsgi/wiki/PerformanceEstimates
- http://code.google.com/p/modwsgi/wiki/FrequentlyAskedQuestions
- http://blog.webfaction.com/django-setup-improvements
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> 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> www.<midominio>
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 www.<midominio>
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 www.<midominio>
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/
