Todos los que tengan que configurar PHP en un servidor web, alguna vez se habrán visto en el dilema de qué manejador o handler de PHP elegir.

Y para poder elegir, hay que entender cómo funcionan los manejadores de PHP.

Para que funcione un sitio con PHP, el servidor debe poder interpretar el código PHP y generar una página cuando el sitio web sea visitado. El server interpreta el código de acuerdo a la librería PHP que decidamos usar, como PHP 5.3, 5.4, 5.5…

Un handler de PHP es el componente que carga estas librerías en memoria para poder interpretar los scripts.

Hay unas cuantas variantes disponibles de handlers de PHP. Distintas implementaciones donde cada una tiene sus ventajas y desventajas. Elegir la correcta según el destino que vayamos a darle al servidor, será una de las claves que decidan si funcionará óptimamente o no tanto.

Así que hoy quería compartirles este resumen para entender para qué sirve cada uno. Y en qué situaciones son útiles. Repasemos:

Mod_php (DSO: Dynamic Shared Object)

mod_php es un módulo de Apache para ejcutar scripts PHP:

  • Ejecuta PHP de una forma persistente, al igual que con fastcgi.
  • Todos los procesos de PHP se ejecutan como el usuario de Apache: «nobody».
  • Mantiene los procesos en funcionamiento constante en lugar de iniciarlos, ejecutar y cerrarlos.
  • Puede ocasionar problemas de permisos de archivos debido a que los archivos pertenecen al usuario «nobody». Los archivos que se suban al servidor pertenecen a dicho usuario, y tienen los mismos privilegios del sistema, lo que lo hace vulnerable a intentos de hacking. Además, suelen fallar las actualizaciones de aplicaciones como WordPress debido a este manejo de los permisos.
  • Los motores de caché opcode como APC y eAccelerator funcionan bien con mod_php gracias a que mantiene los workers abiertos y con conexiones persistentes.
  • mod_php es el handler más veloz. Más que CGI, fastCGI, y mod_suphp.
  • Si en un servidor que use DSO se desea migrar a suPHP, se debe tener especial cuidado luego de la migración, para configurar correctamente los nuevos permisos. cPanel tiene un tutorial para migrar de DSO a suPHP.

CGI

  • CGI ejecuta los scripts PHP como módulo CGI en lugar de como módulo de Apache.
  • Al ser CGI, los scripts se ejecutan por default bajo el usuario de Apache, «nobody».
  • Si también instalamos suexec, los scripts se ejecutarán como el usuario del sitio web o cuenta de usuario, lo cual nos dará la tranquilidad de poder conocer el usuario detrás de cada ejecución PHP.
  • CGI es lento comparado con modphp, porque PHP debe iniciarse y detenerse para cada petición.
  • Las soluciones de caché opcode NO FUNCIONAN con CGI.
  • No es un método seguro, de acuerdo a la documentación al respecto de cPanel.

suPHP (single user PHP)

suPHP es un módulo de Apache (mod_suphp) y también ejecuta los scripts PHP como CGI.

  • suPHP no necesita configurarse por cada virtual host.
  • Ejecuta los scripts PHP con los permisos del usuario propietario.
  • suPHP es mucho más lento que mod_php e incluso que CGI. Sin embargo, podría ser más veloz que suexec.
  • suPHP es fácil de configurar y es seguro en el sentido de que permite seguir la pista de qué usuario ejecutó qué script. Esto lo hizo muy popular como configuración predeterminada en hostings que usen el glorioso sistema cPanel; es a prueba de novatos.
  • Por lo anterior, todo los archivos que lleguen al servidor mediante uploads o bien por actualizaciones de aplicaciones, tendrán ya los permisos correctos. Por ejemplo, las uploads en WordPress no funcionan bien si el server no cuenta con suPHP o FastCGI.
  • Cualquier script PHP que no pertenezca al usuario del dominio, no puede ejcutarse. Lo mismo ocurre con archivos que tengan permisos de escritura para todo el mundo (777), no pueden ser ejecutables. Esto limita mucho la posibilidad de que un sitio web comprometido pueda afectar a sus vecinos del servidor.
  • Dado que suPHP ejecuta un proceso PHP con cada petición, no puede funcionar con cacheadores opcode como APC o eAccelerator. Además, suPHP no soporta FastCGI.
  • Consume bastante más CPU y RAM por proceso, AUNQUE no consume esos recursos cuando no hay visitas en las páginas PHP. Esto lo hace ideal para usar en servidores con poco tráfico.

FastCGI (fcgi)

Docs :

mod_fastcgi es un módulo de Apache que usa FastCGI para ejecutar los scripts PHP.

  • FasCGI es más veloz que CGI y casi tan rápido como modphp.
  • También ejecuta los scripts como «nobody».
  • Ahorra mucho consumo de CPU pero usa más memoria porque mantiene los procesos PHP abiertos como tarea de fondo para procesar peticiones a demanda, en lugar de iniciar nuevos procesos cada vez.
  • Puede usarse con cacheadores opcode como APC y eAccelerator gracias a que mantiene los procesos de forma persistente.

Suexec

Suexec es un módulo de Apache (mod_suexec) que le permite a los scripts CGI ejecutarse como un usuario en particular.

  • Suexec requiere tener un usuario configurado en cada virtual host.
  • Suexec es más lento que mod_php y mod_suphp.
  • Puede funcionar con mod_fastcgi.

Conclusiones:

  • Modphp (DSO) es la opción ideal para sitios web de tráfico moderado Y que no compartan servidor con sitios web de otros usuarios.
  • suPHP es mejor para sitios con bajo nivel de tráfico.
  • Y para sitios de alto tráfico, FastCgi debería ser la primer opción a considerar, dado que puede manejar múltiples peticiones mejor que el resto, y proveer una mejor seguridad.
  • suPHP y fastcgi son más seguros comparados con mod_php y CGI.

handlers1

 

Dónde cambiar los handlers de PHP en cPanel

cPanel hace muy fácil estas configuraciones. Simplemente necesitamos tener acceso al panel WHM de nuestro VPS o Dedicado, y yendo al menú Main > Service Configuration > Configure PHP and SuExec, encontraremos las opciones necesarias para configurarlo en segundos.

Simplemente elegimos el handler de PHP que deseemos desde el menú desplegable y guardamos la configuración.

Si el handler no está presente en la lista, es que no se compiló en el servidor. Para eso hay que configurarlo en «Easy Apache» y recompilar el servidor.