Compilar módulo de Apache mod_python para Centos 7 / Redhat 7

Introducción.

Check_mk hasta ahora (dic 2014) continua usando el viejo módulo de python para Apache mod_python que está ya discontinuado. Es un módulo que empezaron a desechar ya hace tiempo las distribuciones en favor del módulo mod_wsgi que se ha impuesto por diversas razones. La nuevas versiones de las distros más populares no incluyen este módulo por lo que si lo necesitas tendrás que compilarlo tu mismo. Hasta que CMK no cambie de módulo python habrá que hacerlo…

Las pruebas realizadas son con SELINUX desactivado. Cuidado tambien con configurar Firewalld para que puedas acceder a tu puerto 80.

Compilar e instalar

Para instalar mod_python en nuestro Apache deberemos compilarlo. Necesitamos primero instalar los fuentes de apache ya que necesitamos un binario que se incluye en estos (apxs ). También necesitamos los fuentes de python y las herramientas de desarrollo habituales.

yum install httpd httpd-devel python-devel
yum groupinstall "Development Tools"

Bajamos el módulo de su página http://modpython.org/ . OJO. Necesario versión 3.5.x.
Lo descomprimimos y comenzamos con el proceso de compilación.

tar zxfv mod_python-3.5.0.tg
cd mod_python-3.5.0
./configure -with-apxs=/usr/bin/apxs

Antes de hacer el make debemos modificar un par de ficheros. Tenemos más información al respecto al final del artículo en “Referencias”.
src/Makefile. Añadiremos las lineas marcadas

ATENCION: Al menos la última vez que lo probé con CentOS Linux release 7.3.1611 no era necesario editar este fichero. Al hacerlo daba error en la compilación y funcionaba correctamente si no se editaba. Probad primero sin modificar.

version.c:
 @MP_GIT_SHA=$$(git describe --always); \
 echo > version.c ; \
 echo "/* THIS FILE IS AUTO-GENERATED BY Makefile */" >> version.c ; \
 echo "#include \"mp_version.h\"" >> version.c ; \
 include/mod_python.h include/psp_flex.h include/psp_parser.h \
 include/requestobject.h include/tableobject.h include/connobject.h \
 include/finfoobject.h include/hlistobject.h include/mp_version.h \
 include/_pspmodule.h include/psp_string.h include/serverobject.h \
 include/util.h \
 echo "const char * const mp_git_sha = \"$${MP_GIT_SHA}\";" >> version.c ; \

dist/version.sh. Comentamos alguna linea y añadimos otra modificada

Este si es necesario modificarlo.

#!/bin/sh
MPV_PATH="`dirname $0`/../src/include/mp_version.h"
MAJ=`awk '/MP_VERSION_MAJOR/ {print $3}' $MPV_PATH`
MIN=`awk '/MP_VERSION_MINOR/ {print $3}' $MPV_PATH`
PCH=`awk '/MP_VERSION_PATCH/ {print $3}' $MPV_PATH`
#GIT=`git describe --always`
#echo $MAJ.$MIN.$PCH-$GIT
echo $MAJ.$MIN.$PCH-

Ahora si, podemos acabar de compilar.

make
make install

Probando el módulo.

Para probarlo de forma sencilla seguimos las instrucciones de la siguiente página para realizar un test usando nuestra estructura por defecto de Apache. Añadimos en nuestro apache un directorio

mkdir /var/www/html/test
chown apache.apache /var/www/test

Creamos un nuevo fichero de configuración p.e. /etc/httpd/conf.d/test_mod_python.conf para manejar los ficheros .py

# FILE /etc/httpd/conf.d/test_mod_python.conf
<Directory /var/www/html/test> 
 AddHandler mod_python .py
 PythonHandler mptest 
 PythonDebug On 
</Directory>

Creamos un fichero en dicho directorio /var/www/html/test/mptest.py para realizar el test

# FILE /var/www/html/test/mptest.py
from mod_python import apache
def handler(req):
 req.content_type = 'text/plain'
 req.write("Hello World!")
 return apache.OK

Activamos en Apache en módulo de python. Creamos p.e.. un archivo /etc/httpd/conf.modules.d/01-mod_python.conf

# FILE /etc/httpd/conf.modules.d/01-mod_python.conf
LoadModule python_module modules/mod_python.so

Reiniciamos Apache.

systemctl restart httpd.service

Probamos acceder a la URI para obtener un “Hello Word!”
http://server/test/mptest.py

Referencias.

Si no se modifican los ficheros fuente según se indica no funcionará mod_python y nos encontraremos problemas en el error_log de Apache del tipo siguiente:

[Sun Dec 07 10:31:13.539980 2014] [:error] [pid 25070] make_obcallback: could not import mod_python.apache.\n
Traceback (most recent call last):
 File "/usr/lib64/python2.7/site-packages/mod_python/__init__.py", line 25, in <module>
 from . import version
 File "/usr/lib64/python2.7/site-packages/mod_python/version.py", line 3
 version = "fatal: Not a git repository (or any of the parent directories): .git
 ^
SyntaxError: EOL while scanning string literal
[Sun Dec 07 10:31:13.540476 2014] [:error] [pid 25070] make_obcallback: Python path being used "['/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages']".
[Sun Dec 07 10:31:13.540593 2014] [:error] [pid 25070] get_interpreter: no interpreter callback found.
[Sun Dec 07 10:31:13.540752 2014] [:error] [pid 25070] [client 192.168.164.1:55805] python_handler: Can't get/create interpreter.

La solución es la comentada en este artículo de aplicar los cambios en dos ficheros y está extraida del siguiente enlace.
http://www.yeboyzq.com/linux/ruanjiananzhuangweihu/495.html

Bajar el artículo en PDF: 

5 thoughts on “Compilar módulo de Apache mod_python para Centos 7 / Redhat 7

  1. Patricio

    Lo primero de todo felicitarte por tu blog, esta genial!
    Te comento mi situación estoy con la instalación de en Centos 7 de Nagios core 4 + PNP4Nagios + Check_mk + Nagvis. Pues voy siguiendo todos los pasos y cuando llego al Chech_mk lo instalo y todo correcto y cuando voy a verlo (entrando desde el navegador) me salta el aviso de:
    “Check_mk: Incomplete Apache2 installation. You need mod_python in order to run the web interface of check_mk. Please install mod_python and restart Apache.”
    Pues bien, me voy a la guía donde estoy comentando, me lo descargo, descomprimo, añado lo que dices en azul a los dos ficheros, make, make install, todo correcto. Pero cuando digo de probar el modulo…
    Realizo todos los pasos pero cuando llego al final y reinicio el servicio. Me dice:
    “job for httpd.service failed because the control process exited with error code. See systemctl status..”
    Y no me deja iniciar.
    Hago un status del httpd:
    [root@ptt-tosh03 conf.d]# systemctl status httpd.service
    ● httpd.service – The Apache HTTP Server
    Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since mar 2016-04-19 17:35:21 CEST; 1min 19s ago
    Docs: man:httpd(8)
    man:apachectl(8)
    Process: 47752 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
    Process: 47750 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
    Main PID: 47750 (code=exited, status=1/FAILURE)

    abr 19 17:35:21 ptt-tosh03.andamur.loc systemd[1]: Starting The Apache HTTP Server…
    abr 19 17:35:21 ptt-tosh03.andamur.loc httpd[47750]: AH00526: Syntax error on line 4 of /e…f:
    abr 19 17:35:21 ptt-tosh03.andamur.loc httpd[47750]: Invalid command ‘PythonHandler’, perh…on
    abr 19 17:35:21 ptt-tosh03.andamur.loc systemd[1]: httpd.service: main process exited, cod…RE
    abr 19 17:35:21 ptt-tosh03.andamur.loc kill[47752]: kill: cannot find process “”
    abr 19 17:35:21 ptt-tosh03.andamur.loc systemd[1]: httpd.service: control process exited, …=1
    abr 19 17:35:21 ptt-tosh03.andamur.loc systemd[1]: Failed to start The Apache HTTP Server.
    abr 19 17:35:21 ptt-tosh03.andamur.loc systemd[1]: Unit httpd.service entered failed state.
    abr 19 17:35:21 ptt-tosh03.andamur.loc systemd[1]: httpd.service failed.
    Hint: Some lines were ellipsized, use -l to show in full.

    Pues eso, tengo que borrar todo los ficheros y carpetas creados y después me deja levantar el servicio.
    No se si tendrá algo que ver, pero fui haciendo cada paso de las pruebas y reiniciando y justo cuando creo el /etc/httpd/conf.d/test_mod_python.conf me da el error.

    Un saludo,

    PD: el principio cuando creas la carpeta ../test luego dices de darle permisos, pues te falto poner la ruta bien
    mkdir /var/www/html/test
    chown apache.apache /var/www/html/test

    Reply
    1. eldespistado1 Post author

      Según el error: AH00526: Syntax error on line 4 of /e…f:
      abr 19 17:35:21 ptt-tosh03.andamur.loc httpd[47750]: Invalid command ‘PythonHandler’, perh…
      Podria ser un error de sintaxis en ese fichero de configuración de prueba o quizá directamente no encuentra el módulo de python. Buscarlo a ver si está y en el sitio correcto (mod_python)

      Reply
      1. eldespistado1 Post author

        Has activado el módulo en Apache correctamente. Tiene pinta de eso…

        Reply
          1. Patricio

            PRIMERO VEO SI LA CONFIGURACIÖN ESTA BIEN:
            [root@ptt-tosh03 html]# apachectl -t
            Syntax OK

            LOS MODULOS COMPILADOS ESTATICAMENTE:
            [root@ptt-tosh03 html]# /usr/sbin/httpd -l
            Compiled in modules:
            core.c
            mod_so.c
            http_core.c

            SE SUPONE QUE CON ESTE COMANDO SE VEN TODOS:
            [root@ptt-tosh03 html]# /usr/sbin/httpd -M
            Loaded Modules:
            core_module (static)
            so_module (static)
            http_module (static)
            access_compat_module (shared)
            actions_module (shared)
            alias_module (shared)
            allowmethods_module (shared)
            auth_basic_module (shared)
            auth_digest_module (shared)
            authn_anon_module (shared)
            authn_core_module (shared)
            authn_dbd_module (shared)
            authn_dbm_module (shared)
            authn_file_module (shared)
            authn_socache_module (shared)
            authz_core_module (shared)
            authz_dbd_module (shared)
            authz_dbm_module (shared)
            authz_groupfile_module (shared)
            authz_host_module (shared)
            authz_owner_module (shared)
            authz_user_module (shared)
            autoindex_module (shared)
            cache_module (shared)
            cache_disk_module (shared)
            data_module (shared)
            dbd_module (shared)
            deflate_module (shared)
            dir_module (shared)
            dumpio_module (shared)
            echo_module (shared)
            env_module (shared)
            expires_module (shared)
            ext_filter_module (shared)
            filter_module (shared)
            headers_module (shared)
            include_module (shared)
            info_module (shared)
            log_config_module (shared)
            logio_module (shared)
            mime_magic_module (shared)
            mime_module (shared)
            negotiation_module (shared)
            remoteip_module (shared)
            reqtimeout_module (shared)
            rewrite_module (shared)
            setenvif_module (shared)
            slotmem_plain_module (shared)
            slotmem_shm_module (shared)
            socache_dbm_module (shared)
            socache_memcache_module (shared)
            socache_shmcb_module (shared)
            status_module (shared)
            substitute_module (shared)
            suexec_module (shared)
            unique_id_module (shared)
            unixd_module (shared)
            userdir_module (shared)
            version_module (shared)
            vhost_alias_module (shared)
            dav_module (shared)
            dav_fs_module (shared)
            dav_lock_module (shared)
            lua_module (shared)
            mpm_prefork_module (shared)
            proxy_module (shared)
            lbmethod_bybusyness_module (shared)
            lbmethod_byrequests_module (shared)
            lbmethod_bytraffic_module (shared)
            lbmethod_heartbeat_module (shared)
            proxy_ajp_module (shared)
            proxy_balancer_module (shared)
            proxy_connect_module (shared)
            proxy_express_module (shared)
            proxy_fcgi_module (shared)
            proxy_fdpass_module (shared)
            proxy_ftp_module (shared)
            proxy_http_module (shared)
            proxy_scgi_module (shared)
            proxy_wstunnel_module (shared)
            systemd_module (shared)
            cgi_module (shared)
            fcgid_module (shared)
            php5_module (shared)

            Y por aquí no tenemos el mod_phyton ejecutandose.
            (ahora mismo lo tengo tengo todos los ficheros borrados, desde el punto que te dice “probando el modulo”).
            SI hago un -> apachectl -t -D DUMP_MODULES | grep -i python
            no me muestra nada.
            Algo me falta…. .

            Gracias por la repuesta tan rápida.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Comment moderation is enabled. Your comment may take some time to appear.