Mod_wsgi en Apache

20 Mayo 2011 at 16:34 by Adrián Pérez

PythonNo sé bien bien porqué (en realidad sí lo sé, pero no viene a cuento), me he visto peleando con instalando mod_wsgi en un servidor Apache (LAMP, para más señas).

Apache, para quién no lo conozca, es uno de los servidores web más populares que existen; es de código abierto y consta de un núcleo, y de varios módulos que le añaden funcionalidades (conexiones ssl, soporte para perl, php, asp, etc.). Así pues, cuando instalamos un servidor Apache, podemos instalar, además, únicamente los módulos que necesitemos, teniendo así, un servidor más seguro (al tener únicamente lo que necesitamos) y con mejor rendimiento.

Mod_wsgi es uno de estos módulos para Apache, que en este caso "permite servir aplicaciones hechas en Python, que tengan soporte para la interfaz WSGI". (Fuente).

Para instalar Mod_wsgi, he seguido los pasos oficiales:

  • Comprobar que tenemos Python instalado. Se puede ver la versión actual tecleando "Python -V". En mi caso, la 2.7.1. (Python viene instalado por defecto en Ubuntu).
  • Descargar mod_wsgi de la página oficial, mediante "wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz".
  • Descomprimir el archivo, mediante "tar -zxvf mod_wsgi-3.3.tar.gz".
  • Ejecutar el configurador, que se encuentra en el directorio mod_wsgi-3.3, mediante "./configure". Este paso, en mi caso, me ha devuelto los siguientes errores:

ubuntu@ubuntuadri:~/mod_wsgi-3.3$ ./configure
checking for apxs2... no
checking for apxs... no
checking Apache version... ./configure: line 1704: apxs: command not found
./configure: line 1704: apxs: command not found
./configure: line 1705: apxs: command not found
./configure: line 1708: /: Is a directory

checking for python... /usr/bin/python
./configure: line 1877: apxs: command not found
configure: creating ./config.status
config.status: error: cannot find input file: Makefile.in

Tal y como se comenta en la documentación oficial de instalación de mod_wsgi, estos errores pueden deberse a que el instalador no encuentra en sus rutas por defecto, tanto a apxs o apxs2, como a python. En mi caso, efectivamente, no tenía instalado apxs (lo he corroborado ejecutando "locate apxs"). Apxs (APache eXtenSion) es una herramienta que permite crear e instalar módulos de extensión en un servidor Apache. Más info aquí.

He continuado, tal y como sigue:

  • Buscando el paquete instalador de "apxs" mediante "sudo apt-cache search apxs", lo cual me ha devuelto 2 paquetes: apache2-prefork-dev y apache2-threaded-dev.
  • Descargando e instalando apache2-threaded-dev mediante "sudo apt-get install apache2-threaded-dev". NOTA: Este paquete ocupa 103MB una vez instalado.
  • Una vez instalado, ejecutando de nuevo el configurador de mod_wsgi, mediante "./configure", que esta vez sí ha devuelto lo esperado:

ubuntu@ubuntuadri:~/mod_wsgi-3.3$ sudo ./configure
checking for apxs2... /usr/bin/apxs2
checking Apache version... 2.2.17
checking for python... /usr/bin/python
configure: creating ./config.status
config.status: creating Makefile

  • Finalmente, ejecutando "make" para instalar el programa. Si no se tiene "make" instalado, se podrá instalar mediante "sudo apt-get install make". En mi caso, pero, esto ha devuelto errores:

ubuntu@ubuntuadri:~/mod_wsgi-3.3$ make
/usr/bin/apxs2 -c -I/usr/include/python2.7 -DNDEBUG mod_wsgi.c -L/usr/lib -L/usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm
/usr/share/apr-1.0/build/libtool --silent --mode=compile --tag=disable-static i686-linux-gnu-gcc -prefer-pic -DLINUX=2 -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_REENTRANT -I/usr/include/apr-1.0 -I/usr/include/openssl -I/usr/include/xmltok -pthread -I/usr/include/apache2 -I/usr/include/apr-1.0 -I/usr/include/apr-1.0 -I/usr/include/python2.7 -DNDEBUG -c -o mod_wsgi.lo mod_wsgi.c && touch mod_wsgi.slo
mod_wsgi.c:135:20: fatal error: Python.h: No such file or directory
compilation terminated.
apxs:Error: Command failed with rc=65536
.
make: *** [mod_wsgi.la] Error 1

  • Al parecer, no encuentra Python.h. Lo primero que he hecho, ha sido comprobar el path, para verificar que Python se encuentra en el path. Para verificar el path, he ejecutado "echo $PATH", y con "whereis python" he verificado que /usr/bin/python es un enlace simbólico a la última versión de Python, que se encuentra en /usr/bin/python2.7, y que se encuentra en el path.
  • Una vez verificado el path, he encontrado en la wiki de instalación de mod_wsgi, que por defecto, Python suele venir instalado, sin las cabeceras. Como en mi caso, he verificado que tengo la versión de Python 2.7, he instalado el paquete de desarrollo mediante "sudo apt-get install python2.7-dev". NOTA: Este paquete ocupa 14.1MB en disco, una vez instalado.
  • Una vez instalado, he podido ejecutar "make" para la instalación de mod_wsgi.
  • Posteriormente, y siempre siguiendo la documentación oficial, he ejecutado "sudo make install" (esta vez sí es necesario ejecutarlo con "sudo"). Esto ha instalado el módulo de Apache en la ruta estándar para los módulos de Apache.

Finalmente, se deberá cargar el módulo en Apache:

  • cd /etc/apache2
  • sudo cp httpd.conf httpd.conf.OLD
  • sudo vi httpd.conf
    • LoadModule wsgi_module modules/mod_wsgi.so
  • sudo apachect restart

En este momento, es posible que como a mi, te aparezca el siguiente error:

ubuntu@ubuntuadri:/etc/apache2$ sudo apachectl restart
apache2: Syntax error on line 207 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/httpd.conf: Cannot load /etc/apache2/modules/mod_wsgi.so into server: /etc/apache2/modules/mod_wsgi.so: cannot open shared object file: No such file or directory
Action 'restart' failed.
The Apache error log may have more information.

Para solucionarlo, he seguido estos pasos:

  • Buscar el archivo a cargar, mod_wsgi.so, con el comando "find / -name mod_wsgi".
  • Una vez ubicado, cambiar httpd.conf para incluir la ruta entera
    • LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
  • Ahora sí, reiniciar apache con "sudo apachect restart"

Para acabar, se podrá comprobar si se ha cargado correctamente el módulo, comprobando el archivo de logs de apache:

  • ubuntu@ubuntuadri:/var/log/apache2$ cat error.log

Lo cual devolverá una línea parecida a la siguiente:

[Fri May 20 11:11:24 2011] [notice] Apache/2.2.17 (Ubuntu) PHP/5.3.5-1ubuntu7 with Suhosin-Patch mod_wsgi/3.3 Python/2.7.1+ configured -- resuming normal operations

Para limpiar la instalación, bastará con un "make clean" ejecutado desde el directorio donde se encuentran los archivos de instalación de mod_wsgi.

Ahora ya se puede empezar con la configuración de mod_wsgi.

Flickr! Foto por Ryan Somma