# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

pecl: configure: error: cannot run C compiled programs

El error que podemos recibir al instalar un módulo de PHP (concretamente Oauth) a través de pecl es el siguiente:

# pecl install -R /usr/lib/php oauth
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading oauth-1.1.0.tgz ...
Starting to download oauth-1.1.0.tgz (44,731 bytes)
............done: 44,731 bytes
6 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
building in /var/tmp/pear-build-root/oauth-1.1.0
running: /usr/lib/php/root/tmp/pear/oauth/configure
checking for egrep... grep -E
checking for a sed that does not truncate output... /bin/sed
checking for cc... cc
checking for C compiler default output file name... a.out
checking whether the C compiler works... configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details.
ERROR: `/usr/lib/php/root/tmp/pear/oauth/configure' failed

El error nos indica que no podemos ejecutar la compilación, en este caso es debido a que tenemos securizada la partición /tmp y no permitimos la ejecución en ella, pecl compila ahí de forma temporal el módulo.

# mount | grep ^/tmp
/tmp on /var/tmp type ext3 (rw,noexec,nosuid,bind)

Lo que vamos a hacer es una solución temporal, montamos /tmp con los requerimientos para poder hacer la compilación y después revertimos el cambio:

# mount -o remount,exec,suid /tmp
# pecl install -R /usr/lib/php oauth
# mount -o rw,noexec,nosuid,bind /tmp

Otra opción más segura y que evita tener que modificar el sistema de archivos /tmp es la que Santi nos ofrece en su comentario, exportamos la variable TMP a un lugar dentro de una partición con exec permitido e instalamos:

# mkdir -p /root/temporal
# export TMP=/root/temporal
# pecl install oauth

configure: error: libpng.(a|so) not found (compilando PHP con 64 bits)

Una entrada rápida para ayudar a aquellos que reciban este error (configure: error: libpng.(a|so) not found) a la hora de configurar la compilación de PHP en un servidor con arquitectura de 64 bits. El error aparecerá cuando añadimos el módulo de librerías GD a la compilación (

--with-gd

). Lo primero que tenemos que hacer es verificar que tenemos instalados los paquetes devel de libpng y libjpeg. Podéis instalarlos por apt o yum según la distribución:

$ yum install libpng-devel.x86_64
$ yum install libjpeg-devel.x86_64

Nota: quizás también sea necesario instalar el devel de GD, ahora no lo recuerdo.

Si pese a instalar estos paquetes seguís recibiendo el mismo error, probablemente es porque a la hora de hacer el configure no encuentra el lugar donde están las librerías (por ser de 64 bits). Entonces la solución será especificar que es un sistema de 64 bits y sus librerías con el parámetro

--with-libdir=lib64

Quedaría algo así (+ los módulos que instaléis además de GD):

$ ./configure --with-gd --with-libdir=lib64

Cómo compilar Apache y PHP en Linux

En este artículo voy a explicar los pasos básicos para compilar Apache y PHP (con soporte para MySQL y otros módulos) en GNU/Linux, concretamente bajo RHEL, aunque se puede aplicar a cualquier distribución (CentOS, Fedora, Debian, etc).

Lo primero que tenemos que comprobar es que tengamos instalados los compiladores necesarios (C / C++…) para poder empezar a trabajar, en RHEL y CentOS podemos instalarlos por yum, y en Debian y similar por apt:

# yum install gcc gcc-c++ autoconf make automake

Compilar Apache

Para compilar Apache lo primero que debemos hacer es bajarnos las fuentes de la versión que queramos instalar. En este caso vamos a bajar la última versión estable de la rama 2.2, la 2.2.17:

# wget http://apache.rediris.es//httpd/httpd-2.2.17.tar.gz

Descomprimimos (podéis hacerlo en el directorio /usr/src/ destinado a las fuentes o en donde más rabia os dé):

#  tar -xzvf httpd-2.2.17.tar.gz

Nos ubicamos en la ruta donde hayamos descomprimido las fuentes:

# cd /usr/src/httpd-2.2.17

Ya estamos listos para comenzar a configurar nuestra instalación. El primer paso de toda compilación es el script configure, básicamente es el momento en el que podemos personalizar como queramos nuestra instalación (lugar donde instalar apache, módulos a compilar, cómo cargar esos módulos, etc) también se realizan ciertos chequeos para verificar que la compilación se puede realizar correctamente.

Para ver todas las posibilidades que nos ofrece la configuración, siempre tendremos que ejecutar la ayuda, resultaría tedioso explicar aquí todas las opciones de compilación así que nos vamos a centrar en una instalación básica, para personalizar vuestras instalaciones:

# ./configure --help

Bien, en nuestro caso la línea de configure va a ser la siguiente:

# ./configure --prefix=/usr/local/apache --enable-headers --enable-rewrite --enable-expires --enable-so --disable-authz-default
  • –prefix=<ruta> será la ruta en la que vamos a instalar Apache, en este caso /usr/local/apache.
  • –enable-MODULO: para la activación de módulos utilizamos este parámetro. En la línea de configuración vemos que hemos activado mod_rewrite, mod_headers y mod_expires. Si no especificamos nada, los módulos se cargan de forma estática, para cargarlos de forma dinámica (DSO, explicado en el siguiente punto) utilizamos –enable-MODULO=shared.
  • –enable-so Permitimos a Apache cargar módulos compartidos (Dynamic Shared Object (DSO)), php será uno de ellos. Esta opción también nos permitirá añadir nuevos módulos sin necesidad de recompilar y de forma dinámica (añadiendo simplemente el módulo mediante “Load Module” en la configuración). Los modulos que añadamos a través de esta línea de compilación, y sin especificar shared se instalarán de forma estática.
  • –disable-MODULO: He puesto un ejemplo de deshabilitar un módulo en la línea de compilación para que veáis que se pueden deshabilitar módulos (por defecto Apache carga algunos módulos que quizás no te interesen), en el ejemplo desactivamos authz-default

Una vez que tengamos claro que queremos y que no queremos instalar, podemos construir nuestra compilación, para ello simplemente ejecutamos make (según la cantidad de módulos que hayas configurado le puede costar un rato, puedes ir a tomar un café mientras ;) ):

# make

Y una vez que haya terminado, finalizamos la compilación e instalamos apache:

# make install

Cuando haya terminado ya podemos probar nuestra instalación de apache, lo arrancamos:

# /usr/local/apache/bin/apachectl start

Si accedemos vía web, por ejemplo desde la IP del servidor o el host que tenga configurado, deberíamos visualizar lo siguiente:

It works!

Cómo actualizar Apache

La actualización por compilación de fuentes es bastante sencilla. Simplemente tendríamos que seguir este mismo proceso, pero en el punto del configure apache nos lo pone más fácil. En la ruta /usr/local/apache/build encontraréis un fichero llamado config.nice que guarda vuestros parámetros de compilación, con lo que podéis usar dicho fichero en lugar de crear un nuevo configure. El proceso sería entonces, bajar las fuentes de la nueva versión y:

# ./config.nice
# make
# make install

Nota: Los ficheros de configuración, logs y documentos no se sobreescribirán durante la actualización.

Compilar PHP

Ahora que ya tenemos Apache funcionando, es hora de instalar PHP. Vamos a seguir el mismo procedimiento que para compilar Apache. En este caso vamos a instalar PHP con soporte para MySQL y algún otro módulo que veremos más adelante.

Empezamos descargando las fuentes desde el sitio web de PHP. En este caso la última versión estable de la rama 5.3, la 5.3.6. De nuevo nos colocamos en el directorio src o donde queráis trabajar mientras instalamos:

# cd /usr/sr
# wget http://es2.php.net/get/php-5.3.6.tar.gz/from/es.php.net/mirror

Descomprimimos y nos colocamos dentro del directorio:

# tar -xzvf php-5.3.6.tar.gz
# cd php-5.3.6

Ahora, al igual que con Apache llega el momento de crear la línea de configuración, el configure. Del mismo modo podemos seleccionar la ruta de instalación, los módulos y una buena cantidad de parámetros para personalizar nuestra instalación. Es imprescindible pues revisar la ayuda:

# ./configure --help

Una vez que tenemos claro que y como queremos instalar, comenzamos con el configure:

# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql --enable-ftp --disable-pdo --disable-ctype

Pasamos a explicar esta línea de configure:

  • –prefix: al igual que con Apache especificamos la ruta en la que instalaremos php.
  • –with-config-file-path: especificamos la ruta donde se encontrará el fichero de configuración php.ini.
  • –with-apxs2: como vamos a compilar php como módulo dinámico (DSO) updatede apache especificamos la ruta a apxs.
  • –with-libxml2: para evitar el error provocado porque la compilación no encuentra xml2-config necesitaremos tener instalado libxml2-devel (yum install libxml2-devel. El error es configure: error: xml2-config not found. Please check your libxml2 installation.
  • –with-mysql: habilitamos soporte para MySQL. Por supuesto, antes de habilitar cualquier extensión, si depende de algún programa hay que instalarlo antes, en este caso el cliente MySQL y las headers (paquete devel):
    yum install mysql mysql-devel
  • –enable-ftp: habilitamos soporte para FTP. Podemos habilitar cualquier otro módulo con –enable-MODULO
  • –disable-pdo: deshabilitamos el soporte para PDO. Podemos deshabilitar cualquier otro módulo con –disable-MODULO

Una vez seleccionados los módulos a instalar y las opciones correspondientes podemos comenzar a compilar (puede tardar un rato):

# make

Si todo ha ido bien y no hemos recibido errores podemos finalizar la instalación:

# make install

Una vez instalado automáticamente habrá añadido la carga del módulo en nuestra configuración de apache (fichero httpd.conf):

LoadModule php5_module modules/libphp5.so

Ahora solo nos queda indicar a Apache como tiene que interpretar los ficheros php, tenemos que añadir la siguiente línea dentro del fichero httpd.conf. Podemos añadirla junto a los demás AddType, buscadlos y colocadla debajo:

AddType application/x-httpd-php .php

Ahora solo queda reiniciar apache y verificar el funcionamiento de php. Antes comprobamos que la sintaxis del fichero de configuración httpd.conf es correcta:

# /usr/local/apache/bin/apachectl configtest
Syntax OK

Reiniciamos apache:

# /usr/local/apache/bin/apachectl restart

Podemos crear un fichero de pruebas en php para verificar todos los parámetros y módulos de la instalación de php, el contenido es el siguiente:

<? phpinfo(); ?>

Lo colocamos en el DocumentRoot por defecto, en nuestro caso es /usr/local/apache/htdocs y lo ejecutamos desde el navegador, el resultado es el siguiente, ya tenemos Apache y php operativo:

php 5.3.6

Instalar módulo OAuth de PHP en cPanel/WHM

En cPanel, desde EasyApache no existe la posibilidad de instalar el módulo de PHP OAuth. Para instalarlo debemos hacerlo a través de PHP Pecl. La instalación es sencilla, tenéis que acceder a WHM (puerto 2086) y entrar en “Module Installers” –> “Manage PHP Pecl”. Una vez dentro buscáis el módulo OAuth y lo instaláis.

Si recibís el siguiente error en el proceso de compilación, tendréis que instalar pcre y pcre devel, en CentOS y RHEL:

/usr/include/php/ext/pcre/php_pcre.h:29:18: error: pcre.h: No such file or directory
# yum install pcre-devel.i386 pcre.i386

Otra opción, es hacerlo desde línea de comandos:

# pecl install -R /usr/lib/php oauth

suPHP 0.7.1: SecurityException in Application.cpp:511: Unknown Interpreter: php

Hoy he estado actualizando un equipo. Una de las actualizaciones era la de la versión de suPHP a la 0.7.1. La actualización ha ido bien hasta que he comenzado a probar los sitios web.

Todos recibían un error 500 (Internal Server Error), típico de suPHP, y en los logs se volcaba la siguiente información:

[Sun Oct 17 19:08:03 2010] [error] [client XX.XX.XXX.XX] SecurityException in Application.cpp:511: Unknown Interpreter: php
[Sun Oct 17 19:08:03 2010] [error] [client XX.XX.XXX.XX] Premature end of script headers: index.php

En este momento ya había entrado en modo pánico, pero rebuscando por Internet información sobre esta versión, he visto que había un pequeño cambio o bug (bueno, pequeño…) por el cual, en el fichero de configuración de suPHP (/etc/suphp.conf) los handlers tenían que ir entre comillas:

Antes:

;Handler for php-scripts
x-httpd-php=php:/usr/bin/php-cgi

;Handler for CGI-scripts
x-suphp-cgi=execute:!self

Después:

;Handler for php-scripts
x-httpd-php="php:/usr/bin/php-cgi"

;Handler for CGI-scripts
x-suphp-cgi="execute:!self"

Tras este cambio, y reiniciar apache todo ha vuelto a funcionar a la normalidad.

Instalar php-mcrypt y php-mbstring para PHP 5.2.10 con yum

Hace unos meses vimos como Instalar php 5.2.10 a través de YUM en CentOS. Ahora necesitamos instalar un par de extensiones, php-mcrypt y php-mbstring que no están disponibles en el repositorio para esta versión en concreto. Si instalamos las del repositorio base nos encontraremos con errores e incompatibilidades (son para la rama 5.1.X).

La solución es recurrir al repositorio testing de Centos 5, donde podemos instalar las versiones disponibles para 5.2.9 y 5.2.10 respectivamente que sí que son compatibles.

Instalar php-mcrypt con yum:

# yum --enablerepo=c5-testing install php-mcrypt

Instalar php-mbstring con yum:

# yum --enablerepo=c5-testing install php-mbstring



Ocultar la versión de PHP

Algo importante en la seguridad de servidores web es ofrecer siempre la menor cantidad de información acerca de las versiones del software instalado en el servidor. Hace ya bastante tiempo vimos cómo ocultar o enmascarar la versión de Apachela versión de Bind.

En este caso vamos a ocultar la versión de PHP, es extremadamente sencillo. Únicamente hay que editar el fichero de configuración general php.ini y modificar el siguiente parámetro a Off:

expose_php Off

Ya podemos verificar que al hacer la petición contra el sitio web la información PHP ya no se muestra:

# telnet servidor 80

Connected to xxx.com (xx.xx.xx.xx).
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 13 Aug 2010 14:18:09 GMT
Server: Apache
Last-Modified: Fri, 12 Feb 2010 12:22:56 GMT
ETag: "44967c-6f-53ca4800"
Accept-Ranges: bytes
Content-Length: 111
Connection: close
Content-Type: text/html

Connection closed by foreign host.

Instalar php 5.2.10 a través de YUM en CentOS

Una de las formas más cómodas de instalar servicios y aplicaciones en CentOS es a través del gestor de paquetes YUM. Esto tiene sus desventajas, porque muchas veces las versiones de las aplicaciones no son todo la actuales que necesitamos.

En el caso de php, en CentOS 5.4 sigue instalandose la rama 5.1 con los repositorios por defecto. Podríamos instalar la nueva versión con paquetes RPM precompilados o compilando a mano pero yo soy partidario de unificar todo con un mismo sistema para evitar problemas y simplificar el funcionamiento de el conjunto de aplicaciones. La idea del repositorio testing la encontré en un comentario de este artículo en inglés.

El repositorio que tiene esta versión actualizada de PHP es CentOS-5 Testing así que solamente tendremos que instalarlo. Para ello creamos el fichero correspondiente en la carpeta de repositorios:

# vim /etc/yum.repos.d/centos-test.repo

El contenido:

[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/5/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing

Ahora si hacemos un yum info de php veremos que podemos instalar la versión 5.2.10 (en este caso pone que ya está instalada porque yo ya lo hice):

# yum info php
Loaded plugins: fastestmirror, priorities
Determining fastest mirrors
 * addons: sunsite.rediris.es
 * base: sunsite.rediris.es
 * extras: sunsite.rediris.es
 * updates: sunsite.rediris.es
addons                                                   |  951 B     00:00
base                                                     | 2.1 kB     00:00
c5-testing                                                                                                                                                     | 1.9 kB     00:00
extras                                                                                                                                                         | 2.1 kB     00:00
updates                                                                                                                                                        | 1.9 kB     00:00
450 packages excluded due to repository priority protections
Installed Packages
Name       : php
Arch       : i386
Version    : 5.2.10
Release    : 1.el5.centos
Size       : 3.1 M
Repo       : installed
Summary    : The PHP HTML-embedded scripting language
URL        : http://www.php.net/
License    : PHP
Description: PHP is an HTML-embedded scripting language. PHP attempts to make it
           : easy for developers to write dynamically generated webpages. PHP also
           : offers built-in database integration for several commercial and
           : non-commercial database management systems, so writing a
           : database-enabled webpage with PHP is fairly simple. The most common
           : use of PHP coding is probably as a replacement for CGI scripts.
           :
           : The php package contains the module which adds support for the PHP
           : language to Apache HTTP Server.

Así que solo queda instalarlo:

# yum install php

Recomiendo una vez hecho esto activar las prioridades de repositorios para evitar que otros paquetes que no sean php se instalen a través de este repositorio. Vamos a dar preferencia al repositorio base de centos.

# yum install yum-priorities

Una vez instalado damos al repositorio de centos base prioridad 10 y al testing 20. Añadimos lo siguiente a cada uno de los apartados entre corchetes del fichero /etc/yum.repos.d/CentOS-Base.repo

 /etc/yum.repos.d/CentOS-Base.repo

Ejemplo:

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=10

Y para el repositorio de Testing:

/etc/yum.repos.d/centos-test.repo
[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/5/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
priority=20