miércoles, 21 de septiembre de 2016

Django + Apache + Configuración MOD_WSGI para usarlo en red local

Hasta ahora hemos instalado por separado las piezas del puzzle para tener en marcha en red local o desde internet nuestro servidor de domótica, pero no los hemos conectado entre ellos.

En principio, necesitamos hacer que Apache, incorpore un soporte para servir archivos Python. Para ello, necesitaremos habilitarle un módulo, que brinde este soporte.

Existen varios módulos de Apache que brindan soporte para correr archivos Python. Uno de los más populares es el módulo mod_python, que sin embargo, presenta algunos problemas que pueden prevenirse, utilizando el módulo mod_wsgi el cual utilizaremos en este proyecto.

Podemos ver la documentación más extensa asociada a esta parte del proyecto en la documentación:
https://code.google.com/archive/p/modwsgi/wikis/QuickConfigurationGuide.wiki
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/

Vamos a ver como instalar y configurar mod_wsgi:

  • Para instalarlo simplemente ejecutamos: sudo apt-get install libapache2-mod-wsgi

  • Para configurarlo: 
Primeramente creamos un proyecto de django. Nuestro proyecto se llamará domobois crearemos el proyecto con el comando:

sudo django-admin.py startproject /var/www/domobois

Al final nos quedará una estructura de directorios como la de la imagen anterior:


 

En este momento el diretorio que no existe es el nombrado como apache. Lo dejamos creado con el comando  sudo mkdir /var/www/domobois/domobois/apache. Más adelante definiremos el archivo django.wsgi que por ahora no existe y servirá para conectar apache con nuestro proyecto de python.

Nuestra aplicación se llamará “domobois”.
Así que dentro del directorio /etc/apache2/sites-available/ creamos el archivo domobois.conf

Es importante la extensión *.conf ya que sin ella el servicio de apache al activar el sitio domobois no será capaz de reconocer el nuevo sitio y activarlo como veremos más adelante. Prestar especial atención a esto, porque en la mayoría de los tutorial que existen por internet no le ponen la extensión y luego al intentar activarlo no es capaz de reconocer el nuevo sitio.

Dentro del archivo de configuración /etc/apache2/sites-available/domobois.conf escribimos:



Lo que se define en él es básicamente la URL de conexión desde donde se accederá a apache y la ruta donde está ubicado el script de conexión que conecta el apache con el proyecto de django. En él están definidos los parámetros de conexión. También se definen los permisos del directorio donde se encuentra el script de conexión. En este caso se dan permisos de acceso a la carpeta del apache que se definió al principio del documento. Se podrá acceder desde cualquier dirección con la directiva "Allow from all" y si el servidor es permitido con la directiva "Order allow, deny".

Con esta configuración todo el mundo podrá acceder al directorio del apache que creamos dentro del proyecto de django. Lo que voy a comentar ahora es un paso alternativo si queremos securizar o cerrar un poco más la configuración, pero no es necesario para que funcione.
El único usuario que es necesario que lea la configuración de dentro de la carpeta /var/www/domobois/domobois/apache es el usuario que utiliza apache, que por defecto es www-data. Idem para el grupo.
Cambiamos el propietario y grupo del directorio:
sudo chown -R www-data:www-data /var/www/domobois/domobois/apache


A continuación generamos el script de conexión "django.wsgi" que nos quedó pendiente.
Para ello, creamos y editamos el fichero:

sudo nano /var/www/domobois/domobois/apache/django.wsgi



 Para entendernos... Cuando un usuario hace una petición a la URL de la ip de la raspberry /domobois, apache lee el archivo domobois.conf del directorio sites-available, sabe que hay un script de conexión en la ruta /var/www/domobois/domobois/apache/django.wsgi y se va a leerlo con el usuario www-data. Este archivo es la conexión que le hace falta al apache para recuperar la aplicación de python y devolvérsela al usuario. A continuación mostramos un esquema.


Una vez definido el nuevo sitio, tenemos que activarlo en el apache y reiniciar la configuración. Para ello tenemos el comando:

sudo a2ensite

Nos preguntará que sitio queremos activar y le diremos que domobois.

Tal como nos dice el terminal, es necesario reiniciar apache para cargar la nueva configuración:

sudo service apache2 reload

Si intentamos acceder ahora mismo al sitio en red mediante la URL http://IPRASPBERRY/domobois
nos lanzará un error del estilo "error interno en el servidor: 500".


Para solucionarlo es necesario modificar el fichero /var/www/domobois/domobois/settings.py

Dentro de él se encuentra la directiva "ALLOWED_HOSTS", la que define que tipo de accesos se pueden tener en el proyecto de django. Para que funcione desde el exterior, es necesario permitir que apache, desde el propio servidor le deje hacer peticiones al proyecto de django, por lo que modificamos la línea y la dejamos de la siguiente manera:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

Volvemos a recargar la la página de la dirección  http://IPRASPBERRY/domobois y si todo funciona adecuadamente debería devolver el proyecto de django.
En mi caso como aún no tengo desarrollado el proyecto de django nos devuelve un error de path URL dado que como ya digo, no está desarrollado, PERO, sabemos que funciona.



Si no funciona, probad a recargar otra vez la configuración con: sudo service apache2 restart



Un consejo: Backup ahora que el servidor web funciona sin problemas

Archivos importantes a guardar... 
  1. /etc/apache2/sites-available/domobois.conf 
  2. /var/www/domobois/domobois/apache/domobois.wsgi
  3. /var/www/domobois/domobois/settings.py
O más a lo bruto, los directorios...
  1. /etc/apache2/
  2. /var/www/domobois

Comando para hacer backups (tar)
tar -cvf archivo.tar /dir/a/comprimir/
-c : indica a tar que cree un archivo.
-v : indica a tar que muestre lo que va empaquetando.
-f : indica a tar que el siguiente argumento es el nombre del fichero.tar.