Cómo procesar páginas web PHP con Nginx y FPM

Conocimiento pertenece al mundo
Tweet about this on TwitterShare on FacebookShare on LinkedInShare on Google+Share on StumbleUponShare on TumblrShare on RedditPin on PinterestEmail this to someone

Las páginas web estáticas están bien cuando lo que queremos es ofrecer a los usuarios un contenido que nunca va a cambiar, que siempre va a ser el mismo. Sin embargo, hoy en día la mayoría de las páginas web son webs dinámicas, que constantemente están recibiendo nuevo contenido y que este cambia constantemente. Añadir contenido dinámico a una web HTML+CSS es muy complicado, por lo que para ello se suele utilizar otro lenguaje web llamado PHP.

Por defecto Nginx no es capaz de procesar páginas web dinámicas con PHP, por lo que requiere el uso de complementos adicionales específicos para dicho fin. Uno de estos complementos es FPM (FastCGI Process Manager), una implementación alternativa a FastCGI con varias características adicionales útiles para sitios web con mucho tráfico.

Algunas de las características principales de FPM son:

  • Es muy sencillo de arrancar y detener el servicio.
  • Posibilidad de iniciar varios hilos con diferentes identificadores.
  • Registro stdout y stderr.
  • Se reinicia automáticamente ante un fallo de caché.
  • Registro de scripts que pueden ralentizar la web.
  • Función fastcgi_finish_request() para detener y descargar datos mientras se llevan a cabo procesos más pesados.
  • Permite la creación dinámica o estática de hilos.
  • Su configuración se basa en php.ini.

Cómo instalar y controlar el demonio FPM

Lo primero que tenemos que hacer es haber instalado y configurado previamente el servidor web Nginx. Una vez hecho, debemos instalar el complemento PHP, así como la base de datos MySQL para que este empiece a funcionar.

Para ello, desde nuestro terminal, ejecutamos:

  • sudo apt install php5-fpm php5-mysql

Instalar FPM

Una vez instalado el complemento nuestro servidor ya estará listo para procesar peticiones PHP, aunque antes tendremos que configurar FPM para que funcione correctamente en nuestra web.

Antes de entrar en materia de configuración, indicar que en caso de tener que controlar el demonio de PHP tendremos que utilizar los siguientes comandos:

  • sudo service php5-fpm start/stop/restart

Cómo configurar y cargar una web PHP con FPM

El fichero de configuración de FPM se encuentra en /etc/php5/fpm/pool.d/www.conf, por lo que en caso de querer modificar alguna de sus opciones debemos teclear en el servidor:

  • sudo nano /etc/php5/fpm/pool.d/www.conf

Configuracion wwwconfAunque las opciones que vienen por defecto nos pueden servir para hacer un uso del servidor, algunas de las opciones que podemos modificar son:

  • Usuario y grupo sobre el que se ejecutará FPM.
  • Socket desde el que escuchará las peticiones.
  • Prioridad del proceso.
  • Número de procesos hijo que se crearán.
  • Peticiones máximas para cada proceso.

En este fichero, lo que debemos asegurarnos es que la línea “listen” sea listen = /var/run/php5-fpm.sock en lugar de hacer referencia a localhost.

A continuación, vamos a ver el fichero de configuración global de PHP. Este fichero se encuentra en /etc/php5/fpm/php.ini, por lo que para editarlo debemos teclear:

  • sudo nano /etc/php5/fpm/php.ini

En él vamos a encontrar un gran número de opciones y configuraciones diferentes, en las cuales no vamos a profundizar ya que en la mayoría de los casos no son necesarias. Lo que sí vamos a indicar es que, por motivos de seguridad, debemos buscar la línea “cgi.fix_pathinfo” y cambiar el valor por defecto “1” por “0”.

Configuracion phpini

Con esto ya tendríamos la parte de PHP configurada, aunque antes de continuar también debemos configurar Nginx para que sea capaz de reconocer y procesar este tipo de webs.

Cómo configurar Nginx para procesar páginas PHP

Una vez configurado el módulo de PHP ahora solo nos queda añadir a la configuración de Nginx las instrucciones necesarias para procesar contenido PHP. Para ello, siguiendo las reglas de configuración de Nginx, nos desplazamos hasta la configuración específica de nuestra web (default) y la editamos con:

  • sudo nano /etc/nginx/sites-available/default

Aquñi, en el apartado “index” debemos añadir: index.php. El orden de la lista de archivos “index” marcará la prioridad. Por ejemplo, si el primero de la lista es el “html” y este no existe, intentará cargar el siguiente “htm” y, si no existe, el siguiente “php” en nuestro caso.

También debemos añadir (o asegurarnos de que está correctamente configurado) dentro de “server”:

# pass the PHP scripts to FastCGI server listening on /var/run/php5-fpm.sock
location ~ \.php$ {
try_files $uri $uri/ =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

Debemos fijarnos especialmente en la línea “try_files $uri $uri/ =404;” ya que una mala configuración de esta, por ejemplo, “try_files $uri $uri/ /index.php =404;” que en teoría debería funcionar de igual manera, puede dar lugar a vulnerabilidades del tipo “PHP Disclosure” con las que un pirata informático podría acceder libremente a todo el código PHP de nuestra web, sin procesarlo.

Probar nuestro servidor PHP

Para probar que todo funciona correctamente debemos desplazarnos hasta la ruta /usr/share/nginx/html (ruta de la web por defecto de Nginx si hemos seguido este pequeño curso LEMP) y crear allí un nuevo fichero llamado “index.php” escrito en lenguaje PHP. Para hacer una prueba rápida, escribimos en este fichero:

  • <?php phpinfo();

phpinfo FPM

También, para completar la configuración de los pasos anteriores, crearemos un fichero 404.php que se cargará por defecto cuando la página que se intenta visitar no se encuentra disponible. En la configuración de Nginx debemos asegurarnos de que el apartado error_page 404 /404.php;” está descomentado y hace referencia al fichero que queremos cargar por defecto ante un error de la página.

Conocimiento pertenece al mundo
Tweet about this on TwitterShare on FacebookShare on LinkedInShare on Google+Share on StumbleUponShare on TumblrShare on RedditPin on PinterestEmail this to someone