Instalando Nginx + PHP 5.3 + PHP-FPM (Debian)
Bueno esto lo hice en Debian pero supongo que también le servirá a alguien que este buscado info sobre esto, de hecho mas allá de la instalación, es configurar los servicios.
Para los que no saben de que se trata, Nginx ("Engine X" o Motor X) es un servidor web de alto rendimiento que viene ganando mercado a pasos agigantados por ser extremadamente rápido. PHP-FPM (PHP FastCGI Process Manager) es un manejador de procesos para usar PHP en modo FastCGI.
Antes que nada necesitamos agregar una fuentes a nuestro sources.list en donde se encuentran ya los paquetes de PHP 5.3, para eso solo necesitamos ejecutar (como root):
[code]
echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list
[/code]
Luego agregamos la clave GPG pública:
[code]
gpg --keyserver keys.gnupg.net --recv-key E9C74FEEA2098A6E
gpg -a --export E9C74FEEA2098A6E | sudo apt-key add -
[/code]
Actualizado el 2/1/2012: Cambio el repositorio y la key:
[code]
echo "deb http://packages.dotdeb.org squeeze all" >> /etc/apt/sources.list
[/code]
Luego agregamos la clave GPG pública:
[code]
wget http://www.dotdeb.org/dotdeb.gpg cat dotdeb.gpg | sudo apt-key add -
[/code]
Y luego actualizamos la DB de paquetes:
[code]
apt-get update
[/code]
Desde este paso ya disponemos de los paquetes de PHP 5.3 y del PHP-FPM, de este modo vamos a poder manejar la instalación de estos de forma natural en la distro, ahora a instalar!
[code]
apt-get install nginx php5-cli php5-common php5-suhosin php5-fpm php5-cgi
[/code]
Puede que si ya lo tienen salte algún problema, yo recomendaría desinstalar todo antes de empezar con esto.
Una vez todo instalado, nos toca el tema de la configuración, para esto, nuestros archivos de configuración van a estar en /etc/php5/ habiando directorios para cada modo de ejecución, por apache, cli (consola) y demas, a nosotros lo que nos importa es fpm.
Luego de configurar (o no) el archivo php.ini a su gusto, nos toca configurar el archivo php5-fpm.conf que tendrá las opciones del dæmon (o demonio) que manejara las instancias de PHP. Las partes que nos importan descomentar son:
[code=ini]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm.log
[/code]
Tambien debemos crear ambos archivos y darles permiso a www-data (en el caso de Debian):
[code]
touch /var/run/php5-fpm.pid
chown www-data:www.data /var/run/php5-fpm.pid
touch /var/log/php5-fpm.log
chown www-data:www.data /var/log/php5-fpm.log
[/code]
Es importante ya que sin el archivo de PID no nos funcionará bien el manejo mediante los scripts de inicio.
Todo el resto de la configuración queda a su gusto.
Ahora nos toca configurar el Nginx, si bien la configuración es sencilla, también es bastante extensible, básicamente lo que vamos a hacer, es decirle que todo lo que es estático es servido, y todo lo que sea php, que lo pase al PHP-FPM, para eso podemos reemplazar la configuración de /etc/nginx/sites-aviables/default que es el virtual por defecto de Nginx, y reemplazar el contenido por:
[code]
server {
listen 80;
server_name misitio.com;
access_log /var/log/nginx/misitio.access.log;
# Servimos todo contenido estático:
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 30d;
root /var/www;
}
# Pasamos el resto (que suponemos es dinámico) al FPM
location / {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
include fastcgi_params;
}
}
[/code]
Bien, de esta forma ya tendriamos el servidor funcionando solo hace falta reiniciar los servicios para que tomen la nueva conf:
/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
Podemos chequear todo creando un archivo (index.php) en /var/www y entrar en nuestro navegador: http://localhost.
Bueno, de esta forma concluye el tema, ahora le pasare un par de posibles problemas que puedan quedar por ahí:
El browser me muestra el código fuente de los scripts: Ok, este es seguro el primer problema con el que se pueden topar muchos, y eso es por la configuración por defecto del php.ini, si usan los "short_tags", osea abrir y cerrar un script con <? ?> y no con <?php ?>, estos no se tomaran, aparte de cambiar de hábitos, pueden habilitarlos desde /etc/php5/fpm/php.ini cambiando la linea:
short_open_tag = On
De este modo debería empezar a andar.
Una cosa!!! recuerden que ahora los procesos los maneja un demonio, así que para que se tome el cambio no habrá que reiniciar el Nginx, sino que vamos a reiniciar el php-fpm.
No me anda nada: Jajaja esta es medio general pero debia ponerla, en este artículo solo puse como instalar PHP 5.3 sin mas, con que su aplicación use MySQL ya no debería andar, ahí, al igual que como si instalasen PHP5 original de Debian, deben instalar todos los paquetes de extensiones, como php5-mysql, php5-gd, php5-memcache, y etc. Tambien hay que tener en cuenta que si se trabaja en un entorno de desarrollo se deben habilitar la muestra y logueo de errores, los errores se loguearan en /var/log/nginx/error.log dependiendo de lo que allamos configurado en el virtual.
No me anda algún valor de $_SERVER: Bien, la variable super-global $_SERVER en un array que contiene información que envía nuestro servidor al script, hay que tratar estos valores con cuidado ya que puede variar en distintas configuraciones, este puede ser el ejemplo, si nosotros necesitamos mandar alguna personalizada al servidor, podemos hacerlo con la directiva fastcgi_param seguida de la variable y el valor, las definiciones por defecto se encuentran en el archivo /etc/nginx/fastcgi_params podemos editar este archivo y ponerlas a mano, por ejemplo una que no esta es $_SERVER['REDIRECT_URL'], solo deberemos agregar al final del archivo:
fastcgi_param REDIRECT_URL $request_uri;
$request_uri es un valor que nos tira el Nginx, para ver mas solo se deben dar un paso a la documentación.
Si quiero que todo pase por un solo archivo: Esto se usa bastante y es desviar todas las peticiones a un único archivo, por ejemplo "index.php", lo que comúnmente se hace en el Apache con el mod_rewrite:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Aunque el Nginx tiene un modulo de rewrite, algo mas limpio sería cambiar el script pedido al FPM, en el parametro SCRIPT_FILENAME:
fastcgi_param SCRIPT_FILENAME index.php;
Bueno eso es todo lo que tengo para contar, si les queda alguna duda no duden en comentarla.

December 8th, 2010 - 15:46
Oscar, buen post.
Sabés que me pasa el caso de que tengo que mandar todo al index.php, pero la path en la URL en realidad no existe (la procesa el PHP y muestra la página correcta).
Traté de configurar el rewrite pero obtengo este error, capaz sabés que puede ser:
Warning: Unknown: Filename cannot be empty in Unknown on line 0
Fatal error: Unknown: Failed opening required ” (include_path=’.;C:\php5\pear’) in Unknown on line 0
Saludos.
January 5th, 2011 - 19:47
Hola pablo!, perdona la tardanaza pero hacia rato que no entrava a moderar los comentarios al blog
, la verdad no se me ocurre nada con ese error, so bre lo otro no entendi bien, si vos le setias:
fastcgi_param SCRIPT_FILENAME index.php;
Tiene que ir si o si al index.php, no hace falta usar rewrite.