Gravatar de Armonth

PHP5 FastCGI con eAccelerator en Dreamhost sin compilar PHP

Con la “desaparición de mod_php” en Dreamhost y el uso cada vez mayor de PHP 5 por parte de la gente se me está haciendo hasta normal recibir consultas de cómo compilar PHP con opciones adicionales como eAccelerator o APC.

Hace unos días me hicieron la última consulta y acabe cayendo en una cosa: si PHP se ejecuta como mod_php no hay mucho que hacer pero si lo hace como CGI (o FastCGI) ¿por qué no se debe poder usar tu propio php.ini?. Total es sólo un proceso más en el ordenador, independiente del servidor.

Justamente eso andaba buscando cuando encontré una forma sencilla de cargar PHP como CGI (FastCGI) al mismo tiempo que se compila eAccelerator y se pasa a usar tu propio php.ini, ¡y sin compilar PHP! (que es lo que más mata al personal).

Es posible que las versiones no sean las mismas, tened en cuenta que el artículo es de junio del año pasado aunque con versiones más recientes no (me ha) dado problemas.

Un apunte importante mod_php versus cgi/fastcgi

Como ya se advirtió en el artículo anterior al respecto, si se va al panel de dreamhost y se activa PHP4/PHP5 en lugar de “mod_php” se pierde la posibilidad de volver a mod_php el cual es 10 veces más rápido (consume de media 10 veces menos) que la versión CGI. Además de que con CGI pueden controlar tu consumo de CPU.

Si a eso le añadimos que pasar de CGI a FastCGI aumenta la velocidad entre 6 y 9 veces pero no siempre funciona en todos los servidores de DH lo mejor que podemos hacer es tener en cuenta este artículo sólo para sitios que:

  1. Requieran PHP 5 y/o eAccelerator (mod_php sólo está para PHP 4).
  2. Nuevos que no puedan optar a usar mod_php.
  3. Hayan perdido la posibilidad de usar mod_php.

Compilando e instalando dependencias

Lo primero es instalar autoconf y automake ya que son necesarios para compilar eAccelerator, también son necesarios libtool y m4 pero estos ya los usa Dreamhost.

mkdir $HOME/gnu
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.gz
tar -xvzf autoconf-2.61.tar.gz
cd autoconf-2.61
./configure –prefix=$HOME/gnu
make
make install
export PATH=$PATH:$HOME/gnu

wget http://ftp.gnu.org/gnu/automake/automake-1.9.tar.gz
tar -xvzf automake-1.9.tar.gz
./configure –prefix=$HOME/gnu
make
make install

Con esto ya tendremos instalados automake y autoconf en $HOME/gnu, además de que el export permitirá compilar eAccelerator encontrando las dependencias en los sitios habituales + $HOME/gnu.

Compilando e instalando eAccelerator

wget http://bart.eaccelerator.net/source/0.9.5.1/eaccelerator-0.9.5.1.tar.bz2
tar -xjf eaccelerator-0.9.5.1.tar.bz2
cd eaccelerator-0.9.5
export PHP_PREFIX=/usr/local/php5/bin
$PHP_PREFIX/phpize
./configure –prefix=$HOME/gnu –enable-eaccelerator-shared –with-php-config=$PHP_PREFIX/php-config
make
mkdir $HOME/phpini
mkdir $HOME/phpini/lib
cp modules/eaccelerator.so $HOME/phpini/lib

Nota: he corregido el último “cp” ya que guardaba el eaccelerator.so en phpini en lugar de phpini/lib y luego en el php.ini lo referenciaba a phpini/lib por lo que es un error.

Con esto ya tenemos eAccelerator compilado y guardado en $HOME/phpini/lib, ahora copiamos el php.ini:

cp /etc/php5/cgi/php.ini $HOME/phpini/php.ini

Modificando php.ini para el eAccelerator

Abrimos el php.ini y lo primero que modificaremos es el campo extension_dir para apuntar a /home/TU-USUARIO/phpini/lib.

Si no sabes que usuario tienes (antes podíamos usar la variable $HOME pero ahora no es recomendable) podemos verla con un echo $HOME.

Luego en el php.ini añadimos debajo de la sección “dynamic extensions” lo siguiente:

extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/home/TU-USUARIO/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="0"
eaccelerator.compress_level="9"

Apunte sobre compress_level=9 + compress = 0, no es completamente necesario ya que desactivamos la compresión pero es necesario si queremos hacer compresión de cache.

También hay que crear el directorio $HOME/tmp/eaccelerator donde se guardan los temporales:

mkdir -p $HOME/tmp/eaccelerator

¿Y por qué no usar eAccelerator con PHP CGI normal?

  1. Es un suicidio en CPU.
  2. eAccelerator no hace cache alguna si no es FastCGI.

Por último, activamos FastCGI

El sistema es casi igual a la vez anterior, nos vamos al dominio que queramos tener con FastCGI — ej: $HOME/tu-dominio — y creamos el fichero fastcgi.fcgi (según articulo) o php5-wrapper.fcgi (según documentación oficial de DH).

En él tenemos que añadir el siguiente código:

#!/bin/sh
export PHPRC=/home/TU-USUARIO/phpini
export PHP_FCGI_CHILDREN=3
exec /dh/cgi-system/php5.cgi

Como se puede ver, igualito que el anterior si obviamos el PHPRC que es la variable para que cargue nuestro php.ini en lugar del de dreamhost.

Guardamos y modificamos el .htaccess al principio del todo para que todas las peticiones PHP vayan al fichero fastcgi.fcgi:

AddHandler fastcgi-script fcg fcgi fpl
AddHandler php5-fastcgi .php
Action php5-fastcgi /fastcgi.fcgi
Options +ExecCGI

Luego matamos todos los procesos php5.cgi (killall php5.cgi) para que empiece a trabajar.

¿Funciona?

Toca crear un fichero phpinfo.php que contenga:

<?php phpinfo() ?>

Y abrirlo para ver si se ha creado una sección de eAccelerator. Si es así y además indica que hay scripts cacheados ya está funcionando.

Resumiendo

El proceso es igual que activar FastCGI sólo que le añadimos un php.ini personalizado, aprovechando esa circunstancia podemos añadir nuevas extensiones que toca compilar.

Ningún misterio pero altamente útil, a partir de ahí se pueden añadir todas las extensiones que se quieran (siempre que funcionen bajo FastCGI) compilando y añadiendo luego la información al php.ini, solamente hace falta matar los procesos php5.cgi.

9 Comentarios (feed)

  1. Gravatar de Samuel Samuel nos comenta:

    Duda:

    Se supone que php5-memcache hace lo mismo que eAccelerator no?. O al menos persiguen el mismo fin si no me equivoco.

    Si esto es así, ¿cual da mejores resultados en un servidor con poca memoria RAM disponible?.

    Domingo, 20 de Enero/2008 @ 20:32

  2. Gravatar de Armonth Armonth nos comenta:

    Buenas Samuel.

    Aunque no conozco a fondo ambos como para “hilar fino” creo que persiguen fines distintos:

    eAccelerator mantiene un cache de “bytecode”. Cuando se abre un script en PHP éste es “parseado” y compilado. eAccelerator mantiene una cache del código compilado. Luego comparte la cache ya sea por RAM o por disco.

    memcached sin embargo está más enfocado a cachear “objetos” y “datos” de una base de datos.

    Tal como lo veo y a riesgo de equivocarme el primero sirve para código PHP que va a ser compilado a menudo sin cambios en el resultado final (la parte binaria) mientras que el segundo es más para reducir la carga que provoca la base de datos.

    Sobre la pregunta de disco o RAM la segunda es más rápida pero más limitada así que si ya de entrada afirmas que tiene “poca” apostaba por grabar a disco, eAccelerator lo permite aunque no recuerdo si memcached también.

    Por último si tomamos como correcto “eAccelerator principalmente para PHP, memcached principalmente para MySQL” la elección se limita a preguntarse (y saber responder): ¿cual es el cuello de botella?.

    Lunes, 21 de Enero/2008 @ 1:44

  3. Gravatar de Chefwww Chefwww nos comenta:

    Pero esta modificación es para un servidor dedicado no? Que tal van estos?

    Martes, 22 de Enero/2008 @ 22:12

  4. Gravatar de Armonth Armonth nos comenta:

    Chefwww… no. Leelo bien que está enfocado a un compartido. Dreamhost no tiene actualmente servidores dedicados (tiene “algo raro” en que pagas por ciclos de CPU reservados pero no es un dedicado que administras al 100% por ti, VPN apartes…)

    Miércoles, 23 de Enero/2008 @ 1:15

  5. Gravatar de Camilo Camilo nos comenta:

    Armonth segui tus pasos al pie de la letra, casi que me dedique a copiar y pegar, pero al llegar al comando $PHP_PREFIX/phpize me salio el siguiente mensaje.

    Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF
    environment variable is set correctly and then rerun this script.

    que hice mal?

    Viernes, 25 de Enero/2008 @ 22:48

  6. Gravatar de Armonth Armonth nos comenta:

    Camilo parece que en tu servidor al intentar usar phpize se usa una variable: $PHP_AUTOCONF que no ha sido bien definida.

    No estoy del todo seguro pero supongo que con darle la ruta de dónde tienes el AUTOCONF compilado debería bastar, ejecuta antes del phpize:

    export PHP_AUTOCONF=$PHP_AUTOCONF:$HOME/gnu
    

    Viernes, 25 de Enero/2008 @ 22:54

  7. Gravatar de Camilo Camilo nos comenta:

    Armounth ya encontré el problema y lo solucione con el siguiente comando

    export PATH=$PATH:/$HOME/gnu/bin

    ahora lo que pasa es que no encuentro la sección “dynamic extensions” en el php.ini

    Sábado, 26 de Enero/2008 @ 7:35

  8. Gravatar de Armonth Armonth nos comenta:

    Busca otros php.ini por Internet, si no tienes esa sección solamente debes copiarla, es más: no tiene nada de especial: copia el código que tendría que ir debajo de “Dynamic Extensions” justo debajo de la sección de “Fopen Wrappers”.

    El php.ini de los servidores a menudo tiene los comentarios eliminados, puedes poner el código del eAccelerator justo debajo de:

    default_socket_timeout = 60
    

    Como si tal cosa…

    Sábado, 26 de Enero/2008 @ 10:53

  9. Gravatar de Camilo Camilo nos comenta:

    Gracias Armonth me toco meterle el “Dynamic Extensions” por que no estaba, ya termine de seguir tu tuto pero cuando edito el .htaccess y lo pongo a correr con fastcgi, no pasa nada, revise el phpinfo y al parecer es que todavía sigue usando el php.ini en /etc/php5/cgi y no en /home/camilo/ phpini/

    creo que por eso es la falla pero no se como hacer para que use mi php.ini modificado simplemente sigue usando el de dreamhost.

    Sábado, 26 de Enero/2008 @ 18:28

No seas tímido, da tu opinión

Sé respetuoso con los demás, la diferencia de opiniones enriquece la discusión, los comentarios bajo ciertas circunstancias pueden ser moderados y requerir aprobación.