En 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 Python/2.6.6 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 Python/2.7.5 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
https://helloit.es/2011/05/mod_wsgi-en-apache/
Foto por Roberto Verzo