Cómo instalar Linux, Nginx, MySQL, PHP (pila LEMP) en Ubuntu

Introducción

Índice
  1. Introducción
  2. Cómo instalar Linux, Nginx, MySQL, PHP (pila LEMP) en Ubuntu
  • Prerrequisitos
  • Paso 1 – Instalación del servidor web Nginx
  • Paso 2: Instalación de MySQL
  • Paso 3 – Instalación de PHP
  • Paso 4: Configuración de Nginx para utilizar el procesador PHP
  • Paso 5 – Prueba de PHP con Nginx
  • Paso 6: Prueba de la conexión a la base de datos desde PHP (opcional)
  • Conclusion
  • La pila de software LEMP es un grupo de software que se puede utilizar para ofrecer páginas web dinámicas y aplicaciones web escritas en PHP. Se trata de un acrónimo que describe un sistema operativo Linux, con un servidor web Nginx (que se pronuncia como “ E ngine -X”). Los datos del backend se almacenan en la base de datos MySQL y PHP se encarga del procesamiento dinámico .

    Esta guía muestra cómo instalar una pila LEMP en un servidor Ubuntu. El sistema operativo Ubuntu se encarga de la parte Linux de la pila. Describiremos cómo poner en funcionamiento el resto de los componentes.

    Cómo instalar Linux, Nginx, MySQL, PHP (pila LEMP) en Ubuntu

    1. Instalación del servidor web Nginx
    2. Instalación de MySQL
    3. Instalación de PHP
    4. Configuración de Nginx para utilizar el procesador PHP
    5. Probando PHP con Nginx
    6. Probar la conexión a la base de datos desde PHP

    Prerrequisitos

    Para completar este tutorial, necesitarás acceso a un servidor Ubuntu como usuario normal, no root sudo , y un firewall habilitado en tu servidor. Para configurarlo, puedes seguir nuestra guía de configuración inicial de servidores para Ubuntu .

    Paso 1 – Instalación del servidor web Nginx

    Para mostrar páginas web a los visitantes del sitio, utilizará Nginx, un servidor web de alto rendimiento. Para descargar este software, utilizará el administrador de paquetes APT.

    Dado que esta es la primera vez que utiliza aptesta sesión, comience actualizando el índice de paquetes de su servidor:

    1. sudo apt update

    A continuación, ejecute apt installpara instalar Nginx:

    1. sudo apt install nginx

    Cuando se le solicite, presione Yy ENTERpara confirmar que desea instalar Nginx. Una vez finalizada la instalación, el servidor web Nginx estará activo y funcionando en su servidor Ubuntu.

    Si tiene el ufwfirewall habilitado, como se recomienda en nuestra guía de configuración inicial del servidor, deberá permitir conexiones a Nginx. Nginx registra algunos perfiles de aplicación UFW diferentes al momento de la instalación. Para verificar qué perfiles UFW están disponibles, ejecute:

    1. sudo ufw app list
    OutputAvailable applications:  Nginx Full  Nginx HTTP  Nginx HTTPS  OpenSSH

    Se recomienda que habilite el perfil más restrictivo que aún permita el tráfico que necesita. Dado que no ha configurado SSL para su servidor en esta guía, solo necesitará permitir el tráfico HTTP normal en el puerto 80.

    Habilite esto ejecutando lo siguiente:

    1. sudo ufw allow 'Nginx HTTP'

    Puedes verificar el cambio consultando el estado:

    1. sudo ufw status

    Esta salida muestra que ahora se permite el tráfico HTTP:

    OutputStatus: activeTo                         Action      From--                         ------      ----OpenSSH                    ALLOW       AnywhereNginx HTTP                 ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)Nginx HTTP (v6)            ALLOW       Anywhere (v6)

    Con la nueva regla de firewall agregada, puede probar si el servidor está en funcionamiento accediendo al nombre de dominio o la dirección IP pública de su servidor en su navegador web.

    Si no tiene un nombre de dominio apuntado a su servidor y no conoce la dirección IP pública de su servidor, puede encontrarla ejecutando cualquiera de los siguientes comandos:

    1. ip addr show
    1. hostname -I

    Esto imprimirá algunas direcciones IP. Puede probarlas una por una en su navegador web.

    Como alternativa, puede comprobar qué dirección IP es accesible, tal como se ve desde otras ubicaciones en Internet:

    1. curl -4 icanhazip.com

    Escribe la dirección que recibes en tu navegador web y te llevará a la página de destino predeterminada de Nginx:

    http://server_domain_or_IP

    Si recibe esta página, significa que ha instalado Nginx correctamente y habilitado el tráfico HTTP para su servidor web.

    Paso 2: Instalación de MySQL

    Ahora que tiene un servidor web en funcionamiento, debe instalar el sistema de base de datos para almacenar y administrar los datos de su sitio. MySQL es un sistema de administración de bases de datos popular que se utiliza en entornos PHP.

    Nuevamente, utilice aptpara adquirir e instalar este software:

    1. sudo apt install mysql-server

    Cuando se le solicite, confirme la instalación presionando Yy luego ENTER.

    Cuando finalice la instalación, se recomienda ejecutar un script de seguridad que viene preinstalado con MySQL. Este script eliminará algunas configuraciones predeterminadas inseguras y bloqueará el acceso a su sistema de base de datos. Inicie el script interactivo ejecutando el siguiente comando:

    1. sudo mysql_secure_installation

    Se le preguntará si desea configurar el VALIDATE PASSWORD PLUGIN.

    Nota: habilitar esta función es una cuestión de criterio. Si está habilitada, MySQL rechazará las contraseñas que no coincidan con los criterios especificados y generará un error. Es seguro dejar la validación deshabilitada, pero siempre debe usar contraseñas seguras y únicas para las credenciales de la base de datos.

    Responda Ysí o cualquier otra cosa para continuar sin habilitar:

    OutputVALIDATE PASSWORD COMPONENT can be used to test passwordsand improve security. It checks the strength of passwordand allows the users to set only those passwords which aresecure enough. Would you like to setup VALIDATE PASSWORD component?Press y|Y for Yes, any other key for No: 

    Si responde “sí”, se le solicitará que seleccione un nivel de validación de contraseña. Tenga en cuenta que si ingresa 2el nivel más seguro, recibirá errores al intentar establecer una contraseña que no contenga números, letras mayúsculas y minúsculas y caracteres especiales:

    OutputThere are three levels of password validation policy:LOW    Length = 8MEDIUM Length = 8, numeric, mixed case, and special charactersSTRONG Length = 8, numeric, mixed case, special characters and dictionary              filePlease enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

    Independientemente de si ha elegido configurar el VALIDATE PASSWORD PLUGIN, su servidor le solicitará que seleccione y confirme una contraseña para el usuario root de MySQL . Esto no debe confundirse con el usuario root del sistema . El usuario root de la base de datos es un usuario administrativo con privilegios completos sobre el sistema de base de datos. Aunque el método de autenticación predeterminado para el usuario root de MySQL prescinde del uso de una contraseña, incluso cuando se configura una , debe definir una contraseña segura aquí como medida de seguridad adicional. Hablaremos de esto en un momento.

    Si habilitó la validación de contraseña, se le mostrará la fortaleza de la contraseña raíz que ingresó y su servidor le preguntará si desea continuar con esa contraseña. Si está satisfecho con su contraseña actual, presione Y“sí” en el mensaje:

    OutputEstimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

    Para el resto de las preguntas, presione Yy mantenga presionada la ENTERtecla en cada mensaje. Esto eliminará algunos usuarios anónimos y la base de datos de prueba, deshabilitará los inicios de sesión remotos como root y cargará estas nuevas reglas para que MySQL respete inmediatamente los cambios que haya realizado.

    Cuando haya terminado, pruebe si puede iniciar sesión en la consola MySQL:

    1. sudo mysql

    Esto se conectará al servidor MySQL como usuario administrativo de la base de datos root , lo que se deduce del uso de sudoal ejecutar este comando. Debería recibir el siguiente resultado:

    OutputWelcome to the MySQL monitor.  Commands end with ; or g.Your MySQL connection id is 10Server version: 8.0.28-0ubuntu4 (Ubuntu)Copyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.mysql

    Para salir de la consola MySQL, escriba lo siguiente:

    1. exit

    Tenga en cuenta que no necesitó proporcionar una contraseña para conectarse como usuario root , aunque haya definido una al ejecutar el mysql_secure_installationscript. Esto se debe a que, cuando se instala en Ubuntu, el método de autenticación predeterminado para el usuario administrativo de MySQL es auth_socket, en lugar de un método que utiliza una contraseña. Esto puede parecer un problema de seguridad al principio, pero hace que el servidor de base de datos sea más seguro ya que los únicos usuarios a los que se les permite iniciar sesión como usuario root de MySQL son los usuarios del sistema con sudoprivilegios que se conectan desde la consola o a través de una aplicación que se ejecuta con los mismos privilegios. En términos prácticos, eso significa que no podrá utilizar el usuario root de la base de datos administrativa para conectarse desde su aplicación PHP.

    Para mayor seguridad, es mejor tener cuentas de usuario dedicadas con privilegios menos expansivos configurados para cada base de datos, especialmente si planea tener varias bases de datos alojadas en su servidor.

    Nota: Algunas versiones anteriores de la biblioteca PHP nativa de MySQL mysqlnd no admiten caching_sha2_authentication , el método de autenticación predeterminado para los usuarios creados en MySQL 8. Por ese motivo, al crear usuarios de bases de datos para aplicaciones PHP en MySQL 8, es posible que deba asegurarse de que estén configurados para usar mysql_native_passworden su lugar. Demostraremos cómo hacerlo en el Paso 6 .

    El servidor MySQL ya está instalado y protegido. A continuación, instalará PHP, el componente final de la pila LEMP.

    Paso 3 – Instalación de PHP

    Tienes instalado Nginx para servir tu contenido y MySQL para almacenar y administrar tus datos. Ahora puedes instalar PHP para procesar código y generar contenido dinámico para el servidor web.

    Mientras que Apache incorpora el intérprete PHP en cada solicitud, Nginx requiere un programa externo para manejar el procesamiento PHP y actuar como un puente entre el intérprete PHP y el servidor web. Esto permite un mejor rendimiento general en la mayoría de los sitios web basados ​​en PHP, pero requiere una configuración adicional. Necesitará instalar php8.1-fpm, que significa “administrador de procesos PHP fastCGI” y utiliza la versión actual de PHP (al momento de escribir esto), para indicarle a Nginx que pase las solicitudes PHP a este software para su procesamiento. Además, necesitará php-mysql, un módulo PHP que permite que PHP se comunique con bases de datos basadas en MySQL. Los paquetes PHP principales se instalarán automáticamente como dependencias.

    Para instalar los paquetes php8.1-fpmy php-mysql, ejecute:

    1. sudo apt install php8.1-fpm php-mysql

    Cuando se le solicite, presione Yy ENTERpara confirmar la instalación.

    Ya tienes instalados los componentes PHP. A continuación, configurarás Nginx para usarlos.

    Paso 4: Configuración de Nginx para utilizar el procesador PHP

    Al utilizar el servidor web Nginx, podemos crear bloques de servidor (similares a los hosts virtuales de Apache) para encapsular los detalles de configuración y alojar más de un dominio en un solo servidor. En esta guía, utilizaremos your_domain como nombre de dominio de ejemplo.

    Información: Para obtener más información sobre cómo configurar un nombre de dominio con DigitalOcean, lea nuestra introducción a DigitalOcean DNS .

    En Ubuntu, Nginx tiene un bloque de servidor habilitado de manera predeterminada y está configurado para servir documentos desde un directorio en /var/www/html. Si bien esto funciona bien para un solo sitio, puede volverse difícil de administrar si está alojando varios sitios. En lugar de modificar /var/www/html, crearemos una estructura de directorio dentro /var/wwwdel sitio web your_domain , dejando /var/www/htmlen su lugar el directorio predeterminado que se servirá si una solicitud de cliente no coincide con ningún otro sitio.

    Cree el directorio web raíz para su_dominio de la siguiente manera:

    1. sudo mkdir /var/www/your_domain

    A continuación, asigne la propiedad del directorio con la $USERvariable de entorno, que hará referencia a su usuario actual del sistema:

    1. sudo chown -R $USER:$USER /var/www/your_domain

    A continuación, abra un nuevo archivo de configuración en sites-availableel directorio de Nginx utilizando su editor de línea de comandos preferido. Aquí, utilizaremos nano:

    1. sudo nano /etc/nginx/sites-available/your_domain

    Esto creará un nuevo archivo en blanco. Inserte la siguiente configuración básica:

    /etc/nginx/sites-available/su_dominio

    server {    listen 80;    server_name your_domain www.your_domain;    root /var/www/your_domain;    index index.html index.htm index.php;    location / {        try_files $uri $uri/ =404;    }    location ~ .php$ {        include snippets/fastcgi-php.conf;        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;     }    location ~ /.ht {        deny all;    }}

    Esto es lo que hacen cada una de estas directivas y bloques de ubicación:

    • listen— Define en qué puerto escuchará Nginx. En este caso, escuchará en el puerto 80, el puerto predeterminado para HTTP.
    • root— Define la raíz del documento donde se almacenan los archivos servidos por este sitio web.
    • index— Define en qué orden Nginx priorizará los archivos de índice para este sitio web. Es una práctica común enumerar index.htmllos archivos con mayor prioridad que index.phplos archivos para permitir la configuración rápida de una página de destino de mantenimiento en aplicaciones PHP. Puede ajustar estas configuraciones para que se adapten mejor a las necesidades de su aplicación.
    • server_name— Define a qué nombres de dominio y/o direcciones IP debe responder este bloque de servidor. Apunte esta directiva al nombre de dominio o la dirección IP pública de su servidor.
    • location /— El primer bloque de ubicación incluye una try_filesdirectiva que verifica la existencia de archivos o directorios que coincidan con una solicitud de URL. Si Nginx no puede encontrar el recurso adecuado, devolverá un error 404.
    • location ~ .php$— Este bloque de ubicación maneja el procesamiento PHP real apuntando a Nginx al fastcgi-php.confarchivo de configuración y al php8.1-fpm.sockarchivo , que declara con qué socket está asociado php8.1-fpm.
    • location ~ /.ht— El último bloque de ubicación se ocupa de .htaccesslos archivos que Nginx no procesa. Al agregar la deny alldirectiva, si algún .htaccessarchivo llega a la raíz del documento, no se mostrará a los visitantes.

    Cuando hayas terminado de editar, guarda y cierra el archivo. Si estás usando nano, puedes hacerlo presionando CTRL+Xy luego Yy ENTERpara confirmar.

    Active su configuración vinculándose al archivo de configuración desde sites-enabledel directorio de Nginx:

    1. sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

    Luego, desvincule el archivo de configuración predeterminado del /sites-enabled/directorio:

    1. sudo unlink /etc/nginx/sites-enabled/default

    Nota : Si alguna vez necesita restaurar la configuración predeterminada, puede hacerlo recreando el enlace simbólico, como el siguiente:

    1. sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

    Esto le indicará a Nginx que use la configuración la próxima vez que se vuelva a cargar. Puede probar su configuración para detectar errores de sintaxis ejecutando lo siguiente:

    1. sudo nginx -t

    Si se informa algún error, regrese a su archivo de configuración para revisar su contenido antes de continuar.

    Cuando esté listo, vuelva a cargar Nginx para aplicar los cambios:

    1. sudo systemctl reload nginx

    Tu nuevo sitio web ya está activo, pero la raíz web aún está vacía. Crea un archivo en esa ubicación para que puedas probar que tu nuevo bloque de servidor funciona como se espera:/var/www/your_domainindex.html

    1. nano /var/www/your_domain/index.html

    Incluya el siguiente contenido en este archivo:

    /var/www/tu_dominio/index.html

    html  head    titleyour_domain website/title  /head  body    h1Hello World!/h1    pThis is the landing page of strongyour_domain/strong./p  /body/html

    Ahora vaya a su navegador y acceda al nombre de dominio o dirección IP de su servidor, tal como aparece en la server_namedirectiva en el archivo de configuración del bloque de su servidor:

    http://server_domain_or_IP

    Recibirás una página como la siguiente:

    Si recibe esta página, significa que su bloque de servidor Nginx está funcionando como se esperaba.

    Puede dejar este archivo como página de destino temporal para su aplicación hasta que configure un index.phparchivo para reemplazarlo. Una vez que lo haga, recuerde eliminar o cambiar el nombre del index.htmlarchivo de la raíz del documento, ya que tendría prioridad sobre un index.phparchivo de manera predeterminada.

    Ahora tu pila LEMP está completamente configurada. En el siguiente paso, crearás un script PHP para probar que Nginx pueda manejar .phparchivos dentro de tu sitio web recién configurado.

    Paso 5 – Prueba de PHP con Nginx

    Ahora tu pila LEMP debería estar completamente configurada. Puedes probarla para validar que Nginx puede transferir .phparchivos correctamente a tu procesador PHP.

    Puede hacerlo creando un archivo PHP de prueba en la raíz de su documento. Abra un nuevo archivo llamado info.phpdentro de la raíz de su documento en su editor de texto preferido:

    1. nano /var/www/your_domain/info.php

    Agregue las siguientes líneas al nuevo archivo. Este es un código PHP válido que devolverá información sobre su servidor:

    /var/www/su_dominio/info.php

    ?phpphpinfo();

    Cuando haya terminado, guarde y cierre el archivo.

    Ahora puede acceder a esta página en su navegador web visitando el nombre de dominio o la dirección IP pública que ha configurado en su archivo de configuración de Nginx, seguido de /info.php:

    http://server_domain_or_IP/info.php

    Recibirá una página web con información detallada sobre su servidor:

    Después de comprobar la información relevante sobre su servidor PHP a través de esa página, es mejor eliminar el archivo que ha creado, ya que contiene información confidencial sobre su entorno PHP y su servidor Ubuntu. Puede utilizar rmpara eliminar ese archivo:

    1. sudo rm /var/www/your_domain/info.php

    Siempre puedes regenerar este archivo si lo necesitas más adelante.

    Paso 6: Prueba de la conexión a la base de datos desde PHP (opcional)

    Si desea probar si PHP puede conectarse a MySQL y ejecutar consultas de base de datos, puede crear una tabla de prueba con datos ficticios y consultar su contenido desde un script PHP. Antes de hacerlo, debe crear una base de datos de prueba y un nuevo usuario MySQL configurado correctamente para acceder a ella.

    Nota: Algunas versiones anteriores de la biblioteca PHP nativa de MySQL mysqlnd no admiten caching_sha2_authentication , el método de autenticación predeterminado para MySQL 8; es posible que deba asegurarse de que estén configuradas para usarlo mysql_native_passworden su lugar.

    Crearemos una base de datos llamada example_database y un usuario llamado example_user , pero puedes reemplazar estos nombres con valores diferentes.

    Primero, conéctese a la consola MySQL usando la cuenta raíz :

    1. sudo mysql

    Para crear una nueva base de datos, ejecute el siguiente comando desde su consola MySQL:

    1. CREATE DATABASE example_database;

    Ahora puede crear un nuevo usuario y otorgarle privilegios completos en la base de datos personalizada que ha creado.

    El siguiente comando crea un nuevo usuario llamado example_user, utilizando mysql_native_passwordcomo método de autenticación predeterminado. Definimos la contraseña de este usuario como password, pero debes reemplazar este valor con una contraseña segura de tu elección.

    1. CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

    Ahora necesitamos darle a este usuario permiso sobre la example_databasebase de datos:

    1. GRANT ALL ON example_database.* TO 'example_user'@'%';

    Esto le dará al usuario example_user privilegios completos sobre la base de datos example_database y evitará que este usuario cree o modifique otras bases de datos en su servidor.

    Ahora salga del shell MySQL con el siguiente comando:

    1. exit

    You can test if the new user has the proper permissions by logging in to the MySQL console again, this time using the custom user credentials. Notice the -p flag in this command, which will prompt you for the password used when creating the example_user user:

    1. mysql -u example_user -p

    After logging in to the MySQL console, confirm that you have access to the example_database database:

    1. SHOW DATABASES;

    This will return the following output:

    Output+--------------------+| Database           |+--------------------+| example_database   || information_schema |+--------------------+2 rows in set (0.000 sec)

    Next, we’ll create a test table named todo_list. From the MySQL console, run the following statement:

    1. CREATE TABLE example_database.todo_list (
    2. item_id INT AUTO_INCREMENT,
    3. content VARCHAR(255),
    4. PRIMARY KEY(item_id)
    5. );

    Insert a few rows of content in the test table. You might want to repeat the next command a few times, using different values:

    1. INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

    To confirm that the data was successfully saved to your table, run:

    1. SELECT * FROM example_database.todo_list;

    Your output should display as follows:

    Output+---------+--------------------------+| item_id | content                  |+---------+--------------------------+|       1 | My first important item  ||       2 | My second important item ||       3 | My third important item  ||       4 | and this one more thing  |+---------+--------------------------+4 rows in set (0.000 sec)

    After confirming that you have valid data in your test table, you can exit the MySQL console:

    1. exit

    Now you can create the PHP script that will connect to MySQL and query for your content. Create a new PHP file in your custom web root directory using your preferred editor. We’ll use nano for that:

    1. nano /var/www/your_domain/todo_list.php

    The following PHP script connects to the MySQL database and queries for the content of the todo_list table, exhibiting the results in a list. If there’s a problem with the database connection, it will throw an exception.

    Add the following content to your todo_list.php script:

    /var/www/your_domain/todo_list.php

    ?php$user = "example_user";$password = "password";$database = "example_database";$table = "todo_list";try {  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);  echo "h2TODO/h2ol";   foreach($db-query("SELECT content FROM $table") as $row) {    echo "li" . $row['content'] . "/li";  }  echo "/ol";} catch (PDOException $e) {    print "Error!: " . $e-getMessage() . "br/";    die();}

    Save and close the file when you’re done editing.

    You can now access this page in your web browser by visiting the domain name or public IP address configured for your website, followed by /todo_list.php:

    http://server_domain_or_IP/todo_list.php

    You should receive a page like the following, showing the content you’ve inserted in your test table:

    That means your PHP environment is ready to connect and interact with your MySQL server.

    Conclusion

    In this guide, you built a flexible foundation for serving PHP websites and applications to your visitors, using Nginx as a web server and MySQL as the database system. You can do this with an Apache web server as well, check out our tutorial on How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu. You can also secure your site with Let’s Encrypt, which provides free, trusted certificates. Learn how to do this with our guide on Let’s Encrypt for Apache.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion