Python 2.7 en CentOS 6 con mod_wsgi

5 junio 2013 at 19:12 by Adrián Pérez

python2En este post, veremos cómo instalar una nueva versión de Python (la 2.7.5) manteniendo la versión del sistema (2.6.6 en CentOS 6), forzando al mod_wsgi de Apache a usar la nueva versión en lugar de la de sistema. La idea es no tocar la versión de sistema, puesto que si cambiamos dicha versión, seguramente nos encontraremos más adelante con problema de dependencias en prácticamente cualquier actualización o instalación que queramos hacer con yum.

De esta manera, lo que haríamos sería hacer una segunda instalación de la nueva versión de Python, que no comprometiera la instalación original. En el ejemplo, estamos usando un servidor CentOS 6.4 que por defecto, viene con Python 2.6.6, con un servidor Apache con mod_wsgi 3.2. Lo que queremos, es instalar Python 2.7.5 sin comprometer el Python del sistema, instalar los módulos de Python necesarios para nuestra aplicación, pero únicamente para la nueva versión 2.7.5, y finalmente, reconfigurar mod_wsgi para usar la nueva versión.

Para ello, podríamos seguir los pasos descritos a continuación:

Entorno

Comprobamos los detalles del sistema operativo:

[root@MyServer]#cat /etc/redhat-release
CentOS release 6.4 (Final)

Verificamos la versión de python del sistema:

[root@MyServer]# python --version
Python 2.6.6

Y finalmente verificamos qué versión de Python está usando Apache, en el fichero de log del mismo. Si no aparece nada, podemos forzar un reinicio de Apache para que nos muestre los detalles:

[root@MyServer]# tail /var/log/httpd/error.log
[...]
[notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.2 <strong>Python/2.6.6</strong> configured -- resuming normal operations

Instalación alternativa de Python 2.7.5

A continuación, siguiendo los pasos descritos aquí, instalaremos la nueva versión de Python sin comprometer la actual. Para ello, primeramente nos aseguraremos de contar con las dependencias necesarias:

[root@MyServer]# yum groupinstall "Development tools"
[root@MyServer]# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

Descargaremos la última versión de Python de la web oficial, y la instalaremos, usando "make altinstall" en lugar del habitual "make install", lo cual es la clave para mantener ambas versiones funcionando.

[root@MyServer]# wget http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz
[root@MyServer]# ./configure --enable-shared --prefix=/usr/local
[root@MyServer]# make
[root@MyServer]# make altinstall

Deberemos tocar las variables de entorno para indicar la ubicación de Python 2.7:

[root@MyServer]# vi /etc/profile.d/custom.sh
export LD_LIBRARY_PATH=/usr/local/lib
export LD_RUN_PATH=/usr/local/lib/

Además de incluir las sentencias en el .profile para que se ejecuten siempre para cada usuario, las ejecutaremos manualmente para tenerlas ya disponibles en la sesión actual:

[root@MyServer]# export LD_LIBRARY_PATH=/usr/local/lib
[root@MyServer]# export LD_RUN_PATH=/usr/local/lib/

Finalmente, instalaremos distribute para nuestra nueva versión de Python, para disponer de easy_install  para nuestra nueva versión. Ésto nos instalará /usr/local/bin/easy_install-2.7:

[root@MyServer]# wget http://pypi.python.org/packages/source/d/distribute/distribute-0.6.44.tar.gz
[root@MyServer]# python2.7 setup.py install

Con easy_install-2.7 podremos obtener pip2.7 fácilmente:

[root@MyServer]# easy_install-2.7 pip

Módulos de Python

En el ejemplo, nuestra aplicación necesitará que Python importe una serie de módulos adicionales, que deberemos ejecutar precisamente con la versión de Python correcta. En el ejemplo, necesitaremos:

  • Redis-py
  • MySQL-python
  • Flask

Para realizar esta tarea, únicamente deberemos bajarnos los sources de las webs oficiales de cada módulo, descomprimirlo con "tar -zxvf" e instalarlo con el siguiente comando, en el que nos aseguramos de instalarlo con la nueva versión de Phyton:

[root@MyServer]# python2.7 setup.py install

Tras la instalación de los módulos, podremos verificar que los módulos instalados cargan de forma correcta, sin devolver errores:

[root@MyServer]# python2.7
>>> import flask
>>> import redis
>>> import MySQLdb
>>>

Reconfiguración de mod_wsgi

En este punto, tendremos Python 2.7.5 instalado en el sistema, sin comprometer la versión de Python actual. Faltará configurar mod_wsgi de Apacha para decirle que use la nueva versión.

Para ello descargaremos la última versión de mod_wsgi de la web oficial:

[root@MyServer]# wget http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz

Descompromiremos e instalaremos mod_wsgi indicándole la versión de Python a usar (si no estamos seguros de dónde está, podemos ejecutar "whereis python")

[root@MyServer]# tar -zxvf mod_wsgi-3.4.tar.gz
[root@MyServer]# cd mod_wsgi-3.4
[root@MyServer]# ./configure --with-python=/usr/local/bin/python2.7
[root@MyServer]# make
[root@MyServer]# make install
[root@MyServer]# chmod 755 /usr/lib64/httpd/modules/mod_wsgi.so

En mi caso, ha sido necesario instalar el paquete "httpd-devel.x86_64" para obtener "apxs", que me ha pedido durante el ".configure".

Finalmente, reiniciaremos Apache y verificaremos de nuevo, en el archivo error.log, la versión usada:

[root@MyServer]# /etc/init.d/httpd restart
[root@MyServer]# tail /var/log/httpd/error_log
[...]
[notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.4 <strong>Python/2.7.5</strong> configured -- resuming normal operations

Con ésto ya tendremos mod_wsgi de Apache configurado para usar Python 2.7.5, manteniendo la versión de Python del sistema y por tanto, sin comprometer la estabilidad del mismo.

 

Fuentes:

http://toomuchdata.com/2012/06/25/how-to-install-python-2-7-3-on-centos-6-2/

http://www.sdkit.com/2011/09/how-to-install-python-27-with-modwsgi_3.html

http://code.google.com/p/modwsgi/wiki/InstallationIssues

http://helloit.es/2011/05/mod_wsgi-en-apache/

Flickr! Foto por Roberto Verzo