PHP5 FastCGI con eAccelerator en Dreamhost sin compilar PHP

Autor: Armonth | El domingo 20 de enero del 2008 @ 14:46.

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 dominios 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 (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.

Comentarios