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
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:
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=1
y 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íneafastcgi_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:
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: