Cómo instalar Nginx con PHP y MariaDB (LEMP Stack) con Opcache, Redis y Let’s Encrypt en Ubuntu

El acrónimo «LEMP» designa un conjunto de programas informáticos que suelen instalarse juntos para que un servidor pueda alojar sitios web dinámicos y aplicaciones web. Este término es en realidad un acrónimo que representa cuatro componentes clave:

  1. Linux: El sistema operativo. Linux es un popular sistema operativo de código abierto que sirve de base para el servidor.
  2. Engine-X(pronunciado como «nginx»): El servidor web. Nginx es un servidor web de alto rendimiento conocido por su estabilidad, amplio conjunto de funciones, configuración sencilla y bajo consumo de recursos.
  3. MySQLo MariaDB: El sistema de base de datos. MySQL es un sistema de gestión de bases de datos relacionales muy utilizado que almacena y gestiona los datos del sitio web o de la aplicación. Ten en cuenta que MySQL a veces se sustituye por MariaDB, una bifurcación de MySQL mejorada, totalmente de código abierto y desarrollada por la comunidad.
  4. PHP: El lenguaje de programación. PHP es un lenguaje de programación del lado del servidor diseñado para el desarrollo web, pero también se utiliza como lenguaje de programación de uso general.

La pila LEMP es una opción popular para alojar sitios web que requieren una base de datos y procesamiento del lado del servidor, como sitios web WordPress, plataformas de comercio electrónico y otras aplicaciones web dinámicas. Es comparable a la pila LAMP, en la que se utiliza Apache (representado por la «A» en LAMP) en lugar de Nginx.

En esta guía, instalarás una pila LEMP en un servidor basado en Ubuntu 20.04. También instalaremos phpMyAdmin, Redis, Opcache y Let’s Encrypt SSL.

Requisitos previos

  • Un servidor con Ubuntu 20.04.
  • Un usuario sudo no root.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update
    $ sudo apt upgrade
    
  • Pocos paquetes que necesite tu sistema.
    $ sudo apt install wget curl nano -y
    

    Puede que algunos de estos paquetes ya estén instalados en tu sistema.

Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Ubuntu viene con ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Deberías obtener la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow 80
$ sudo ufw allow 443

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver una salida similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Instala PHP

Ubuntu 20.04 viene por defecto con PHP 7.4, pero para tener un repositorio PHP actualizado, añadiremos el repositorio PHP de Ondrej.

Instala el repositorio PHP de Ondrej.

$ sudo add-apt-repository ppa:ondrej/php

Instala PHP 7.4 junto con algunos paquetes adicionales.

$ sudo apt install php-cli php-fpm php-mysql -y

Comprueba si PHP funciona correctamente.

$ php --version

Deberías ver una salida similar.

PHP 7.4.5 (cli) (built: Apr 28 2020 14:49:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

Instala MariaDB

MariaDB es un sustituto directo de MySQL, lo que significa que los comandos para ejecutar y utilizar MariaDB son los mismos que los de MySQL.

Ubuntu 20.04 incluye por defecto MariaDB 10.3, que está un poco obsoleta. Para obtener la última versión estable de Mariadb, instalaremos su repositorio oficial.

Añade el repositorio oficial de Mariadb.

$ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$ sudo add-apt-repository 'deb [arch=amd64] http://mirror.lstn.net/mariadb/repo/10.4/ubuntu focal main'

Para instalar MariaDB ejecuta el siguiente comando.

$ sudo apt install mariadb-server -y

Comprueba si MariaDB se ha instalado correctamente.

$ mysql --version

Deberías ver la siguiente salida.

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Habilita el servicio MariaDB.

$ sudo systemctl enable mariadb

Ejecuta el siguiente comando para realizar la configuración por defecto, como dar una contraseña de root, eliminar los usuarios anónimos, no permitir el inicio de sesión de root de forma remota y eliminar las tablas de prueba.

$ sudo mysql_secure_installation

Con MariaDB 10.4, ahora se te preguntará entre utilizar la contraseña de root o el plugin unix_socket. El plugin unix_socket te permite iniciar sesión en MariaDB con tus credenciales de usuario de Linux. Se considera más seguro, aunque necesitarás un nombre de usuario/contraseña tradicional para utilizar aplicaciones de terceros como phpMyAdmin. En este tutorial nos ceñiremos al uso del plugin unix_socket. Puedes seguir utilizando phpMyAdmin a través de cualquier usuario específico que crees para tus bases de datos.

Al pulsar Intro se elige la opción por defecto (la que está en mayúsculas, Y en este caso).

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): [PRESS ENTER]
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Enabled successfully!
Reloading privilege tables..
 ... Success!

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] [ANSWER n]
... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] [PRESS ENTER]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] [PRESS ENTER]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] [PRESS ENTER]
 \- Dropping test database...
 ... Success!
 \- Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] [PRESS ENTER]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Y ya está. La próxima vez que quieras acceder a MySQL, utiliza el siguiente comando

$ sudo mysql

Introduce tu contraseña de root cuando se te solicite.

Instalar Redis

Utiliza el siguiente comando para instalar Redis y la extensión PHP Redis correspondiente.

$ sudo apt install redis php-redis

Configurar el servidor Redis

Vamos a realizar algunas configuraciones básicas en el servidor Redis.

Abre el archivo /etc/redis/redis.conf con el editor Nano.

$ sudo nano /etc/redis/redis.conf

Dentro del archivo, localiza la directiva supervised. Esta directiva te permite declarar un sistema init para gestionar Redis como un servicio. Por defecto está configurado como no. Como estamos usando Ubuntu, que utiliza el sistema init systemd, cambia su valor de no a systemd como se indica a continuación.

supervised systemd

Si quieres que clientes remotos se conecten a tu instancia de Redis, busca la línea bind 127.0.0.1 y cámbiala por lo siguiente.

bind 0.0.0.0

También puedes cambiar el puerto por defecto en el que Redis escucha de 6379 a un valor de tu elección.

port 3458

Para configurar Redis como servidor de caché, establece los siguientes valores tal y como se indican.

maxmemory 256mb
maxmemory-policy allkeys-lru

Esto indica a Redis que elimine cualquier clave utilizando el algoritmo LRU cuando se alcance la memoria máxima de 256 MB. Puedes establecer el valor de la memoria según tus necesidades y el servidor que estés utilizando.

Puedes establecer una contraseña para que cualquier cliente que necesite Redis tenga que autenticarse primero. Para ello establece una contraseña utilizando la siguiente directiva.

requirepass  <AuthPassword>

Puedes encontrar más directivas para cambiar en el archivo de configuración. Cuando hayas terminado, pulsa Ctrl + X e introduce Y cuando se te pida para guardar el archivo.

Reinicia el servidor Redis para aplicar los cambios.

$ sudo systemctl restart redis

También tendremos que añadir la regla en nuestro Cortafuegos si quieres que los clientes remotos se conecten a él. De lo contrario, puedes saltarte este paso.

$ sudo ufw allow 6379/tcp

Tendrás que cambiar el valor del comando anterior para que coincida con el puerto que hayas elegido en el archivo de configuración anterior.

Instalar Nginx

Ubuntu 20.04 incluye por defecto la última versión Mainline de Nginx. (1.17.10). Sin embargo, pasaremos a utilizar el repositorio estable oficial de Nginx.

Instala primero algunos requisitos previos.

$ sudo apt install curl gnupg2 ca-certificates lsb-release

Algunos de ellos ya están instalados en tu sistema.

Añade el repositorio de Nginx.

$ echo "deb [arch=amd64] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
$ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

Instala Nginx.

$ sudo apt update
$ sudo apt install nginx -y

Comprueba si funciona correctamente.

$ nginx -v

Deberías ver la siguiente salida dependiendo de la versión de Nginx que hayas elegido instalar.

nginx version: nginx/1.18.0

Inicia y habilita Nginx.

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Abre la dirección IP de tu servidor en un navegador para ver la siguiente página. Esto significa que Nginx funciona correctamente.

Página por defecto de Nginx

Configurar Nginx

Configura los directorios donde vivirán los bloques del servidor.

$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

Crea el directorio donde vivirá tu sitio.

$ sudo mkdir /var/www/example.com/html -p

Utilizando la directiva -p se crean directorios padre que antes no existían.

Ejecuta el siguiente comando para añadir un archivo de configuración para tu sitio.

$ sudo nano /etc/nginx/sites-available/example.com.conf

Pega el siguiente código en el editor.

server {
  listen          *:80;
  server_name     example.com;
  root            /var/www/example.com/html;
  index           index.php index.html;

  location / {
    try_files   $uri $uri/ =404;
  }
    
  access_log /var/log/nginx/example.com.access.log;
  error_log /var/log/nginx/example.com.error.log;

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass  unix:/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include  fastcgi_params;
  }
}

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Este archivo asume que vamos a alojar example.com en el directorio /var/www/html. Si no vas a utilizar ningún dominio y vas a configurar tu servidor para que sea accesible sólo a través de la dirección IP/localhost, tendrás que eliminar la configuración del bloque de servidor correspondiente del archivo nginx.conf, de lo contrario se estropeará con el bloque de servidor que vayas a crear.

Activa este archivo de configuración vinculándolo al directorio sites-enabled.

$ sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf	

Pega las siguientes líneas después de la línea include /etc/nginx/conf.d/*.conf

include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;
types_hash_max_size 4096;

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo. Prueba la configuración de Nginx.

$ sudo nginx -t

Deberías ver la siguiente salida indicando que tu configuración es correcta.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Vuelve a cargar el servicio Nginx.

$ sudo systemctl reload nginx

Configurar PHP-FPM

Abre el archivo /etc/php-fpm.d/www.conf.

$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos PHP en nginx. Busca las líneas user=www-data y group=www-data en el archivo y cámbialas por nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

Busca también las líneas listen.owner=www-data y listen.group=www-data en el archivo y cámbialas por nginx.

listen.owner = nginx
listen.group = nginx

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia el proceso PHP-fpm.

$ sudo systemctl restart php7.4-fpm

Para probar tu configuración PHP, crea un archivo test.php en la carpeta html.

$ sudo nano /var/www/example.com/html/test.php

Añade el siguiente contenido y guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

<?php phpinfo();

Ejecuta http://<yourserverip>/test.php en tu navegador web y deberías ver lo siguiente.

Información PHP

Instalar phpMyAdmin

Vamos a instalar phpMyAdmin manualmente para nuestro tutorial.

En primer lugar, necesitamos instalar algunos paquetes PHP adicionales para que phpMyAdmin funcione.

$ sudo apt install php-mbstring php-zip php-gd php-json php-curl php-bz2 php-xml

Cambia al directorio /usr/share para descargar e instalar phpMyAdmin en él.

$ cd /usr/share

Descarga los archivos de phpMyAdmin. (Comprueba la última versión en su sitio web) Sólo instalaremos la versión en inglés.

$ sudo wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-english.tar.gz
$ tar xvzf phpMyAdmin-5.0.2-english.tar.gz
$ sudo mv phpMyAdmin-5.0.2-english /usr/share/phpmyadmin
$ sudo rm phpMyAdmin*.tar.gz

Da los permisos adecuados a la carpeta phpMyAdmin.

$ sudo chown -R nginx:nginx phpmyadmin 
$ sudo chmod -R 744 phpmyadmin 

Configura phpMyAdmin

Crea el archivo de configuración a partir del archivo de ejemplo proporcionado con el paquete.

$ sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

Necesitamos añadir un valor secreto en el archivo de configuración por motivos de cookies y seguridad. Utiliza los siguientes comandos para generar y añadir el código.

$ randomBlowfishSecret=$(openssl rand -base64 32)
$ sed -i "s|cfg\['blowfish_secret'\] = ''|cfg['blowfish_secret'] = '$randomBlowfishSecret'|" /usr/share/phpmyadmin/config.inc.php

Para que el servidor web Nginx encuentre y sirva correctamente los archivos phpMyAdmin, tendremos que crear un enlace simbólico desde su ubicación real al directorio raíz de documentos de Nginx.

Para ello, ejecuta el siguiente comando.

$ sudo ln -s /usr/share/phpmyadmin /var/www/example.com/html/phpmyadmin

Tu instalación de phpMyAdmin ya está operativa. Para acceder a ella, sólo tienes que abrir http://example.com/phpmyadmin.

Por defecto, esta ubicación predeterminada debe cambiarse, ya que es la ubicación más común en la que cualquier hacker puede localizar tu instalación de phpMyAdmin. Para ello, ejecuta el siguiente comando.

$ sudo mv /var/www/example.com/html/phpmyadmin /var/www/example.com/html/sm123

Básicamente, hemos movido la ubicación de nuestro phpMyAdmin a la carpeta sm123. Para acceder a ella, ahora tendrás que abrir http://example.com/sm123 en tu navegador.

Como aquí estamos utilizando unix_authentication con MySQL, no hay un usuario root al que acceder a través de phpMyAdmin. Tendrás que crear primero un usuario MySQL y darle privilegios sobre las bases de datos para poder utilizar phpMyAdmin.

Para ello, accede al shell de MySQL.

$ sudo mysql

Ahora, pega los siguientes comandos para crear un nuevo usuario y concederle todos los privilegios de base de datos.

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
EXIT

Ahora puedes iniciar sesión con este usuario en http://example.com/phpmyadmin.

Configurar Opcache

Si has seguido este tutorial, Opcache ya debería estar instalado con PHP. En caso de que no lo esté, puedes simplemente instalar Opcache utilizando el siguiente comando.

$ sudo apt install php7.4-opcache	

Comprueba que se ha instalado.

$ php -v
PHP 7.4.5 (cli) (built: Apr 28 2020 14:49:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

Para cambiar la configuración de Opcache, abre el archivo /etc/php/7.4/fpm/conf.d/10-opcache.ini.

$ sudo nano /etc/php/7.4/fpm/conf.d/10-opcache.ini

Pega el siguiente código al final del archivo. Los siguientes ajustes deberían servirte para empezar a utilizar Opcache y, en general, se recomiendan para obtener un buen rendimiento.

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia tu servidor para aplicar la configuración.

$ sudo systemctl restart php7.4-fpm

Instalar SSL a través de Let’s Encrypt

SSL se ha convertido en una parte esencial de cualquier sitio web. Aquí vamos a instalar SSL utilizando el servicio Let’s Encrypt.

Para ello, instala primero la herramienta Certbot.

$ sudo apt install certbot python3-certbot-nginx

Genera los certificados.

$ sudo certbot --nginx -d example.com

Si es la primera vez que ejecutas certbot en tu sistema, se te pedirá una dirección de correo electrónico y que aceptes las condiciones del servicio. También se te preguntará si aceptas compartir datos con la fundación EFF, a lo que puedes decir que no. Tras hacerlo, certbot se comunicará con los servidores de Let’s Encrypt y ejecutará un desafío para verificar tus dominios.

Si tiene éxito, se te preguntará cómo gestionar las redirecciones HTTPS.

Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Selecciona tu opción y pulsa Intro. A continuación se crearán tus certificados y se actualizarán tus archivos de configuración de Nginx con la configuración SSL.

Tus certificados están listos y ya puedes abrir tu sitio yendo a https://example.com

Verificar la renovación automática de SSL

Este es el último paso antes de terminar este tutorial.

Comprueba el proceso de renovación realizando una ejecución en seco del proceso de renovación.

$ sudo certbot renew --dry-run

Si no obtienes errores, significa que estás listo. Certbot renovará automáticamente tus certificados por ti. Se te enviará un correo electrónico avisándote de la caducidad del certificado.

Conclusión

Eso es todo en este tutorial. Tu configuración de LEMP está completa y puedes empezar a crear y alojar tus sitios web y aplicaciones.

También te podría gustar...