Guía de instalación de LEMP (Linux, Nginx, MariaDB/MySQL, PHP) en Debian 8 “Jessie”

guia instalacion lemp debian 8

Recientemente, decidí adquirir un Virtual Private Server (VPS) en DigitalOcean y lanzarme a la aventura de instalar y mantener mi propio servidor web. Si bien tengo suficiente experiencia para trabajar con una máquina con Linux, la idea de trabajar cara a cara con un servidor web y mantenerlo no parecía sencilla. Y, de hecho, no lo ha sido. Tras muchas horas peleándome con permisos de archivos, usuarios, firewall, archivos de configuración… finalmente lo conseguí. Este artículo ha sido entregado a tu navegador a través de un servidor LEMP y WordPress, los cuales espero que sigan llevándose bien para no tener que lidiar con más problemas.

Lo cierto es que, tras conseguir que todo funcionara, me he dado cuenta de que he aprendido bastantes cosas sobre este mundillo que antes prácticamente desconocía. Además, el tener un servidor web propio permite mucha flexibilidad y ello acaba otorgando mucha utilidad. Sin indagar más en mi experiencia personal, pasemos a lo que realmente importa.

¿Por qué LEMP en lugar de LAMP?

Esta es una pregunta difícil de contestar, así que voy a intentar ser breve dado que un debate de este tipo queda fuera del objetivo de una guía de instalación. Me decanté por utilizar un servidor LEMP en lugar de un servidor LAMP (Linux, Apache, MySQL/MariaDB, PHP) debido a que Nginx, en un principio, suele ser más eficiente y ligero si tenemos en cuenta un mismo hardware y hablamos de un servidor que no pretende alojar una gran cantidad de sitios web. Además, Apache ofrece una gran cantidad de opciones que es probable que no necesitemos en nuestro modesto servidor y, como es obvio, eso repercute en el rendimiento y en el uso de RAM, más aún teniendo en cuenta que Apache crea nuevos procesos en función de las peticiones que va recibiendo (process-based server).

Sin embargo, las cosas pueden volverse complicadas con Nginx si hablamos de un servidor más cargado, puesto que esto supondría invertir un tiempo mayor configurando Nginx que configurando Apache, el cual cuenta con unas herramientas muy interesantes para ello. Por lo tanto, debemos tener en cuenta, en primer lugar, el escenario sobre el que vamos a trabajar y qué herramienta es la más adecuada.

Como consideración adicional, es importante tener en cuenta que el propio servidor web no lo es todo en cuestiones de rendimiento. Tenemos que tener en cuenta también, por ejemplo, el uso que hace el back end (Java, PHP, Node.js, Python…) de nuestro hardware.

Si deseas saber más sobre el tema y como material adicional de ayuda para decidirte por LAMP o LEMP, recomiendo leer los siguientes dos artículos para tener una idea más detallada del funcionamiento y ventajas y desventajas de ambos tipos de servidores web:

Instalación de LEMP paso a paso en Debian 8

Nota importante
Antes de empezar, asegúrate de que tienes sudo correctamente configurado en tu sistema, pues lo necesitarás para seguir los pasos de este tutorial. Además, deberías comprobar si tu sistema tiene algún firewall activado y añadir las reglas adecuadas para permitir al menos la conexión al puerto 80 (HTTP). Si planeas utilizar HTTPS en tu servidor, entonces es necesario abrir el puerto 443 (SSL).

Para empezar, vamos a realizar una actualización del sistema, lo cual es siempre recomendable antes de instalar nuevos paquetes:

sudo apt-get update && sudo apt-get upgrade

Instalación de Nginx

Una vez realizada la actualización, podemos proceder a la instalación de Nginx, base fundamental de un servidor LEMP y el encargado de atender las peticiones:

sudo apt-get install nginx

Si todo sale bien, ya tendrás Nginx ejecutándose en tu sistema. Si accedes desde un navegador a la IP pública de tu servidor o a tu nombre de dominio (si es que ya tienes asignado uno), entonces deberías ver la siguiente página web de ejemplo:

instalacion nginx lemp

Instalación de MariaDB

Con Nginx ya instalado y funcionando, podemos pasar a la instalación de MariaDB, que pretende ser un reemplazo directo de MySQL ofreciendo más rendimiento y permaneciendo como proyecto open-source. Volvemos, por tanto, a usar el gestor de paquetes APT:

sudo apt-get install mariadb-server

Durante la instalación, MariaDB solicitará una contraseña root para administrar las bases de datos. Es muy recomendable que dicha contraseña sea suficientemente segura dado que en caso contrario nuestras bases de datos estarían comprometidas, lo cual sería un problema grave de seguridad. El siguiente paso sería ejecutar el siguiente script incluido con MariaDB, el cual se recomienda ejecutar para configurar MariaDB de forma correcta y segura para un entorno de producción:

sudo mysql_secure_installation

En primer lugar, el script preguntará por la contraseña de root que has establecido anteriormente para MariaDB. Seguidamente, preguntará si quieres cambiar dicha contraseña (a lo que deberás contestar no si es la que deseas utilizar de forma definitiva) y, a continuación, preguntará si quieres eliminar ciertas tablas y usuarios que podrían comprometer la seguridad, a lo cual se recomienda responder que sí. Llegados a este punto, solo queda comprobar que podemos acceder correctamente a MariaDB ejecutando:

sudo mysql -u root -p

Si todo funciona bien, deberías poder acceder a la consola de comandos de MariaDB:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 39
Server version: 10.0.23-MariaDB-0+deb8u1 (Debian)

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Vamos a probar a realizar una consulta a MariaDB sobre las bases de datos existentes. Para ello, escribimos SHOW DATABASES;. Si todo va bien, deberíamos obtener la siguiente salida:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]> 

 Para salir, simplemente escribe quit;

Instalación de PHP

Con Nginx y MariaDB instalados correctamente, nuestro siguiente paso es la instalación y configuración de un lenguaje de scripting para procesar datos, interactuar con nuestra base de datos… etc, lo cual es necesario para servir sitios web dinámicos como, por ejemplo, este mismo blog. En nuestro caso, vamos a instalar y configurar PHP.

Nginx no cuenta con procesamiento PHP nativo, por lo que es necesaria la instalación de PHP FPM (FastCGI Process Manager). Nginx se encargará, una vez configurado, de enviar las peticiones PHP a PHP-FPM para su procesado. Instalamos, pues, los siguientes paquetes:

sudo apt-get install php5-fpm php5-mysql

Con los paquetes ya instalados, vamos a proceder a editar el archivo de configuración /etc/php5/fpm/php.ini. Es necesario que localizemos la línea ;cgi.fix_pathinfo=1y la editemos de forma que quede de la siguiente manera:

cgi.fix_pathinfo=0

Editando esta línea evitamos que PHP ejecute un archivo que se parezca en cierta medida al solicitado, en caso de no encontrar este último. El no editar esta línea supondría un problema importante de seguridad.

Solo queda reiniciar el servicio ejecutando:

sudo service php5-fpm restart

Configurar Nginx para utilizar PHP-FPM

Ya tenemos Nginx, MariaDB y PHP-FPM instalados en nuestro sistema, por lo que ya podemos pasar a realizar la configuración de Nginx para que utilice PHP-FPM como procesador PHP.

En primer lugar, debemos tener en cuenta los dos directorios con los que debemos trabajar para crear y habilitar los archivos de configuración de Nginx. Estos dos directorios son /etc/nginx/sites-available y /etc/nginx/sites-enabled. En el primero se encontrarán los archivos de configuración como tal, y en el segundo se encontrarán los enlaces simbólicos a los archivos de configuración que queramos habilitar, de forma que cuando Nginx se inicie este los tenga en cuenta. Si nuestro archivo de configuración se llama wordpress, entonces crearíamos un enlace simbólico de la siguiente forma:

sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress

Con esta pequeña introducción, podemos pasar a editar el archivo de configuración /etc/nginx/sites-available/default, el cual viene por defecto ya habilitado en Nginx. Este archivo, sin tener en cuenta los comentarios, tiene el siguiente aspecto:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

Vamos a realizar algunas modificaciones, las cuales aparecen resaltadas a continuación:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        index index.php index.html index.htm;

        server_name dominio_o_dir_IP;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

En líneas generales, estas son las modificaciones que hemos realizado:

  • Hemos añadido index.php a la línea index, de forma que Nginx busque por dicho archivo cuando accedamos a nuestro sitio a través de nuestro dominio (o en este caso dirección IP, dado que estamos realizando pruebas).
  • En la línea server_name es necesario establecer la dirección IP o nombre de dominio (ejemplo.com) que queremos utilizar.
  • El bloque location ~ \.php$ { ... } establece una serie de declaraciones que permiten a Nginx redirigir las peticiones PHP correctamente a PHP-FPM. Por ejemplo, con la línea  fastcgi_pass unix:/var/run/php5-fpm.sock; establecemos la dirección donde se encuentra el socket de PHP-FPM que se encarga de procesar los archivos PHP.

Para aplicar los cambios, reiniciamos Nginx:

sudo service nginx restart

Testear la configuración con un archivo PHP

Vamos a crear un archivo PHP llamado index.php en la raiz del directorio de Nginx. Para ello, ejecutamos:

sudo nano /var/www/html/index.php

El contenido del archivo va a ser el siguiente:

<?php
phpinfo();
?>

Guardamos y accedemos a http://dominio_o_dir_IP/ desde nuestro navegador web. Deberíamos ver una página web similar a la siguiente:

phpinfo LEMP Debian 8

Si todo funciona correctamente, es aconsejable eliminar el archivo index.php que hemos creado para evitar dar pistas sobre nuestro servidor a posibles usuarios malintencionados. Para ello, ejecutamos:

sudo rm /var/www/html/index.php

Conclusiones finales

Si has llegado al último paso sin problemas, ya debes de tener un servidor LEMP listo para funcionar. A partir de aquí, sería posible instalar entornos como WordPress u ownCloud, por poner dos ejemplos. Cabe destacar que es necesario dedicar algo de tiempo a Nginx para entender cómo funcionan sus archivos de configuración y poder así configurar de forma correcta los distintos sitios web que tengamos pensado alojar en nuestro servidor. En el caso de WordPress u ownCloud, suele ser fácil encontrar ejemplos de configuración de Nginx en la red, de forma que podamos adaptar los mismos a nuestras necesidades, manteniendo siempre las líneas del archivo que sean imprescindibles para el correcto funcionamiento de dichos entornos.

En los próximos meses me gustaría seguir trabajando en tutoriales de este tipo, por lo que es posible que veáis más guías como esta. Solo me queda decir que, en caso de que tengas alguna sugerencia o duda al respecto de esta guía (errores que hayas podido encontrar, por ejemplo), puedes contactar conmigo o dejar un comentario más abajo.

Guía basada en:

Mi nombre es Alejandro Castilla Quesada. Desde pequeño he tenido mucho interés por la informática, las últimas tecnologías, los videojuegos... entre otros temas como la política o la en actualidad general. Además, me gusta hacer deporte y ver series en mi tiempo libre. Actualmente estoy trabajando como programador Java (GWT y JEE) en Intendia S.L. (www.intendia.com)
  • Robin

    gracias por compartir muy buen articulo, yo en realidad he venido tratando de montar mi vps pero no he podido tener exito y eso que he seguido las instrucciones al pie de la letra pero en muchas ocaciones he tenido que adelantar algunas cosas ya que incluso utilizando los comandos nos siempre me funciona y yo he pensado que a lo mejor ya estan configurados.

    ahora mismo estoy procurando crear una base de datos pero por alguna razon me tira un error cuando yo introduzco el databse name: asi es que lo hago, ejemplar:

    mysql -u root -p
    Hasta este punto todo esta bien porque me pide que introduzca el pass la cual lo hago y todo bien

    CREATE DATABASE mibasededatos;
    Aqui es donde creando la base de datos me da el siguiente error.

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘CRE ATE DATABASE elcharro’ at line 3
    MariaDB [(none)]> CREATE DATABASE elcharro;
    Query OK, 1 row affected (0.01 sec)

    Me encantaria lograr montar mi primer vps ya con todo listo.

    Gracias

    • ¡Hola, Robin!

      Gracias, me alegra de que esta guía te sirva de ayuda. El error que comentas es extraño ya que según veo estás escribiendo bien el comando y por tanto la base de datos debería crearse (a no ser que ya exista una igual con ese nombre). Recuerda que los pasos son los siguientes:

      En primer lugar, creamos la base de datos -> CREATE DATABASE basededatos;
      Seguidamente, accedemos la base de datos que hemos creado -> USE basededatos;

      A partir de ahí, podrás crear las tablas que necesites en esa nueva base de datos. Te recomiendo que visites esta página web: http://www.w3schools.com/SQl/sql_create_db.asp Ahí podrás ver los diferentes comandos que puedes utilizar para preparar tu base de datos en función de lo que necesites.

      Si tienes alguna duda más no dudes en comentar.

      ¡Saludos!

      • Robin

        Gracias por tan rapida respuesta.

        Ahora mismo me encuentro con un sin fin de problemas procurando instalar una website wordpress ya que aunque sigo toda instruccion, y eso que he seguido mas de una de las guias en ingles que DigitalOcean provee pero no logro tener exito.

        El problema mayor es que tengo unos sitios webs alojados en un servidor compartido a base de una cuenta de reventa (reseller) pero ultimamente he tenido un brutal ataque de hackers que continuan atacando mis webs y aunque las vuelvo a limpiar ellos siempre las infectan y he tratado de todo tipo de segurida recomendada en wordpress pero siempre entran, incluso afecta la base de datos porque cambia el usuario y contrasena la cual si entro en phpmyadmin, creo que es una manera muy rapida de volver editar el usuario o contrasena.

        Dado que es muchon lo que he echo para asegurar mis sitios he llegado a pensar que es el servidor compartido cual es demasiado volnerable y he decidido utilizar un vps, la cual creo que la dificultad me está empujando en rentar un managed vps pero mas me gustaria es aprender lo basico para comenzar a gestionar mi vps. El problema es que estos sitios que tengo debo tenerlos listos para ya pero estoy estancando.

        Me encuentro procurando agregar un usuario a una base de datos pero cuando quiero acceder a la base de datos: mysql -u root -p
        Enter password: ***********
        luego me da este error, creo que a estas alturas solo necesito crear un database, usuario, conseder previlegios y listo para instalar wordpress pero me encuentro con este punto de falla.

        ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

        • Hola de nuevo.

          Ese error que comentas es extraño, puede que sea algún problema con la instalación de MariaDB, así que te recomiendo que reinstales el paquete mariadb-server y sigas las instrucciones de nuevo tal y como indica la guia. Muchas veces pasa que puede que se siga algún paso de otra guía que se corresponda con operaciones que haya que realizar en otra distribución Linux o que alteren la configuración de MariaDB.

          También puede ser que el servidor mysql se haya detenido por alguna razón, así que en esos casos recuerda que puedes ejecutar “sudo service mysql restart” para reiniciar dicho servicio.

          ¡Suerte y un saludo!