Cómo instalar un servidor web con Nginx + MySQL + PHP5 + APC + Spawn_FastCGI [1ra Parte: Presentación]

Hace no mucho les mencionamos que ahora DesdeLinux (todos sus servicios) están funcionando en servidores de GNUTransfer.com. El blog ha mejorado muchísimo en cuanto a velocidad, fluidez, aún cuando pasamos de tener (tras la fusión de UsemosLinux) más de 30.000 visitas cada día (casi 200 usuarios conectados de forma simultánea). ¿cómo lograr un buen rendimiento en el servidor aún con este volumen de tráfico?

Actualmente Justice (VPS donde está el blog y algún otro servicio) cuenta con 3GB de RAM, no obstante se consumen menos de 500MB, esto es posible con la correcta elección del software a usar y una adecuada configuración de los mismos. Por ejemplo, Apache es sin lugar a dudas un grande en el mundo, el No.1 en cuando a hosting se refiere, pero precisamente por eso Apache no es siempre la mejor opción. Cuando el tráfico es elevado y el hardware del servidor no es realmente amplio (Ej: 8 u 16GB de RAM) Apache bien puede consumirnos demasiada RAM haciendo que el server en determinados momentos demore demasiado en responder, o peor, que nuestro sitio esté offline por recursos insuficientes. Es por ello que muchos elegimos a Nginx en vez de Apache.

Nginx:

Ya les hablamos de Nginx antes en el artículo Nginx: Una interesante alternativa a Apache, ahí les comentamos que es un servidor web como Apache, LightHttpd o Cherokee, pero que comparado con Apache destaca por su rendimiento y bajo consumo de hardware, precisamente por eso es que muchos sitios grandes como Facebook, MyOpera.com, DropBox o inclusive WordPress.com usan Nginx en vez de Apache. En el mundillo de Linux DesdeLinux no es el único que usa Nginx, hasta donde sé, emsLinux y MuyLinux también lo usan 🙂

Mi experiencia personal con Nginx data de hace varios años, cuando por necesidad empecé a buscar alternativas ligeras a Apache. En ese momento Nginx iba por la versión 0.6 y su compatibilidad con sitios de alta demanda hechos en PHP no era la más óptima, no obstante hoy en día desde la versión 0.9 en adelante (v1.2.1 disponible en Debian Stable, v1.4.2 disponible en ArchLinux) ha mejorado muchísimo, a tal punto de que con una adecuada configuración y unión de Nginx + PHP todo funcionará a las mil maravillas.

En esta serie de tutoriales usaré la versión 1.2.1-2.2 de Nginx, disponible en los repos Stable de Debian (Wheezy).

PHP5:

PHP, ese lenguaje de programación con que funcionan muchísimos de los sitios (y CMS) actualmente, es a mi forma de ver, la oveja negra de la familia. O sea, en mi experiencia personal sitios grandes, con un gran volumen de visitas, con muchas opciones, funciones, etc, si un sitio así está hecho en PHP consumirá más recursos que un sitio similar hecho por ejemplo en RoR. Mi experiencia ha sido esa amigos, PHP es un gran dragón de recursos, PHP+Apache es suficiente para tragarse cientos y cientos de MB de RAM sin una necesidad real.

El por qué de no usar RoR, Django o algún otro es simplemente que DesdeLinux (el blog, nuestro buque insignia) funciona con WordPress, un CMS desarrollado con PHP que nos ofrece tantas pero tantas comodidades, que simplemente no pensamos cambiarlo en corto o mediano plazo, honestamente, WordPress aún cuando no es perfecto nos sirve para lo que necesitamos y tal vez más.

Respecto a PHP, en estos tutoriales usaré la versión de PHP 5.4.4-14 disponible en Debian Wheezy (Stable)

Spawn_FastCGI:

Esto se puede decir que es lo que une a Nginx con PHP, o sea, aún cuando tengan el paquete PHP5 instalado si no tienen instalado y ejecutado Spawn_FastCGI cuando abran algún sitio en PHP el navegador les descargará el archivo, no les mostrará nada que el .php tenga programado pues el servidor no sabe cómo procesar archivos .php, es por ello que se hace imprescindible instalar y configurar Spawn_FastCGI.

Si usáramos Apache sería algo tan simple como instalar el paquete libapache2-mod-php5 pero como usamos Nginx deberemos instalar el paquete spawn-fcgi en su lugar. Además, en el tutorial les explicaré cómo crear un script de inicio del mismo en /etc/init.d/ para que puedan controlarlo con más comodidad.

MySQL:

Esta podría ser la gran interrogante o tal vez, para algunos, la nota discordante. Muchos sé que me harán la pregunta: ¿por qué usar MySQL y no MariaDB?

El asunto es simplemente que no tengo el tiempo suficiente para dedicarme a hacer una migración en este momento de MySQL a MariaDB, migración que en teoría debería ser transparente para todos, 100% compatible todo, pero eso es… como dije, en teoría. En el momento en que empecé a mover servicios de DesdeLinux de un VPS hacia otro tuve que dejar atrás a Apache y usar Nginx, esto implicaba archivos de configuración distintos, diferentes maneras de declarar VHosts, instalación y configuración desde cero del servidor y sus servicios, no podía en ese momento sumar otra tarea más a la lista, además y siendo honestos, cambié Apache por Nginx porque Apache no me satisfacía mis necesidades, no obstante, MySQL hasta el momento me satisface mis necesidades al 100%, no veo motivos para en ese momento yo aumentar mi carga de trabajo cambiando algo que ya me funcionaba técnicamente bien.

Una vez explicado el por qué no instalé MariaDB, también explicar que como la inmensa mayoría de los sitios webs necesitan una base de datos para su funcionamiento, pues en ella es donde se almacenará mucha información (o casi toda) del mismo. Hay algunos que gustan de Postgre u algún otro, en esta serie de tutoriales les explicaré cómo instalar MySQL y configurar usuarios independientes para cada sitio.

La versión de MySQL que usaré es la v5.5.31

APC:

APC es un optimizador para PHP (explicándolo de forma muy simple). Nos permite una vez configurado adecuadamente que el procesamiento PHP funcione mejor, que las respuestas del servidor sean más rápidas.

Existen alternativas como memcache no obstante, yo siempre he usado APC y he tenido resultados muy favorables. Les recomiendo leer este artículo en inglés: Comparing APC and Memcache as local content cache

Usaré en el tutorial la versión de php-apc v3.1.13-1 disponible también en los repos de Debian Stable.

Resumiendo:

Esta forma de instalar un configurar un servidor web no es la más óptima ni mucho menos, por ejemplo muchos recomendarán Varnish, que hasta donde he leído hace verdaderos milagros pues todo o casi todo lo almacena en caché, pero, en nuestro caso no necesitamos que el 100% del sitio esté siempre almacenado en caché pues no deseamos ni necesitamos llegar a ese extremo. No obstante aclaro, como dije arriba: «hasta donde he leído», yo en lo personal no he usado Varnish hasta el día de hoy, por lo que no les puedo dar una opinión 100% objetiva.

Esto será una serie de tutoriales en los cuales les mostraré cómo instalar un servidor web como el que tiene hostedo en este minuto a DesdeLinux (blog, foro, paste, etc). El blog cuenta con 30.000 visitas cada día, casi 200 usuarios accediendo al mismo de forma simultánea, y aún así la RAM no sobrepasa los 500MB consumidos, esto para algunos puede ser un consumo excesivo pero… eh, tenemos 3GB de RAM, menos de 500MB (que incluyen servicio FTP, SSH, etc) está realmente bien no? 🙂

Toda la ‘magia’ no la hace solamente Nginx+Spawn_FastCGI+APC, nuestro sistema de caché del blog está realmente bien configurado y las reglas para Nginx son precisas, esto hace que el blog aún cuando recibe un gran tráfico procese mucho menos PHP que lo habitual, pues tiene mucho ya almacenado en caché. Si tienen un sitio de gran demanda y tienen problemas de recursos, les recomiendo sin lugar a dudas que estudien a ver qué sistema de caché les funcionará mejor, cuál se adaptará más a sus necesidades.

Espero les resulten interesantes estos tutoriales, en cada uno de ellos lo intentaré explicar todo de forma amplia, detallada y tan simple como me sea posible.

Saludos


27 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Bruno Cascio dijo

    Muy bueno y claro! Te felicito!

    1.    KZKG^Gaara dijo

      Gracias 🙂

  2.   Christopher Castro dijo

    Muy buen tutorial.

    Lo que me llena de duda es como configuraron el servidor de correo electrónico.

    1.    KZKG^Gaara dijo

      El MailServer es algo aparte, o sea, nada tiene que ver con el server web como sabes 🙂

      No obstante, hace mucho tiempo decidí no complicarme con el MailServer, opté por usar iRedMail (soporte para MySQL, LDAP y Postgre) y con las debidas configuraciones y detalles que le agrego yo en los archivos de configuración, todo funciona bien.

  3.   Rots87 dijo

    me agrada el articulo, quedo a la espera de la seria de articulos

    1.    KZKG^Gaara dijo

      Gracias, espero el Lunes o Martes traer el próximo, tratará sobre instalación y configuración de Nginx.

  4.   aca dijo

    Muy bueno, la configuración adecuada, es complicada hallarla, el compromiso entre los factores a veces es casi irresoluble, yo también pase hace un tiempo a nginx y posteriormente a mariadb (hace poco, creo que un año).

    // como coment estaría bueno que plantees la posibilidad del chroot, y usar el proxy_cache_path que también es útil. También la comparación del socket (en los casos que se puede) contra el puerto. y definir bien la cantidad de hijos / ram.

    Saludos

    1.    KZKG^Gaara dijo

      Gracias por tu comentario 🙂
      Sí por supuesto, estaría muy bien enjaular a Nginx para mantenerlo separado como tal del resto del sistema, no me había planteado esa posibilidad en estos tutoriales, veré qué puedo hacer. Sobre el proxy_cache_path, nunca lo he usado, leeré un poco al respecto a ver qué tal.

      Referente a la cantidad de hilos (min & max), en la configuración de Nginx está definido obviamente, en el post de Nginx hablaré bastante del archivo .conf 😉

      De nuevo, gracias por tu comentario.

  5.   msx dijo

    Este tipo de HowTos es lo que hace verdaderamente potente a la web para los informáticos ya que nos ahorra montones de horas de investigación y prueba hasta finalmente decidirnos por la opción apropiada, thanks a lot!

    Una pregunta, esto corre sobre Debian? Qué versión de SO y paquetes?

    Saludos!

    1.    KZKG^Gaara dijo

      Gracias.
      En efecto, sitios que informen, que repitan y repitan la noticia hay demasiados ya … lo que hace falta son sitios que pongan tutoriales, eso es lo que necesita la web!

      Sí, Debian Wheezy (actual Stable), las versiones de los paquetes están ahí mismo en el post 😉

  6.   eliotime3000 dijo

    Excelente comentario. A ver si hago una especie de Fe de erratas con ZPanel X, y de paso, hacer la instalación de forma manual en Debian Wheezy.

  7.   Federico Antonio Valdés Toujague dijo

    Adelante KZKG^Gaara !!!, que El Mejor Criterio de la Verdad es La Práctica, y tienes experiencia sobre lo que escribes. Un sitio web profesional y funcionando. Grandes Ligas, Amigo.

    1.    eliotime3000 dijo

      Eso es cierto. Además, cuando me ponía a jugar con los servidores web que instalaba en Windows, la verdad es que Apache se dispara en cuanto a consumo de recursos si usas WordPress (en Drupal consumía la mitad de recursos).

  8.   carroca dijo

    Me parece que para la parte de Nginx este tutorial me va a venir muy bien. Yo ahora quiero instalar un server con Nginx, php, Varnish y MariaDB. Pero claro, hay que empezar, y la pereza me puede mucho cuando se trata de pelearme con servidores y de momento soy feliz con el tipico lamp y memcache del que dispongo xDD.

    Un saludo.

  9.   AurosZx dijo

    Genial, justo un artículo de estos vendría bien 🙂 Otro esperándolo con ansias.

  10.   Iván Gabriel Sosa dijo

    Te seguimos. Actualmente estamos comenzando en el mundo de los servidores web. Compramos dos en Hostinger, y un amigo nos ayudo a configurarlo desde cero (PHP, MySQL, Apache). Es la única combinación que se utilizar en Linux, plataforma en la que estoy totalmente desde Enero.
    Pero me ha interesado muchísimo este tema. Saludos!

  11.   Jose Manuel dijo

    Nunca he instalado un servidor web pero si deseo hacerlo, una pregunta, ¿el nivel necesario para para comprender los tutoriales y hacer la instalacion sera elevado o con conocimientos básicos lo podría intentar? Gracias de antemano.

    1.    eliotime3000 dijo

      La verdad es que no requiere muchos conocimientos para poder manejar un servidor de base de datos. Te lo dice uno que ya probó esa experiencia.

  12.   Mauricio dijo

    Hola, esta muy bueno lo que vas hacer con esta serie de post.

    Hace poco, instale Nginx + Php Fastcgi + Mariadb. Nginx.

    Todo esto, lo hice en Archlinux, porque esa distribución es la única desde mi punto de vista, que no trae tanto chiches como las demás. Lo puse en un entorno enjaulado y me dio muchos inconvenientes tenerlo funcionando perfectamente.

    Ahora esta funcionando a la perfección. Aunque me interesa saber sus opiniones, sobre eso de los procesos hijos y padre, mientras mas tips me pasen, mucho mejor.

    Todo esto, es solo por tema de practica.
    El equipo tienen 4GB de ram DDR2 y un procesador Core 2duo a 2.4Ghz.

    Saludos y espero con ansias los post venideros de esta serie.

  13.   kas dijo

    200 usuarios conectados de forma simultánea?
    Solo en ciertos momentos del día, no? Porque sino superaría esas 30.000 visitas diarias.

    1.    KZKG^Gaara dijo

      Sí claro, no siempre están 200 personas online, en este momento hay casi 40 pues aún es temprano, en unas horas sobrepasarán las 100.

  14.   dhunter dijo

    Solo por diversión me acabo de pasar de lighty a nginx en mi estación de trabajo (Symfony2 ahora mismo), la conf la tomé de acá [1], muy simple.

    [1] http://ihaveabackup.net/2012/11/17/nginx-configuration-for-symfony2

  15.   abr4xas dijo

    Esperando la continuacion de esto 😀

    1.    KZKG^Gaara dijo

      En esta semana la debo publicar, gracias por leernos 🙂

      1.    salud dijo

        y? falta mucho?

  16.   Dean dijo

    Buen post…

  17.   NOEL IVAN dijo

    BUENA TARDE.
    POR ESPECIFICACIONES DE UNA PROYECTO DE ESCUELA ME DEJARON INSTALAR NGINX EN OPENBSD 5.4 EN ORACLE MV VIRTUALBOX PARA PODER UTILIZAR PHP, MYSQL ENTRE OTROS, NADAMAS QUE NO HE PODRIDO ENCONTRAR INFORMACIÓN RESPECTO A LO DICHO ANTERIOR, CREE QUE ME PODRIA AYUDAR CON ESTE PROBLEMA.