Linux es el sistema operativo más utilizado para servir contenido a través de internet, y una de las combinaciones de servicios más populares consiste en servir páginas web dinámicas que almacenan contenidos en una base de datos. Aquí es donde entra en juego el Stack LEMP.
LEMP es el acrónimo de (L) linux, (E) nginX, (M) mysql/mariadb, (P) php. Compite a nivel de popularidad con el Stack LAMP (Linux, Apache, Mysql, PHP) al que suele superar en rendimiento debido al mejor desempeño de nginx sobre apache.
Poco podemos decir de este sistema operativo que no se conozca ya. Existe una gran diversidad de distribuciones Linux, siendo las más populares para el uso como servidor Debian, el padre de casi todas las distribuciones actuales, Ubuntu Server, que desciende de Debian o CentOS, que acaba de convertirse en una distribución Rolling Release.
En esta entrada utilizaremos Debian 11 Bullseye como base.
La gran alternativa a Apache, un balanceador proxy y servidor de contenidos que ha demostrado ser más rápido y eficiente que sus alternativas.
Al contrario que Apache, no crea diferentes procesos para cada solicitud, por lo que la carga de trabajo en el servidor es mucho menor u el rendimiento es más elevado.
Además de ser un servidor web ligero, nginx también se puede utilizar como proxy inverso para todo tipo de protocolos, como por ejemplo IMAP o POP3, redirigiendo las solicitudes entrantes, e incluso como un balanceador de carga entre varias instancias de un servicio.
MySQL es el sistema gestor de base de datos relacional por antonomasia. Desde la compra por parte de Oracle de Sun (comprando por tanto MySQL), apareció una bifurcación conocida como MariaDB impulsada por la comunidad y que está ganando terreno en la cuota de mercado.
MariaDB ofrece muchos más motores de base de datos, un rendimiento mayor a MySQL y mayor transparencia en su desarrollo frente a MySQL.
Cuando creamos una página web utilizamos el lenguaje de marcas HTML, sin embargo, con esto solo podemos crear contenido estático. Para poder proporcionar dinamismo a nuestros sitios web debemos utilizar un lenguaje procesado en el servidor, conocido como un Backend.
PHP es el lenguaje de programación más popular a la hora de proporcionar un backend a las páginas web dinámicas. Es el motor que mueve el blog que estás leyendo ahora mismo, y todos los sitios web en WordPress del mundo.
Lo primero que debemos comprobar es que nuestro usuario puede utilizar el comando sudo:
sudo whoami
Después actualizaremos nuestro registro de paquetes y los paquetes instalados:
sudo apt update && sudo apt upgrade -y
Instalaremos curl, un comando que tendremos que utilizar para descargar recursos desde nuestra consola:
sudo apt install curl -y
La práctica totalidad de las distribuciones linux incluyen nginx en sus repositorios de paquetes, y debian no es una excepción. Sin embargo, normalmente las versiones disponibles en estos repositorios no son las más actualizadas. Si queremos utilizar la última versión estable compatible con debian tenemos la suerte de contar con Ondřej Surý, un desarrollador de Debian que mantiene los repositorios de Debian y Ubuntu desde PHP 5. Añadimos el repositorio de nginx Stable:
curl -sSL https://packages.sury.org/nginx/README.txt | sudo bash -x
Actualizamos nuestro registro de paquetes:
sudo apt update
Instalamos nginx con sus dependencias y módulos opcionales:
sudo apt install nginx-core nginx-common nginx nginx-full
Uno de los módulos opcionales que hemos instalado es brotli, una biblioteca de compresión de código muy recomendable para nuestro servidor web. Habilitemos el módulo brotli:
brotli on; brotli_comp_level 6; brotli_static on; brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
Comprobamos que nuestra configuración de nginx es correcta:
sudo nginx -t
Habilitamos el arranque automático de nginx y lo reiniciamos para que aplique los últimos cambios que hemos añadido:
sudo systemctl enable nginx sudo systemctl restart nginx sudo systemctl status nginx
Nuevamente, podemos utilizar la versión por defecto de nuestra distribución o utilizar la versión estable más reciente de MariaDB compatible con nuestra distribución. En este caso, es el propio desarrollo de MariaDB quien nos proporciona un repositorio con las últimas versiones disponibles, así que añadimos el repositorio:
curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash \ -s -- --mariadb-server-version=10.7.3 --skip-maxscale --skip-tools
Actualizamos el registro de paquetes:
sudo apt update
Instalamos MariaDB:
sudo apt install mariadb-server mariadb-client -y
Comprobamos que la instalación es correcta:
mariadb --version
Habilitamos el arranque automático de MariaDB y lo arrancamos:
sudo systemctl enable mariadb sudo systemctl start mariadb sudo systemctl status mariadb
Bastionamos la instalación de MariaDB estableciendo una clave para el usuario root, impiendo que pueda acceder de forma remota, eliminando tablas de ejemplo, etc:
sudo mysql_secure_installation
Como comentamos durante la instalación de nginx, el desarrollador Ondřej Surý, nos ofrece en su repositorio versiones actualizadas de PHP desde su versión 5, por lo que añadimos el repositorio:
curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
Actualizamos el registro de paquetes:
sudo apt update
Instalamos PHP con los módulos adicionales. Los módulos que instalaremos dependen en gran medida de lo que vayamos a servir, siendo únicamente obligatorios php-fpm, ya que será el módulo encargado de procesar las solicitudes enviadas por nginx para servir nuestras páginas web dinámicas y php-mysql para poder dotar a PHP de conectividad con la base de datos:
sudo apt install php8.1-fpm php8.1-cli php8.1-common php8.1-mbstring \ php8.1-xmlrpc php8.1-soap php8.1-gd php8.1-xml php8.1-intl php8.1-mysql \ php8.1-cli php8.1-ldap php8.1-zip php8.1-mcrypt php8.1-curl php8.1-opcache \ php8.1-readline php8.1-xml php8.1-gd php8.1-memcached -y
Comprobamos que la instalación es correcta:
php -v
Habilitamos el arranque automático de php8.1-fpm y lo arrancamos:
sudo systemctl enable php8.1-fpm sudo systemctl start php8.1-fpm sudo systemctl status php8.1-fpm
¡Y eso es todo! Ya podemos empezar a servidor contenidos web dinámicos una vez configuremos nuestros sitios.
LEMP, Linux, Puesta en Producción Segura, Servidores, Tutoriales
[…] esta práctica se ha utilizado como entorno una máquina virtual Debian 11 con un Stack LEMP sobre el que realizaremos una instalación de una versión antigua de PHP, 5.6, para ser […]