====== Cómo instalar Nginx con soporte PHP (via FastCGI) y MySQL en Debian ====== Últimamente mis servidores web se me estaban colgando al punto, que tenía que reiniciarlo varias veces en el día. Después de monitorear un poco los procesos descubrí, que el autor intelectual de estos cuelgues era nada más y nada menos que Apache2. En busca de una alternativa recordé, que un amigo me había hablado de Nginx (se pronuncia enyinex) y decidí probarlo para ver que tal se comportaba. ===== ¿Qué es Nginx? ===== Citemos a Wikipedia: //nginx (pronunciado en ingles “engine X”) es un servidor web/proxy inverso ligero de alto rendimiento y un proxy para protocolos de correo electrónico (IMAP/POP3). Es software libre y de código abierto, licenciado bajo la Licencia BSD simplificada. Es multiplataforma, por lo que corre en sistemas tipo Unix (GNU/Linux, BSD, Solaris, Mac OS X, etc.) y Windows. El sistema es usado por una larga lista de sitios web conocidos, como: WordPress, Hulu, GitHub, Ohloh, SourceForge y TorrentReactor.// Entre sus caraterísticas más destacadas se encuentran: * Servidor de archivos estáticos, índices y autoidexado. * Proxy inverso con opciones de caché. * Balance de carga. * Tolerancia a fallos. * Soporte de HTTP sobre SSL. * Soporte para FastCGI con opciones de caché. * Servidores virtuales basados en nombre y/o en dirección IP. * Streaming de archivos FLV y MP4. * Soporte para autenticación. * Compresión gzip. * Soporte de más de 10,000 conexiones por segundo. * Proxy SMTP, POP3 e IMAP. * Soporta STARTTLS. * Soporta SSL. ===== Instalando Nginx===== Ahora bien, básicamente seguiremos los pasos que podemos encontrar en este [[http://www.howtoforge.com/installing-nginx-with-php5-and-mysql-support-on-debian-lenny|manual]], lo que al final, le haremos algunas modificaciones. Lo primero que haremos será instalar MySQL con lo que necesitemos, en mi caso: sudo aptitude install mysql-client-5.0 mysql-server-5.0 Ponemos los datos de root y proseguimos con la instalación de Nginx. sudo aptitude install nginx Luego lo iniciamos para comprobar que esté corriendo: sudo /etc/init.d/nginx start Y nos debe salir algo como esto: {{:tutoriales:nginx.png|}} Ahora bien, para que Nginx tenga soporte PHP, en el manual original hay un paso para instalar los siguientes paquetes: sudo aptitude install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-mhash php5-ming php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl Cómo es lógico no necesito todo esto, así que solamente instalo los siguientes paquetes, obviando algunas de las dependencias innecesarias: sudo aptitude -R install php5-{cgi,mysql,curl,gd,imagick,imap,mcrypt,sqlite,xmlrpc,xsl} php-pear Ahora tenemos que decirle a PHP que utilice FastCGI, para ello editamos el fichero ''/etc/php5/cgi/php.ini'' donde buscamos la línea: # cgi.fix_pathinfo=0 Y la dejamos así: cgi.fix_pathinfo=1 Guardamos el fichero. En el manual nos señalan que el paquete FastCGI no se encuentra en Lenny y que por lo tanto, tenemos que hacer uso de spawn-fcgi, el cual es proporcionado por Lighttpd, por lo que tenemos que instalarlo. Yo no hice esto, ya que tendríamos que parar manualmente la ejecución de Lightttpd y hacer una serie de pasos innecesarios. Para resolver este problemita descargué de los repos de Sid el paquete ''spawn-fcgi_1.6.3-1_i386.deb'' y lo instalé manualmente. El hecho de que esté en Sid no reporta ningún problema en la instalación, así que no hay de que preocuparse. ===== Configurando Nginx ===== Básicamente ya Nginx funciona para sitios estáticos, pero si queremos que muestre sitios con contenido dinámico o escritos en PHP, debemos ejecutar estar línea en la consola: sudo /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid Esto lo que hará es permitir ejecutar PHP con FastCGI por el puerto 9000. Para asegurarnos de que cada vez que se inicie nuestro servidor, esta opción esté activa, lo colocamos en el fichero ''/etc/rc.local''. =====Ajustando Nginx===== Con nuestro editor favorito abrimos el fichero ''/etc/nginx/nginx.conf'', donde podemos cambiar varios parámetros. En lo particular seguí los pasos del manual y solo modifiqué las líneas: worker_processes 5; keepalive_timeout 2; De esta forma Nginx solo ejecutará 5 procesos únicamente y hará que no se nos vuele la memoria RAM. Configurando los Host Virtuales (VirtualHost) Ahora editamos el fichero ''/etc/nginx/sites-available/default'' y lo dejamos exactamente de la siguiente forma: # You may add here your # server { # … # } # statements for each of your virtual hosts server { listen 80; server_name localhost; access_log /var/log/nginx/localhost.access.log; location / { root /var/www; index index.html index.php; } location /doc { root /usr/share; autoindex on; allow 127.0.0.1; deny all; } location /images { root /usr/share; autoindex on; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/nginx-default; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache’s document root # concurs with nginx’s one # #location ~ /\.ht { #deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} Con esto le decimos que la carpeta root será ''/var/www/'' , además habilitamos el uso de FastCGI. Creamos el fichero ''/var/www/info.php'' y le ponemos adentro esto: Reiniciamos Nginx /etc/init.d/nginx restart Y accedemos a ''http://nuestra_ip/info.php'' y nos debe salir algo como esto ===== Ejemplos de Host Virtuales. ===== En la web de Nginx pueden encontrar ejemplos de Host Virtuales para WordPress y CMS similares. Ahora pondremos como ejemplo una configuración para mostrar una carpeta estática, la cual contiene un repositorio. Creamos el ''/etc/nginx/sites-available/repo'' el cual contendrá esto adentro: server { listen 80; server_name repo.tudominio.cu; root /var/www/repo/; autoindex on; location /repo { root /var/www; } } Le hacemos un enlace simbólico en ''/etc/nginx/sites-enabled'' y reiniciamos Nginx. Un ejemplo de un VirtualHost para WordPress sería este: server { listen 80; server_name tusitio.tudominio.cu; root /var/www/wordpress; index index.php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } Y listo… ===== Conclusiones ===== Particularmente he realizado pruebas locales que me han demostrado que Nginx no solo consume menos recursos que Apache, sino que devuelve las peticiones mucho más rápido… ===== Posibles errores: ===== Una vez que todo esté montado, si al intentar acceder a un sitio nos sale el mensaje: HTTP Error 502 Bad gateway Solo tenemos que volver a ejecutar en consola el comando: sudo /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid ===== Solución al error ===== Creamos dentro de ''/etc/init.d/'' un nuevo fichero llamado ''spawn-fcgi'': sudo touch /etc/init.d/spawn-fcgi Y le ponemos esto adentro: #! /bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin case "$1" in start) echo -n "Starting FCGI: " /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid ;; stop) ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0 Esto nos permitirá iniciar/detener el comando: /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid El cual habíamos visto anteriormente en este artículo. Ahora creamos dentro de la carpeta ''/root'' (o donde más nos guste) un fichero llamado ''spawn-fcgi.sh'', y le damos permisos de ejecución: sudo touch /root/spawn-fcgi.sh && chmod +x /root/spawn-fcgi.sh Y le ponemos esto adentro: if ps aux | grep 'php5-cgi' | grep -v grep > /dev/null; then echo "FastCGI está funcionando !" else echo "FastCGI está caído. Vamos a iniciarlo de nuevo..." /etc/init.d/spawn-fcgi start fi Guardamos y ponemos la siguiente línea en el crontab: * * * * * root /root/spawn-fcgi.sh Nota: Ud. puede darle más o menos tiempo en el cron. ¡¡¡Listo!!! Con esto debe ser suficiente.