Stack LEMP

DevOps,Puesta en producción

Stack LEMP

3 Mar , 2022  

Creación de un Stack LEMP con Debian 11, nginx 1.20.1, MariaDB 10.7.3 y PHP 8.1

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.

Qué es un 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.

Linux

Logotipo de Debian
Logotipo de Debian

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.

nginX

Logotipo de nginx
Logotipo de nginx

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.

MariaDB

Logotipo de MariaDB
Logotipo de MariaDB

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.

PHP

Logotipo de PHP
Logotipo de PHP

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.

Instalando nuestro Stack LEMP

Prerequisitos

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

nginx

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

MariaDB

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

PHP

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.

Presentación interactiva

, , , ,


One Response

  1. […] 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 […]

Deja un comentario

A %d blogueros les gusta esto: