Instala Winginx con PHP y arregla el error 504 Gateway Time-out

El post de hoy es para tod@s aquell@s que estéis dando vuestros primeros pasos con el servidor web nginx y PHP, y también para las personas que estéis buscando en Internet cómo solucionar el típico error 504 que lanza nginx alguna vez. Vamos a instalar nginx en Windows con Winginx, y vamos a enlazarlo al servidor FastCGI php-cgi.exe.

HTTP 200

¿Qué es Winginx?

Winginx es una pila de programas que incluye lo siguiente:

  • PHP 5
  • Node.js
  • MySQL
  • MongoDB
  • Redis
  • memcached
  • Varios CMS y frameworks

Está disponible solo para Windows (Winginx significa Windows + nginx) y viene a ser el equivalente nginx de las clásicas pilas LAMP (la A es del servidor web Apache) como las siguientes:

Si eres un desarrollador PHP seguro que has trabajado con alguna de las aplicaciones anteriores. Por cierto, digo que estas pilas LAMP son clásicas porque nginx viene irrumpiendo con fuerza desde hace un tiempo. September 2014 Web Server Survey es un recurso publicado por NetCraft donde puedes ver el estado actual del mercado de los servidores web.

¡Vamos a instalar Winginx!

Instalar Winginx es muy fácil, tan solo tienes que descargarte el instalador en la página oficial de descarga, y ejecutarlo. Al ejecutar winginx-setup.exe se iniciará el asistente de instalación.

Asistente de instalación de Winginx

Figura 1. Asistente de instalación de Winginx

Asumo que puedes seguir el asistente sin problemas, no tiene ninguna complicación así que me ahorraré poner todos los pantallazos de la instalación. Al finalizar el proceso, Winginx creará en tu PC la carpeta C:\Winginx, que contiene todas las apps que hemos listado antes.

Iniciar nginx

nginx logo

A partir de ahora cuando ejecutes Winginx te saldrá el icono en el área de notificación de la barra de tareas de Windows.

Winginx en el área de notificación

Figura 2. Icono de Winginx en el área de notificación de Windows

Por cierto, ¡no olvides iniciar el servidor web!

Iniciando el servidor web

Figura 3. Iniciamos el servidor web nginx

Tras iniciar el web server ya podemos abrir nuestro navegador favorito y escribir en la barra de direcciones el URI http://localhost. Si todo va bien tenemos que ver lo siguiente:

nginx, it works!

Figura 4. It works!

¡Felicidades! Todo ha ido bien, nginx está sirviendo el archivo C:\Winginx\home\localhost\public_html\index.html.

Ahora vamos a ejecutar el phpinfo.php

Fíjate que también hay un archivo phpinfo.php en C:\Winginx\home\localhost\public_html\. Sin embargo si intentas ejecutarlo tras la instalación nginx te devolverá un error 504 Gateway Time-out.

nginx, 504 Gateway Timeout

Figura 5. Inicialmente no podemos ejecutar el script phpinfo

¡Pero no te preocupes! Esto es completamente normal. El error 504 Gateway Time-out (tiempo de espera de gateway superado) es un código de estado HTTP que indica que hay un error en el servidor que intenta atender la petición. Concretamente, significa que el servidor que atiende la petición está actuando como una pasarela o proxy, y no recibió una respuesta suficientemente rápida por parte de otro servidor, de modo que se agotó el tiempo de espera.

nginx se comunica con PHP por medio del proceso php-cgi.exe, que es un servidor FastCGI. Esto es nuevo para algunos programadores que han venido trabajando con el intérprete PHP por medio del módulo de Apache, dentro del mismo servidor; si este es tu caso, que sepas que PHP también se puede ejecutar como binario CGI.

Lo anterior se establece en el archivo de configuración principal C:\Winginx\conf\nginx.conf:

Se establece con la directiva fastcgi_pass. Fíjate que nginx pasa la petición a un proceso fastcgi que escucha en el puerto 9000. Pero en una instalación fresca de Winginx como la nuestra, el motivo del error 504 es que php-cgi.exe no se ejecuta de forma predeterminada, ¡tenemos que levantarlo nosotros a mano! Para ejecutar el servidor FastCGI puedes abrir una consola, ir a la carpeta C:\Winginx\php5 y ejecutar este comando:

Si lo deseas, también puedes crear un archivo start-php-fcgi.bat como este:

Puedes ampliar esta información en la documentación oficial de nginx.

Con php-cgi.exe ejecutándose tal y como espera el servidor web en su archivo de configuración principal, ya puedes ejecutar otra vez http://localhost/phpinfo.php, ¡y esta vez el script PHP ya se ejecutará correctamente!

¿Te gustó el artículo de hoy? Te invito pues a compartirlo con tus amig@s y a dejar un comentario aquí en esta entrada. ¡Muchas gracias! 😀