Herramientas de usuario

Herramientas del sitio


tutoriales:nginx_fastcgi_php_mysql_debian

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 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:

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:

default
# 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:

<?php
  phpinfo();
?>

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:

repo
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:

wordpress
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:

spawn-fcgi
#! /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:

spawn-fcgi.sh
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.

tutoriales/nginx_fastcgi_php_mysql_debian.txt · Última modificación: 2020/04/22 20:57 (editor externo)