One place for hosting & domains

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


      Introducción

      La pila de software LEMP es un grupo de elementos de software que puede utilizarse para ofrecer páginas web y aplicaciones web dinámicas escritas en PHP. El acrónimo describe un sistema operativo Linux, con un servidor web Nginx (que se pronuncia ​como “Engine-X”). Los datos backend se almacenan en la base de datos de MySQL y el procesamiento dinámico se gestiona a través de PHP.

      En esta guía se muestra cómo de instalar una pila LEMP en un servidor de Ubuntu 20.04. El sistema operativo Ubuntu se ocupa de los primeros requisitos. Describiremos la manera de hacer funcionar el resto de los componentes.

      Requisitos previos

      Para completar este tutorial, necesitará acceso a un servidor de Ubuntu 20.04 como un non-root sudo user regular y un firewall habilitado en su servidor. Para configurarlo, puede consultar nuestra Guía de configuración inicial del servidor para Ubuntu 20.04.

      Paso 1: Instalar el servidor web Nginx

      Para mostrar páginas web a los visitantes de nuestro sitio, emplearemos Nginx, un servidor web de alto rendimiento. Utilizaremos el administrador de paquetes apt para obtener este software.

      Ya que esta es la primera vez que usamos apt para esta sesión, comience actualizando el índice de paquetes de su servidor. Después de eso, puede usar apt install para hacer instalar Nginx:

      • sudo apt update
      • sudo apt install nginx

      Cuando se le solicite, introduzca Y para confirmar que desea instalar Nginx. Cuando finalice la instalación, el servidor web de Nginx se activará y ejecutará en su servidor de Ubuntu 20.04.

      Si tiene habilitado el firewall ufw, como se recomienda en nuestra guía de configuración inicial del servidor, deberá permitir las conexiones con Nginx. Nginx registra algunos perfiles de aplicaciones UFW diferentes al realizar la instalación. Para verificar qué perfiles UFW están disponibles, ejecute lo siguiente:

      Output

      Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

      Se recomienda que habilite el perfil más restrictivo, pero que aún permita el tráfico que necesita. Debido a que no configuró SSL para su servidor a través de esta guía, solo deberá permitir el tráfico de HTTP habitual en el puerto 80.

      Puede habilitarlo escribiendo lo siguiente:

      • sudo ufw allow 'Nginx HTTP'

      Puede verificar el cambio ejecutando lo siguiente:

      El resultado de este comando mostrará que el tráfico de HTTP ahora está permitido:

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

      Una vez agregada la nueva regla del firewall, podrá probar si el servidor se encuentra en ejecución accediendo al nombre de dominio o a la dirección IP pública de su servidor en su navegador web.

      Si no tiene un nombre de dominio para su servidor y no conoce la dirección IP pública de este, puede encontrarla ejecutando siguiente comando:

      • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's//.*$//'

      Con esto se mostrarán algunas direcciones IP. Puede probar cada una de estas en su navegador web.

      Como alternativa, podrá verificar la dirección IP accesible, como se ve desde otras ubicaciones de Internet:

      Escriba la dirección que reciba en su navegador web. Esta lo llevará a la página de destino predeterminada de Nginx:

      http://server_domain_or_IP
      

      Página predeterminada de Nginx

      Si ve esta página, significa que instaló Nginx y que habilitó el tráfico de HTTP para su servidor web de manera correcta.

      Paso 2: Instalar MySQL

      Ahora que su servidor web está listo, debe instalar un sistema de base de datos para poder almacenar y gestionar los datos de su sitio. MySQL es un sistema de administración de bases de datos popular que se utiliza en entornos PHP.

      Una vez más, utilice apt para adquirir e instalar este software:

      • sudo apt install mysql-server

      Cuando se le solicite, confirme la instalación al escribir Y y, luego, ENTER.

      Cuando la instalación se complete, se recomienda ejecutar una secuencia de comandos de seguridad que viene preinstalada en MySQL Con esta secuencia de comandos se eliminarán algunos ajustes predeterminados poco seguros y se bloqueará el acceso a su sistema de base de datos. Inicie la secuencia de comandos interactiva ejecutando lo siguiente:

      • sudo mysql_secure_installation

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

      Nota: La habilitación de esta característica queda a discreción del usuario. Si se habilita, MySQL rechazará con un mensaje de error las contraseñas que no coincidan con los criterios especificados. Dejar la validación desactivada será una opción segura, pero siempre deberá utilizar contraseñas seguras y únicas para credenciales de bases de datos.

      Elija Y para indicar que sí, o cualquier otra cosa para continuar sin la habilitación.

      VALIDATE PASSWORD PLUGIN can be used to test passwords
      and improve security. It checks the strength of password
      and allows the users to set only those passwords which are
      secure enough. Would you like to setup VALIDATE PASSWORD plugin?
      
      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 2 para indicar el nivel más seguro, recibirá mensajes de error al intentar establecer cualquier contraseña que no contenga números, letras en mayúscula y minúscula, y caracteres especiales, o que se base en palabras comunes del diccionario.

      There are three levels of password validation policy:
      
      LOW    Length >= 8
      MEDIUM Length >= 8, numeric, mixed case, and special characters
      STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file
      
      Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
      

      Independientemente de que haya elegido instalar el VALIDATE PASSWORD PLUGIN, su servidor le solicitará, a continuación, que seleccione y confirme una contraseña para el root user de MySQL. No debe confundirse con el root del sistema. El root user de base de datos es un usuario administrativo con privilegios completos sobre el sistema de base de datos. Si bien el método de autenticación predeterminado del root user de MySQL no requiere el uso de una contraseña, incluso si hay una establecida, deberá definir una contraseña segura en este punto como una medida de seguridad adicional. Hablaremos de esto en breve.

      Si habilitó la validación de contraseña, se le indicará la seguridad de la contraseña del root user que acaba de ingresar y su servidor le preguntará si desea continuar usándola. Si está conforme con su contraseña actual, ingrese Y para indicar “sí” en la solicitud:

      Estimated 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 Y e ENTER en cada mensaje. Con esto, se eliminarán algunos usuarios anónimos y la base de datos de prueba, se deshabilitarán las credenciales de inicio de sesión remoto de root y se cargarán estas nuevas reglas para que MySQL aplique de inmediato los cambios que realizó.

      Cuando haya terminado, compruebe si puede iniciar sesión en la consola de MySQL escribiendo lo siguiente:

      Esto permitirá establecer conexión con el servidor de MySQL como root user de la base de datos administrativa, lo que se infiere del uso de sudo cuando se ejecuta este comando. Debería ver el siguiente resultado:

      Output

      Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>

      Para salir de la consola de MySQL, escriba lo siguiente:

      Observe que no necesitó proporcionar una contraseña para conectarse como root user, a pesar de que definió una al ejecutar la secuencia de comandos mysql_secure_installation. Esto se debe a que el método de autenticación predeterminado para el usuario administrativo de MySQL es unix_socket en vez de password. Si bien esto puede parecer un problema de seguridad inicialmente, hace que el servidor de la base de datos sea más seguro porque los únicos usuarios que pueden iniciar sesión como root user de My SQL son los usuarios del sistema con privilegios sudo que establecen conexión desde la consola o mediante una aplicación que se ejecute con los mismos privilegios. En términos prácticos, eso significa que no podrá usar el usuario root de la base de datos administrativa para establecer conexión desde su aplicación PHP. Establecer una contraseña para la cuenta root de MySQL es una medida de protección, en caso de que el método de autenticación predeterminado se cambie de unix_socket a password.

      Para mayor seguridad, es mejor disponer de cuentas de usuario dedicadas con privilegios de menor alcance configurados para cada base de datos, en especial si planea disponer de varias bases de datos alojadas en su servidor.

      Nota: Al momento de la redacción de este artículo, la biblioteca PHP nativa de MySQL mysqlnd no admite caching_sha2_authentication, el método de autenticación predeterminado de MySQL 8. Por este motivo, al crear usuarios de bases de datos para aplicaciones PHP en MySQL 8, deberá asegurarse de que estén configurados para usar mysql_native_password en su lugar. Demostraremos cómo hacerlo en el paso 6.

      Ahora, su servidor de MySQL está instalado y protegido. A continuación, instalaremos PHP, el componente final de la pila LEMP.

      Paso 3: Instalar PHP

      Instaló Nginx para suministrar su contenido y MySQL para almacenar y administrar sus datos. Ahora puede instalar PHP a fin de procesar el código y generar contenido dinámico para el servidor web.

      Aunque Apache integra el intérprete PHP en cada solicitud, Nginx requiere un programa externo para gestionar el procesamiento de PHP y actuar como puente entre el intérprete PHP en sí y el servidor web. Esto permite un mejor rendimiento general en la mayoría de los sitios web basados en PHP, pero requiere configuración adicional. Deberá instalar php-fpm, que significa “PHP fastCGI process manager”, e indicar a Nginx que pase solicitudes PHP a este software para su procesamiento. Además, necesitará php-mysql, un módulo PHP que permite a PHP comunicarse con las bases de datos basadas en MySQL. Los paquetes PHP básicos se instalarán automáticamente como dependencias.

      Para instalar los paquetes php-fpm y php-mysql, ejecute lo siguiente:

      • sudo apt install php-fpm php-mysql

      Cuando se le solicite, escriba Y y ENTER para confirmar la instalación.

      Ahora tiene instalado los componentes de PHP. A continuación, configurará Nginx para usarlos.

      Paso 4: Configurar Nginx para utilizar el procesador PHP

      Al emplear 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 único servidor. En esta guía, utilizaremos your_domain como un nombre de dominio de ejemplo. Consulte nuestra Introducción a DNS de DigitalOcean para hallar más información sobre la configuración de un nombre de dominio con DigitalOcean.

      En Ubuntu 20.04, Nginx tiene un bloque de servidor habilitado por defecto y está configurado para suministrar documentos desde un directorio en /var/www/html. Si bien esto da buenos resultados para un solo sitio, puede ser difícil de manejar si aloja varios. En lugar de modificar /var/www/html, crearemos una estructura de directorio dentro de /var/www para el sitio web your_domain y dejaremos /var/www/html establecido como directorio predeterminado que se suministrará si una solicitud de cliente no coincide con ningún otro sitio.

      Cree el directorio web root para your_domain de la siguiente manera:

      • sudo mkdir /var/www/your_domain

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

      • sudo chown -R $USER:$USER /var/www/your_domain

      Luego, abra un nuevo archivo de configuración en el directorio sites-available de Nginx con el editor de línea de comandos que prefiera. En este caso, utilizaremos nano:

      • sudo nano /etc/nginx/sites-available/your_domain

      De esta manera, se creará un nuevo archivo en blanco. Pegue la siguiente configuración básica:

      /etc/nginx/sites-available/your_domain

      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/php7.4-fpm.sock;
           }
      
          location ~ /.ht {
              deny all;
          }
      
      }
      
      
      

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

      • listen: define en qué puerto Nginx escuchará. En este caso, escuchará en el puerto 80, el puerto predeterminado para HTTP.
      • root: define el root de documentos en el que se almacenan los archivos disponibles en este sitio web.
      • index: especifica en qué orden dará prioridad Nginx a los archivos de índice de este sitio web. Normalmente se prioriza los archivos index.html por sobre los index.php para permitir establecer de manera rápida una página inicial de mantenimiento en las aplicaciones de PHP. Puede modificar estas opciones de configuración para que se adapten mejor a las necesidades de su aplicación.
      • server_name: define con qué nombres de dominio y/o direcciones de IP debe responder este bloque de servidor. Introduzca esta directiva en el nombre de dominio o la dirección IP pública de su servidor.
      • location /: el primer bloque de ubicación incluye una directiva try_files, la cual comprueba la existencia de archivos o directorios que coincidan con una solicitud de URI. Si Nginx no puede encontrar el recurso apropiado, mostrará un error 404.
      • location ~ .php$: este bloque de ubicación administra el procesamiento de PHP real al orientar a Nginx hacia el archivo de configuración fastcgi-php.conf y al archivo php7.4-fpm.sock, que declara el socket que se asocia con php-fpm.
      • location ~ /.ht: el último bloque de ubicación maneja archivos .htaccess, que Nginx no procesa. Al agregar la directiva deny all, si algunos de los archivos .htaccess ingresan de alguna forma en el root de documentos, estos no se suministrarán a los visitantes.

      Cuando finalice la edición, guarde y cierre el archivo. Si utiliza nano, puede hacerlo escribiendo CTRL+X, luego y ,y ENTER para confirmar.

      Establezca un vínculo con archivo de configuración del directorio sites-enabled de Nginx para activar su configuración:

      • sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

      Esto le indicará a Nginx que utilice la configuración la próxima vez que se vuelva a cargar. Puede verificar si hay errores en la sintaxis de su configuración al escribir:

      Si se detecta algún error, vuelva al archivo de configuración para revisar el contenido antes de continuar.

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

      • sudo systemctl reload nginx

      Ahora, su nuevo sitio web está activo, pero el directorio root web /var/www/your_domain todavía está vacío. Cree un archivo index.html en esa ubicación para poder probar que el nuevo bloque del servidor funcione según lo previsto:

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

      Incluya el siguiente contenido en este archivo:

      /var/www/your_domain/index.html

      <html>
        <head>
          <title>your_domain website</title>
        </head>
        <body>
          <h1>Hello World!</h1>
      
          <p>This is the landing page of <strong>your_domain</strong>.</p>
        </body>
      </html>
      

      Ahora, diríjase al navegador y acceda al nombre de dominio o la dirección IP de su servidor, tal como aparece en la directiva server_name en el archivo de configuración del bloque de servidor:

      http://server_domain_or_IP
      

      Verá una página como la siguiente:

      Bloque de servidor de Nginx

      Si ve esta página, su bloque de servidor de Nginx está funcionando según lo previsto.

      Puede dejar este archivo establecido como página de destino temporal de su aplicación hasta que configure un archivo index.php que lo sustituya. Cuando lo haga, recuerde eliminar el archivo index.html de su root de documentos, o cambiarle el nombre, ya que tendría precedencia sobre un archivo index.php por defecto.

      Ahora, la pila LEMP está completamente configurada. En el siguiente paso, crearemos una secuencia de comandos PHP para probar que Nginx, de hecho, puede gestionar los archivos .php en el sitio web que recién configuramos.

      Paso 5: Probar PHP con Nginx

      Su pila LEMP ahora debería estar configurada por completo. Puede probarla para validar que Nginx puede transferir correctamente archivos .php a su procesador PHP.

      Para hacerlo, cree un archivo PHP de prueba en el root de su documento. En el editor de texto, abra un archivo nuevo denominado info.php en el root de su documento:

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

      Escriba o pegue las siguientes líneas en el archivo nuevo. En ella se incluye código PHP válido que mostrará información sobre su servidor:

      /var/www/your_domain/info.php

      <?php
      phpinfo();
      

      Cuando termine, guarde y cierre el archivo escribiendo CTRL+X, luego y, y ENTER para confirmar.

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

      http://server_domain_or_IP/info.php
      

      Verá una página web que contiene información detallada sobre su servidor:

      PHPInfo Ubuntu 20.04

      Tras comprobar la información pertinente sobre su servidor PHP a través de esa página, es recomendable que elimine el archivo que creó, dado que contiene información confidencial sobre su entorno PHP y su servidor de Ubuntu. Puede usar rm para eliminar ese archivo:

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

      Siempre puede regenerar este archivo si lo necesita más adelante.

      Paso 6: Probar la conexión con la base de datos desde PHP (opcional)

      Si quiere probar si PHP puede establecer conexión con MySQL y ejecutar consultas a la base de datos, puede crear una tabla de prueba con datos ficticios y realizar consultas relacionadas con su contenido con una secuencia de comandos PHP. Para poder hacerlo, debemos crear una base de datos de prueba y un nuevo usuario de MySQL debidamente configurado para acceder a ella.

      Al momento de la redacción de este artículo, la biblioteca PHP nativa de MySQL mysqlnd no admite caching_sha2_authentication, el método de autenticación predeterminado de MySQL 8. Vamos a tener que crear un usuario nuevo con el método de autenticación mysql_native_password para poder establecer conexión con la base de datos de MySQL desde PHP.

      Crearemos una base de datos denominada example_database y un usuario llamado example_user, pero puede sustituir estos nombres por valores diferentes.

      Primero, establezca conexión con la consola de MySQL usando la cuenta root:

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

      • CREATE DATABASE example_database;

      Ahora puede crear un nuevo usuario y concederle privilegios completos sobre la base de datos personalizada que acaba de crear.

      El siguiente comando crea un usuario nuevo llamado example_user, que utiliza mysql_native_password como método de autenticación predeterminado. Definimos la contraseña de este usuario como password, pero debe sustituir este valor por una contraseña segura de su elección.

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

      Ahora, debemos darle permiso a este usuario a la base de datos example_database:

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

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

      Ahora, cierre el shell de MySQL con lo siguiente:

      Puede verificar si el usuario nuevo tiene los permisos adecuados al volver a iniciar sesión en la consola de MySQL, esta vez, con las credenciales de usuario personalizadas:

      Observe el indicador -p en este comando, que le solicitará la contraseña que utilizó cuando creó el usuario example_user. Después de iniciar sesión en la consola de MySQL, confirme que tenga acceso a la base de datos example_database:

      Con esto se generará el siguiente resultado:

      Output

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

      A continuación, crearemos una tabla de prueba denominada todo_list: Desde la consola de MySQL, ejecute la siguiente instrucción:

      • CREATE TABLE example_database.todo_list (
      • item_id INT AUTO_INCREMENT,
      • content VARCHAR(255),
      • PRIMARY KEY(item_id)
      • );

      Inserte algunas filas de contenido en la tabla de prueba. Es posible que quiera repetir el siguiente comando algunas veces, usando valores diferentes:

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

      Para confirmar que los datos se guardaron correctamente en su tabla, ejecute lo siguiente:

      • SELECT * FROM example_database.todo_list;

      Verá el siguiente resultado:

      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)

      Después de confirmar que haya datos válidos en su tabla de prueba, puede cerrar la consola de MySQL:

      Ahora, podrá crear una secuencia de comandos PHP que se conecte a MySQL y realice consultas relacionadas con su contenido. Cree un nuevo archivo PHP en su directorio web root personalizado usando su editor preferido. En este caso, usaremos nano:

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

      La siguiente secuencia de comandos PHP establece conexión con la base de datos de MySQL, realiza consultas relacionadas con el contenido de la tabla todo_list y muestra los resultados en una lista. Si hay un problema con la conexión de la base de datos, generará una excepción. Copie este contenido en su secuencia de comandos todo_list.php:

      /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 "<h2>TODO</h2><ol>";
        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();
      }
      

      Guarde y cierre el archivo cuando finalice la edición.

      Ahora, puede acceder a esta página en su navegador web al visitar el nombre de dominio o la dirección IP pública que configuró para su sitio web, seguido de /todo_list.php:

      http://server_domain_or_IP/todo_list.php
      

      Debería ver una página como esta, en la que se muestra el contenido que insertó en su tabla de prueba:

      Ejemplo de la lista “todo” PHP

      Eso significa que su entorno PHP está listo para establecer conexión con su servidor de MySQL e interactuar con él.

      Conclusión

      En esta guía, creamos una base flexible para presentar sitios web y aplicaciones PHP a sus visitantes usando Nginx como servidor web y MySQL como sistema de base de datos.

      Existen varios pasos posteriores que podría seguir a partir de este punto. Por ejemplo, debe asegurarse de que las conexiones con su servidor estén protegidas. Para ello, podría proteger su instalación de Nginx con Let’s Encrypt. Siguiendo esta guía, obtendrá un certificado TLS/SSL gratuito para su servidor, lo que permitirá ofrecer contenido mediante HTTPS.



      Source link

      Установка Linux, Nginx, MySQL, PHP (стека LEMP) в Ubuntu 20.04


      Введение

      Программный стек LEMP — это комплекс программного обеспечения, используемый для обслуживания динамических веб-страниц и веб-приложений, написанных на PHP. Аббревиатура LEMP обозначает операционную систему Linux с веб-сервером Nginx (произносится как «энджинкс»). Данные серверной части хранятся в базе данных MySQL, а динамическая обработка выполняется PHP.

      Это руководство рассказывает, как установить стек LEMP на сервер Ubuntu 20.04. Операционная система Ubuntu обеспечивает выполнение первого требования. Далее мы расскажем, как настроить и запустить все остальные компоненты.

      Предварительные требования

      Для выполнения настоящего обучающего руководства вам понадобится доступ к серверу Ubuntu 20.04 в качестве обычного non-root user с привилегиями sudo, а на вашем сервере должен быть включен брандмауэр. Чтобы выполнить настройку, воспользуйтесь руководством по первоначальной настройке сервера Ubuntu 20.04.

      Шаг 1 — Установка веб-сервера Nginx

      Для демонстрации веб-страниц посетителям нашего сайта мы будем использовать современный и эффективный веб-сервер Nginx. Мы будем использовать диспетчер пакетов apt для получения этого программного обеспечения.

      Поскольку в этом сеансе мы будем использовать apt впервые, нужно обновить указатель пакетов вашего сервера. После этого вы можете использовать apt install для установки Nginx:

      • sudo apt update
      • sudo apt install nginx

      При получении запроса введите y для подтверждения того, что вы хотите установить nginx. После завершения установки веб-сервер Nginx будет активирован и будет работать на вашем сервере Ubuntu 20.04.

      Если у вас включен брандмауэр ufw, как рекомендуется в руководстве по первоначальной настройке сервера, вам нужно разрешить подключение к Nginx. После установки Nginx регистрирует несколько разных профилей приложений UFW. Чтобы проверить, какие из профилей UFW доступны, выполните команду:

      Output

      Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

      Рекомендуется применять самый ограничивающий профиль, который будет разрешать желаемый трафик. Поскольку в этом руководстве вы не настроили SSL для своего сервера, вам нужно будет только разрешить трафик на порту 80.

      Для этого введите следующее:

      • sudo ufw allow 'Nginx HTTP'

      Для проверки изменения используйте команду:

      Результат выполнения этой команды покажет, что трафик HTTP теперь разрешен:

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

      После добавления нового правила брандмауэра вы можете проверить, запущен ли сервер, указав в браузере доменное имя вашего сервера или публичный IP-адрес.

      Если у вас нет доменного имени, указывающего на ваш сервер, и вы не знаете публичный IP-адрес вашего сервера, вы можете найти его, введя в терминал следующую команду:

      • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's//.*$//'

      Команда выведет несколько IP-адресов. Вы можете попробовать каждый из них в своем браузере.

      Также вы можете проверить доступность IP-адреса из других мест в интернете:

      Введите полученный адрес в браузер, и вы попадете на страницу Nginx по умолчанию:

      http://server_domain_or_IP
      

      Страница Nginx по умолчанию

      Если вы видите эту страницу, значит, вы успешно установили Nginx и активировали трафик HTTP для вашего веб-сервера.

      Шаг 2 — Установка MySQL

      Мы запустили веб-сервер, и теперь нам нужно установить СУБД, которая может хранить данные вашего сайта и управлять ими. MySQL — популярная СУБД, используемая в средах PHP.

      Используйте apt для получения и установки этого программного обеспечения:

      • sudo apt install mysql-server

      Для подтверждения установки введите Y, а затем нажмите ENTER.

      После завершения установки рекомендуется запустить скрипт безопасности, предустановленный в MySQL. Этот скрипт будет удалять некоторые небезопасные настройки по умолчанию и блокировать доступ к системе управления базы данных. Для запуска интерактивного скрипта введите следующую команду:

      • sudo mysql_secure_installation

      Скрипт предложит настроить плагин VALIDATE PASSWORD PLUGIN.

      Примечание. Эту функцию следует активировать при наличии разумных оснований. Если она активирована, MySQL будет отклонять пароли, не соответствующие определенным критериям, и выводить сообщение об ошибке. Оставить проверку отключенной достаточно безопасно, но для входа в базу данных всегда нужно использовать надежные уникальные пароли.

      Выберите Y для активации или любой другой вариант, чтобы продолжить без активации этой функции.

      VALIDATE PASSWORD PLUGIN can be used to test passwords
      and improve security. It checks the strength of password
      and allows the users to set only those passwords which are
      secure enough. Would you like to setup VALIDATE PASSWORD plugin?
      
      Press y|Y for Yes, any other key for No:
      

      Если вы ответите утвердительно, вам будет предложено выбрать уровень проверки пароля. Если вы укажете самый высокий уровень 2, система будет выводить сообщения об ошибке при попытке установки пароля, который не будет содержать цифры, буквы в верхнем и нижнем регистре и специальные символы или будет содержать распространенные словарные слова.

      There are three levels of password validation policy:
      
      LOW    Length >= 8
      MEDIUM Length >= 8, numeric, mixed case, and special characters
      STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file
      
      Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
      

      Вне зависимости от того, будете ли вы использовать плагин VALIDATE PASSWORD PLUGIN, ваш сервер предложит вам выбрать и подтвердить пароль для root user в MySQL. Не нужно путать его с системным пользователем root. root user базы данных — это пользователь с правами администратора, который имеет все права для работы с системой управления базы данных. Хотя в MySQL метод аутентификации root user по умолчанию не требует использования пароля даже при его наличии, задайте надежный пароль для обеспечения дополнительной безопасности. Чуть дальше мы расскажем об этом подробнее.

      Если вы включили использование паролей, вы увидите уровень надежности введенного пароля root, и ваш сервер запросит у вас подтверждение дальнейшего использования этого пароля. Если вас устраивает текущий пароль, введите Y в диалоге для подтверждения:

      Estimated 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
      

      Для всех остальных вопросов нужно выбирать Y и нажимать ENTER в каждом диалоге. Выбрав эти ответы, вы удалите ряд анонимных пользователей и тестовую базу данных, отключите возможность удаленного входа пользователя root и загрузите новые правила, чтобы внесенные изменения немедленно активировались в MySQL.

      Завершив настройку, проверьте возможность входа в консоль MySQL, набрав следующую команду:

      В результате будет установлено подключение к серверу MySQL с помощью пользователя root базы данных с правами администратора, который логически выводится в результате использования sudo при запуске данной команды. Результат должен выглядеть следующим образом:

      Output

      Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>

      Для выхода из консоли MySQL введите следующую команду:

      Обратите внимание, что для подключения под именем root user не требуется вводить пароль, хотя вы и задали его при запуске скрипта mysql_secure_installation. Это происходит, поскольку используемый по умолчанию метод аутентификации для пользователя MySQL с правами администратора — unix_socket, а не password. Хотя это может выглядеть как возможный источник проблем с безопасностью, на самом деле эти действия делают сервер базы данных более защищенным, поскольку единственные пользователи, которые могут выполнять вход в систему с правами доступа root для MySQL — это пользователи системы с привилегиями sudo, подключенные с использованием консоли или через приложение, использующее аналогичные привилегии. На практике это означает, что вы не сможете использовать root user базы данных с правами администратора для подключения из вашего приложения PHP. Настройка пароля учетной записи root MySQL работает как гарантия, если метод аутентификации по умолчанию меняется с unix_socket на password.

      Для дополнительной безопасности рекомендуется иметь специальные учетные записи пользователей с менее обширными привилегиями, особенно если вы планируете использовать несколько баз данных на сервере.

      Примечание. На момент написания этого руководства родная библиотека MySQL PHP mysqlnd не поддерживает caching_sha2_authentication, метод аутентификации MySQL 8 по умолчанию. Поэтому при создании пользователей базы данных для приложений PHP на MySQL 8 вам нужно убедиться, что вместо этого пароля они настроены на использование mysql_native_password. Мы расскажем об этом в шаге 6.

      Теперь ваш сервер MySQL установлен и защищен. Далее мы выполним установку PHP, последнего компонента стека LEMP.

      Шаг 3 — Установка PHP

      Вы установили Nginx для обслуживания вашего контента и MySQL для хранения и управления данными. Теперь вы можете установить PHP для обработки кода и генерации динамического контента для веб-сервера.

      Хотя Apache встраивает интерпретатор PHP в каждый запрос, Nginx требуется внешняя программа для обработки PHP и организации моста между самим интерпретатором PHP и веб-сервером. Это позволяет обеспечить более высокую производительность на большинстве веб-сайтов на базе PHP, но для этого необходимо выполнить дополнительную настройку. Вы должны установить php-fpm, т. е. диспетчер процессов PHP fastCGI, и указать Nginx на необходимость передачи запросов PHP данному программному обеспечению. Также вам потребуется php-mysql, модуль PHP, который позволяет PHP взаимодействовать с базами данных MySQL. Ключевые пакеты PHP автоматически будут установлены в качестве зависимостей.

      Для установки пакетов php-fpm и php-mysql воспользуйтесь следующей командой:

      • sudo apt install php-fpm php-mysql

      При поступлении запроса введите Y и ENTER для подтверждения установки.

      Теперь вы установили компоненты PHP. Далее вы настроите Nginx для их использования.

      Шаг 4 — Настройка Nginx для использования процессора PHP

      При использовании веб-сервера Nginx вы можете создавать блоки сервера (аналогичные виртуальным хостам в Apache) для инкапсуляции данных конфигурации и размещения на одном сервере нескольких доменов. В этом руководстве мы будем использовать your_domain в качестве примера доменного имени. Чтобы узнать больше о настройке доменного имени с помощью DigitalOcean, см. наше обучающее руководство Введение в DigitalOcean DNS.

      В Nginx на Ubuntu 20.04 по умолчанию включен один серверный блок, настроенный для вывода документов из директории /var/www/html. Хотя это хорошо работает для отдельного сайта, при размещении нескольких сайтов это может доставлять неудобства. Вместо изменения /var/www/html мы создадим внутри /var/www структуру директорий для нашего сайта your_domain, оставив /var/www/html​​​ в качестве директории по умолчанию для вывода в случае, если запросу клиента не соответствуют никакие другие сайты.

      Создайте корневую веб-директорию для your_domain следующим образом:

      • sudo mkdir /var/www/your_domain

      Затем необходимо назначить права владения для директории с помощью переменной среды $USER, которая будет использоваться для текущего системного пользователя:

      • sudo chown -R $USER:$USER /var/www/your_domain

      После этого откройте новый файл конфигурации в директории Nginx sites-available с помощью любого редактора командной строки. Мы будем использовать nano:

      • sudo nano /etc/nginx/sites-available/your_domain

      В результате будет создан новый пустой файл. Вставьте следующую пустую конфигурацию:

      /etc/nginx/sites-available/your_domain

      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/php7.4-fpm.sock;
           }
      
          location ~ /.ht {
              deny all;
          }
      
      }
      
      
      

      Ниже описано действие этих директив и блоков расположения:

      • listen — определяет, что будет прослушивать порт Nginx. В данном случае он будет прослушивать порт 80, используемый по умолчанию для протокола HTTP.
      • root — определяет корневую директорию документа, где хранятся файлы, обслуживаемые этим сайтом.
      • index — задает для Nginx приоритет обслуживания файлов индекса для этого сайта. Довольно часто вы указываете файлы index.html, которые имеют высший приоритет по сравнению с файлами index.php, чтобы обеспечить быструю настройку начальной страницы в приложениях PHP. Вы можете менять эти настройки в зависимости от потребностей вашего приложения.
      • server_name — определяет, на какие доменные имена и/или IP-адреса должен реагировать ваш серверный блок. Эта директива должна указывать на доменное имя или публичный IP-адрес вашего сервера.
      • location / — первый блок расположения включает директиву try_files, которая проверяет наличие файлов или директорий, соответствующих запросу URI. Если Nginx не сможет найти соответствующий ресурс, будет возвращена ошибка 404.
      • location ~ .php$ — этот блок расположения отвечает за фактическую обработку PHP посредством указания Nginx на файл конфигурации fastcgi-php.conf и файл php7.4-fpm.sock, который объявляет, какой сокет ассоциирован с php-fpm.
      • location ~ /.ht — последний блок расположения отвечает за файлы .htaccess, которые Nginx не обрабатывает. При добавлении директивы deny all, если любой из файлов .htaccess попадет в корневую директорию документа, они не будут выводиться посетителям.

      Когда вы закончите редактирование, сохраните и закройте файл. Если вы используете nano, можно ввести CTRL+X, а затем y и ENTER для подтверждения.

      Активируйте вашу конфигурацию посредством привязки к файлу конфигурации из директории Nginx sites-enabled:

      • sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

      Это укажет Nginx использовать эту конфигурацию в следующий раз при перезагрузке. Вы можете протестировать вашу конфигурацию на наличие ошибок синтаксиса с помощью команды:

      Если есть какие-либо ошибки, вернитесь в файл конфигурации и проверьте его содержание перед тем, как продолжить.

      Когда будете готовы, перезагрузите Nginx для внесения необходимых изменений:

      • sudo systemctl reload nginx

      Теперь ваш новый веб-сайт активен, но корневая веб-директория /var/www/your_domain все еще пуста. Создайте файл index.html в этом расположении, чтобы убедиться, что веб-сервер работает, как ожидалось:

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

      Внесите в файл следующее:

      /var/www/your_domain/index.html

      <html>
        <head>
          <title>your_domain website</title>
        </head>
        <body>
          <h1>Hello World!</h1>
      
          <p>This is the landing page of <strong>your_domain</strong>.</p>
        </body>
      </html>
      

      Теперь откройте браузер и получите доступ к доменному имени сервера или IP-адресу, как указано в директиве server_name в файле конфигурации вашего серверного блока:

      http://server_domain_or_IP
      

      Страница будет выглядеть следующим образом:

      Серверный блок Nginx

      Если вы видите эту страницу, это означает, что ваш серверный блок Nginx работает, как и ожидалось.

      Вы можете оставить этот файл в качестве временной начальной страницы для вашего приложения, пока не настроите файл index.php для его замены. Как только вы сделаете это, не забудьте удалить или переименовать файл index.html из корневой директории документов, так как он будет иметь приоритет перед фалом index.php по умолчанию.

      Теперь ваш стек LEMP полностью настроен. В следующем шаге мы создадим скрипт PHP для проверки способности Nginx обрабатывать файлы .php на вашем недавно настроенном веб-сайте.

      Шаг 5 — Тестирование PHP с помощью Nginx

      Теперь набор LEMP должен быть полностью настроен. Вы можете протестировать его, чтобы убедиться, что Nginx может правильно передавать файлы .php на процессор PHP.

      Вы можете сделать это, создав тестовый файл PHP в корневой директории документов. Откройте в своем текстовом редакторе новый файл с именем info.php внутри корневой директории документов:

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

      Введите или вставьте следующие строки в новый файл. Это корректный код PHP, который будет возвращать информацию о вашем сервере:

      /var/www/your_domain/info.php

      <?php
      phpinfo();
      

      После завершения сохраните и закройте файл с помощью команды CTRL+X, а затем введите y и ENTER для подтверждения.

      Теперь вы можете получить доступ к этой странице в веб-браузере, посетив доменное имя или публичный IP-адрес, настроенный в файле конфигурации Nginx, добавив /info.php в конце:

      http://server_domain_or_IP/info.php
      

      Вы увидите веб-страницу, содержащую подробную информацию о вашем сервере:

      PHPInfo Ubuntu 20.04

      После проверки соответствующей информации о вашем сервере PHP с помощью данной страницы рекомендуется удалить созданный вами файл, поскольку он содержит конфиденциальную информацию о вашей среде PHP и о вашем сервере Ubuntu. Вы можете использовать rm для удаления этого файла:

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

      При необходимости вы всегда сможете восстановить этот файл.

      Шаг 6 — Тестирование подключения к базе данных для PHP (необязательно)

      Если вы хотите проверить, может ли PHP подключаться к MySQL и выполнять запросы для базы данных, вы можете создать тестовую таблицу с шаблонными данными и запрашивать ее содержимое из скрипта PHP. Прежде чем сделать это, нам нужно создать тестовую базу данных и нового пользователя MySQL с правильной настройкой для доступа к ней.

      На момент написания этого руководства родная библиотека MySQL PHP mysqlnd не поддерживает caching_sha2_authentication, метод аутентификации по умолчанию для MySQL 8. Мы должны создать нового пользователя с помощью метода аутентификации mysql_native_password для подключения к базе данных MySQL из PHP.

      Мы создадим базу данных с именем example_database и пользователя с именем example_user, но вы можете использовать и другие имена.

      Вначале необходимо подключиться к консоли MySQL с помощью учетной записи root:

      Чтобы создать новую базу данных, запустите следующую команду в консоли MySQL:

      • CREATE DATABASE example_database;

      Теперь вы можете создать нового пользователя и предоставить ему полный набор прав для только что созданной вами базы данных.

      Следующая команда создает нового пользователя с именем example_user, используя mysql_native_password в качестве метода аутентификации по умолчанию. Следующая команда определяет пароль этого пользователя как password, но вы можете заменить его на безопасный пароль по вашему выбору.

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

      Теперь нам нужно предоставить этому пользователю разрешение для базы данных example_database:

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

      В результате пользователь example_user получит полный набор привилегий для базы данных example_database, но не будет обладать возможностью создания или изменения других баз данных на сервере.

      Теперь закройте оболочку MySQL:

      Вы можете проверить наличие у нового пользователя необходимых разрешений, выполнив повторный вход в консоль MySQL, на этот раз используя учетные данные вашего собственного пользователя:

      Обратите внимание на флаг -p в этой команде, который будет запрашивать пароль, который вы задаете при создании пользователя example_user. После входа в консоль MySQL убедитесь, что у вас есть доступ к базе данных example_database:

      Результат будет выглядеть следующим образом:

      Output

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

      Далее мы создадим тестовую таблицу с именем todo_list. Из консоли MySQL запустите следующее выражение:

      • CREATE TABLE example_database.todo_list (
      • item_id INT AUTO_INCREMENT,
      • content VARCHAR(255),
      • PRIMARY KEY(item_id)
      • );

      Теперь добавьте несколько строк содержимого в тестовую таблицу. Возможно, вам потребуется несколько раз повторить следующую команду, используя разные значения:

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

      Чтобы подтвердить, что данные были успешно сохранены в таблицу, запустите следующую команду:

      • SELECT * FROM example_database.todo_list;

      Вывод должен выглядеть так:

      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)

      Убедившись в том, что у вас есть надлежащие данные в тестовой таблице, вы можете закрыть консоль MySQL:

      Теперь вы можете создать скрипт PHP, который будет подключаться к MySQL и запрашивать ваше содержимое. Создайте новый файл PHP в пользовательской корневой веб-директории в предпочитаемом вами редакторе. Мы будем использовать nano:

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

      Следующий скрипт PHP подключается к базе данных MySQL и запросам по содержимому таблицы todo_list, выводя результаты в список. Если существует проблема подключения к базе данных, будет выдана ошибка. Скопируйте это содержимое в скрипт todo_list.php:

      /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 "<h2>TODO</h2><ol>";
        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();
      }
      

      Сохраните и закройте файл после завершения редактирования.

      Теперь вы можете получить доступ к этой странице в веб-браузере, посетив доменное имя или публичный IP-адрес, настроенный для вашего веб-сайта, добавив /todo_list.php в конце:

      http://server_domain_or_IP/todo_list.php
      

      Вы должны увидеть примерно следующую страницу, отображающую содержимое, которое вы добавили в тестовую таблицу:

      Пример списка дел PHP

      Это означает, что ваша среда PHP готова к подключению и взаимодействию с вашим сервером MySQL.

      Заключение

      С помощью этого руководства мы создали гибкую основу для обслуживания веб-сайтов PHP и приложений для ваших посетителей, используя Nginx в качестве веб-сервера и MySQL в качестве системы управления базы данных.

      Теперь можно выполнить ряд последующих шагов. Например, вы можете проверить защищенность соединений с вашим сервером. Для этого вы можете обеспечить безопасность установки Nginx с помощью Let’s Encrypt. Следуя указаниям настоящего руководства, вы получите бесплатный сертификат TLS/SSL для вашего сервера, который позволит ему обслуживать контент через протокол HTTPS.



      Source link

      Comment installer Linux, Nginx, MySQL, PHP (pile LEMP) sur Ubuntu 20.04


      Introduction

      La pile logicielle LEMP est un groupe de logiciels qui peuvent être utilisés pour servir des pages web dynamiques et des applications web écrites en PHP. Il s’agit d’un acronyme qui décrit un système d’exploitation Linux, avec un serveur Web Nginx (prononcé « Engine-X »). Les données backend sont stockées dans la base de données MySQL et le traitement dynamique est géré par PHP.

      Ce guide explique comment installer une pile LEMP sur un serveur Ubuntu 20.04. Le système d’exploitation Ubuntu prend en charge la première exigence. Nous allons vous décrire comment faire fonctionner les autres composants.

      Conditions préalables

      Pour suivre ce tutoriel, vous devez avoir accès à un serveur Ubuntu 20.04 en tant qu’utilisateur non-root ​​​​sud​o​​​ normal, et le pare-feu de votre serveur doit être activé. Pour configurer cela, vous pouvez notre guide de configuration initiale du serveur pour Ubuntu 20.04.

      Étape 1 – Installation du serveur web Nginx

      Afin d’afficher les pages web aux visiteurs de notre site, nous allons utiliser Nginx, un serveur web très performant. Nous allons utiliser le gestionnaire de packages apt pour obtenir ce logiciel.

      Etant donné que c’est la première fois que nous allons utiliser apt pour cette session, commencez par mettre à jour l’index des packages de votre serveur. Ensuite, vous pouvez utiliser apt install pour installer Nginx :

      • sudo apt update
      • sudo apt install nginx

      Lorsque vous y êtes invité, entrez y pour confirmer que vous voulez installer nginx. Une fois l’installation terminée, le serveur Web Nginx sera actif et s’exécutera sur votre serveur Ubuntu 20.04.

      Si le pare-feu ufw est activé, comme le recommande notre guide de configuration initiale du serveur, vous devez autoriser les connexions à Nginx. Lors de l’installation, Nginx enregistre quelques profils d’application UFW différents. Pour vérifier quels profils UFW sont disponibles, exécutez :

      Output

      Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

      Nous vous recommandons d’activer le profil le plus restrictif qui autorisera tout de même le trafic dont vous avez besoin. Puisque vous n’avez pas configuré SSL pour votre serveur dans ce guide, vous aurez seulement besoin d’autoriser le trafic HTTP régulier sur le port 80.

      Procédez à son activation en tapant :

      • sudo ufw allow 'Nginx HTTP'

      Vous pouvez vérifier le changement en exécutant :

      Le résultat de cette commande vous montrera que le trafic HTTP est désormais autorisé :

      Output

      Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

      Une fois la nouvelle règle de pare-feu ajoutée, vous pouvez tester si le serveur est opérationnel en accédant au nom de domaine ou à l’adresse IP publique de votre serveur dans votre navigateur Web.

      Si vous n’avez pas de nom de domaine pointé vers votre serveur et que vous ne connaissez pas l’adresse IP publique de votre serveur, vous pouvez la trouver en exécutant la commande suivante :

      • ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's//.*$//'

      Cela imprimera quelques adresses IP. Vous pouvez essayer chacune d’entre elles à tour de rôle dans votre navigateur web.

      Vous pouvez également vérifier quelle est l’adresse IP accessible, telle qu’elle est vue depuis d’autres endroits sur Internet :

      Saisissez l’adresse que vous recevez dans votre navigateur web : elle vous conduira à la page d’accueil par défaut de Nginx :

      http://server_domain_or_IP
      

      Page par défaut de Nginx

      Si vous voyez cette page, cela signifie que vous avez correctement installé Nginx et activé le trafic HTTP pour votre serveur web.

      Étape 2 — Installer MySQL

      Maintenant que vous avez un serveur web opérationnel, vous devez installer le système de base de données pour pouvoir stocker et gérer les données de votre site. MySQL est un système de gestion de base de données populaire utilisé dans les environnements PHP.

      Là encore, utilisez apt pour acquérir et installer ce logiciel :

      • sudo apt install mysql-server

      Lorsque vous y êtes invité, confirmez l’installation en tapant Y, puis ENTRÉE.

      Une fois l’installation terminée, il est recommandé d’exécuter un script de sécurité qui vient préinstallé avec MySQL. Ce script supprimera certains paramètres par défaut peu sûrs et verrouillera l’accès à votre système de base de données. Lancez le script interactif en exécutant :

      • sudo mysql_secure_installation

      Il vous sera demandé si vous souhaitez configurer le VALIDATE PASSWORD PLUGIN.

      Note : L’activation de cette fonction est en quelque sorte une question de jugement. Si elle est activée, les mots de passe qui ne correspondent pas aux critères spécifiés seront rejetés par MySQL avec une erreur. Laisser la validation désactivée est sans risque, mais vous devez toujours utiliser des mots de passe forts et uniques pour les identifiants de la base de données.

      Répondez Y pour oui, ou tout autre chose pour continuer sans activer.

      VALIDATE PASSWORD PLUGIN can be used to test passwords
      and improve security. It checks the strength of password
      and allows the users to set only those passwords which are
      secure enough. Would you like to setup VALIDATE PASSWORD plugin?
      
      Press y|Y for Yes, any other key for No:
      

      Si vous répondez « oui », il vous sera demandé de choisir un niveau de validation du mot de passe. Gardez à l’esprit que si vous entrez 2 pour le niveau le plus fort, vous recevrez des erreurs lorsque vous tenterez de définir un mot de passe qui ne contient pas de chiffres, de lettres majuscules et minuscules et de caractères spéciaux, ou qui est basé sur des mots communs du dictionnaire.

      There are three levels of password validation policy:
      
      LOW    Length >= 8
      MEDIUM Length >= 8, numeric, mixed case, and special characters
      STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file
      
      Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
      

      Que vous ayez ou non choisi de configurer le VALIDATE PASSWORD PLUGIN, votre serveur vous demandera ensuite de sélectionner et de confirmer un mot de passe pour l’utilisateur root de MySQL. Il ne faut pas confondre ce dernier avec le root du système. L’utilisateur root de la base de données est un utilisateur administratif disposant de tous les privilèges sur le système de base de données. Même si la méthode d’authentification par défaut pour l’utilisateur root de MySQL dispense de l’utilisation d’un mot de passe, même si celui-ci est défini, vous devez définir ici un mot de passe fort pour plus de sécurité. Nous en parlerons dans un instant.

      Si vous avez activé la validation du mot de passe, la force du mot de passe root que vous venez d’entrer vous sera indiquée et votre serveur vous demandera si vous voulez continuer avec ce mot de passe. Si vous êtes satisfait de votre mot de passe actuel, saisissez Y pour « oui » à l’invite :

      Estimated 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
      

      Pour le reste des questions, appuyez sur Y et appuyez sur la touche ENTRÉE à chaque invite. Cela supprimera les utilisateurs anonymes et la base de données de test, désactivera les connexions root à distance, et chargera ces nouvelles règles afin que MySQL respecte immédiatement les modifications que vous avez apportées.

      Lorsque vous avez terminé, vérifiez si vous êtes capable de vous connecter à la console MySQL en tapant :

      Cela permettra de se connecter au serveur MySQL en tant que root de l’utilisateur de la base de données administrative, ce qui est déduit par l’utilisation de sudo lors de l’exécution de cette commande. Vous devriez voir une sortie comme celle-ci :

      Output

      Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 22 Server version: 8.0.19-0ubuntu5 (Ubuntu) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql>

      Pour quitter la console MySQL, tapez :

      Notez que vous n’avez pas eu besoin de fournir un mot de passe pour vous connecter en tant qu’utilisateur root, même si vous en avez défini un lors de l’exécution du script mysql_secure_installation. En effet, la méthode d’authentification par défaut pour l’utilisateur administratif de MySQL est unix_socket au lieu du password. Même si cela peut sembler être un problème de sécurité au premier abord, cela rend le serveur de base de données plus sûr car les seuls utilisateurs autorisés à se connecter en tant qu’utilisateur MySQL root sont les utilisateurs du système ayant des privilèges sudo qui se connectent depuis la console ou par le biais d’une application fonctionnant avec les mêmes privilèges. Concrètement, cela signifie que vous ne pourrez pas utiliser l’utilisateur root de la base de données administrative pour vous connecter à partir de votre application PHP. La définition d’un mot de passe pour le compte root MySQL fonctionne comme une sauvegarde, dans le cas où la méthode d’authentification par défaut est changée de unix_socket au password.

      Pour une sécurité accrue, il est préférable de créer des comptes d’utilisateurs dédiés avec des privilèges moins étendus pour chaque base de données, surtout si vous prévoyez d’héberger plusieurs bases de données sur votre serveur.

      Note : Au moment de la rédaction de ce document, la bibliothèque MySQL PHP native mysqlnd ne prend pas en charge caching_sha2_authentification,la méthode d’authentification par défaut pour MySQL 8. Pour cette raison, lorsque vous créez des utilisateurs de base de données pour des applications PHP sur MySQL 8, vous devez vous assurer qu’ils sont configurés pour utiliser le mot de passe mysql_native_password à la place. Nous démontrerons comment le faire dans l’Étape 6.

      Votre serveur MySQL est maintenant installé et sécurisé. Ensuite, nous allons installer PHP, le dernier composant de la pile LEMP.

      Étape 3 – Installation de PHP

      Vous avez installé Nginx pour servir votre contenu et MySQL pour stocker et gérer vos données. Vous pouvez maintenant installer PHP pour traiter le code et générer du contenu dynamique pour le serveur web.

      Alors qu’Apache intègre l’interpréteur PHP dans chaque requête, Nginx nécessite un programme externe pour gérer le traitement PHP et agir comme un pont entre l’interpréteur PHP lui-même et le serveur web. Cela permet d’obtenir de meilleures performances globales dans la plupart des sites web basés sur PHP, mais cela nécessite une configuration supplémentaire. Vous devrez installer php-fpm (PHP fastCGI process manager) et indiquer à Nginx qu’il doit transmettre les requêtes PHP à ce logiciel pour qu’elles soient traitées. En outre, vous aurez besoin de php-mysql​​​​, un module PHP qui permet à PHP de communiquer avec des bases de données basées sur MySQL. Les packages PHP de base seront automatiquement installés en tant que dépendances.

      Pour installer les packages php-fpm et php-mysql, exécutez :

      • sudo apt install php-fpm php-mysql

      Lorsque vous y êtes invité, tapez Y et ENTER pour confirmer l’installation.

      Maintenant, vos composants PHP sont installés. Ensuite, vous allez configurer Nginx afin de pouvoir les utiliser.

      Étape 4 — Configuration de Nginx pour utiliser le processeur PHP

      Avec le serveur Web Nginx, vous pouvez créer des blocs de serveur (similaires aux hôtes virtuels dans Apache) pour encapsuler les détails de configuration et héberger plusieurs domaines sur un seul serveur. Dans ce guide, nous utiliserons l’exemple de nom de domaine your_domain. Pour en savoir plus sur la mise en place d’un nom de domaine avec DigitalOcean, voir notre introduction à DigitalOcean DNS. 

      Sur Ubuntu 20.04, Nginx dispose d’un bloc serveur activé par défaut qui est configuré pour servir des documents à partir d’un répertoire à /var/www/html. Même si cela fonctionne bien pour un seul site, cela peut devenir difficile à gérer si vous hébergez plusieurs sites. Au lieu de modifier /var/www/html, nous allons créer une structure de répertoire au sein de /var/www pour le site Web your_domain, en laissant /var/www/html en place comme répertoire par défaut à servir si une demande du client ne correspond à aucun autre site.

      Créez le répertoire racine Web pour your_domain comme suit :

      • sudo mkdir /var/www/your_domain

      Ensuite, attribuez la propriété du répertoire avec la variable d’environnement $USER qui fera référence à votre utilisateur actuel du système :

      • sudo chown -R $USER:$USER /var/www/your_domain

      Ouvrez ensuite un nouveau fichier de configuration dans le répertoire sites-available de Nginx en utilisant votre éditeur de ligne de commande préféré. Ici, nous utiliserons nano :

      • sudo nano /etc/nginx/sites-available/your_domain

      Cela créera un nouveau fichier vierge. Collez dans la configuration suivante :

      /etc/nginx/sites-available/your_domain

      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/php7.4-fpm.sock;
           }
      
          location ~ /.ht {
              deny all;
          }
      
      }
      
      
      

      Voici ce que font chacune de ces directives et blocs de localisation :

      • listen — Définit le port que Nginx écoutera. Dans ce cas, l’écoute se fera sur le port 80, le port par défaut de HTTP.
      • root — Définit la racine du document dans laquelle les fichiers servis par ce site Web sont stockés.
      • index — Définit dans quel ordre Nginx priorisera les fichiers d’index pour ce site Web. Il est courant de répertorier les fichiers index.html avec une priorité plus élevée que les fichiers index.php, pour permettre de configurer rapidement une page de destination de maintenance dans les applications PHP. Vous pouvez ajuster ces paramètres pour mieux répondre aux besoins de votre application.
      • server_name — Définit les noms de domaine et / ou adresses IP auxquels ce bloc serveur doit répondre. Pointez cette directive sur le nom de domaine ou l’adresse IP publique de votre serveur.
      • location / —Le premier bloc de localisation comprend une directive try_files, qui vérifie l’existence de fichiers ou de répertoires correspondant à une demande d’URI. Si Nginx n’arrive pas à trouver la ressource appropriée, il renverra une erreur 404.
      • location ~ .php$ — Ce bloc de localisation gère le traitement PHP réel en pointant Nginx vers le fichier de configuration fastcgi-php.conf et vers le fichier php7.4-fpm.sock, qui indique quel socket est associé à php-fpm.
      • location ~ /.ht — Le dernier bloc de localisation s’occupe des fichiers .htaccess que Nginx ne traite pas. En ajoutant la directive deny all, les fichiers .htaccess qui se retrouvent dans la racine du document ne seront pas présentés aux visiteurs.

      Une fois que vous avez terminé vos modifications, enregistrez et fermez le fichier. Si vous utilisez nano, vous pouvez le faire en appuyant sur CTRL + X, puis y et ENTER pour confirmer.

      Activez votre configuration en établissant un lien vers le fichier de configuration à partir du répertoire sites-enabled de Nginx :

      • sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

      Cela indiquera à Nginx d’utiliser la configuration lors du prochain rechargement. Vous pouvez vérifier si votre configuration contient des fautes de syntaxe en tapant :

      Si des erreurs sont signalées, revenez à votre fichier de configuration pour corriger son contenu avant de continuer.

      Une fois que vous êtes prêt, rechargez Nginx pour appliquer les modifications :

      • sudo systemctl reload nginx

      Votre nouveau site web est maintenant actif, mais le root web /var/www/your_domain est toujours vide. Créez un fichier index.html à cet endroit afin que nous puissions tester si le bloc de serveur fonctionne comme prévu :

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

      Incluez le contenu suivant dans ce dossier :

      /var/www/your_domain/index.html

      <html>
        <head>
          <title>your_domain website</title>
        </head>
        <body>
          <h1>Hello World!</h1>
      
          <p>This is the landing page of <strong>your_domain</strong>.</p>
        </body>
      </html>
      

      Maintenant, allez dans votre navigateur et accédez au nom de domaine ou à l’adresse IP de votre serveur, comme indiqué dans la directive server_name de votre fichier de configuration de bloc de serveur :

      http://server_domain_or_IP
      

      Vous verrez une page comme celle-ci :

      Nginx server block

      Si vous voyez cette page, cela signifie que votre bloc de serveur Nginx fonctionne comme prévu.

      Vous pouvez laisser ce fichier en place en tant que page d’accueil temporaire pour votre demande jusqu’à ce que vous créiez un fichier index.php pour le remplacer. Une fois que vous aurez fait cela, n’oubliez pas de supprimer ou de renommer le fichier index.html du root de votre document car il aurait la priorité sur un fichier index.php par défaut.

      Votre pile LEMP est maintenant entièrement configurée. A l’étape suivante, nous allons créer un script PHP pour tester que Nginx est vraiment capable de gérer les fichiers .php au sein de votre site Web nouvellement configuré.

      Étape 5 – Tester PHP avec Nginx

      Maintenant, votre pile LEMP devrait être entièrement installée. Vous pouvez la tester pour vérifier que Nginx peut correctement transmettre les fichiers .php à votre processeur PHP.

      Vous pouvez le faire en créant un fichier PHP de test dans la racine de votre document. Ouvrez un nouveau fichier appelé info.php dans la racine de votre document dans votre éditeur de texte :

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

      Saisissez ou collez les lignes suivantes dans le nouveau fichier. Il s’agit d’un code PHP valide qui renverra des informations sur votre serveur :

      /var/www/your_domain/info.php

      <?php
      phpinfo();
      

      Une fois que vous avez terminé, enregistrez et fermez le fichier en tapant CTRL+X, puis y et ENTER pour confirmer.

      Vous pouvez maintenant accéder à cette page dans votre navigateur Web en consultant le nom de domaine ou l’adresse IP publique que vous avez défini dans votre fichier de configuration Nginx, suivi de /info.php :

      http://server_domain_or_IP/info.php
      

      Vous verrez apparaître une page Web contenant des informations détaillées sur votre serveur :

      PHPInfo Ubuntu 20.04

      Après avoir vérifié les informations pertinentes sur votre serveur PHP par le biais de cette page, il est préférable de supprimer le fichier que vous avez créé car il contient des informations sensibles sur votre environnement PHP et votre serveur Ubuntu. Vous pouvez utiliser rm pour supprimer ce fichier :

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

      Vous pourrez toujours générer de nouveau ce fichier si vous en avez besoin plus tard.

      Étape 6 — Tester la connexion à la base de données à partir de PHP (facultatif)

      Si vous souhaitez tester si PHP est capable de se connecter à MySQL et d’exécuter des requêtes de base de données, vous pouvez créer une table de test avec des données factices et interroger son contenu à partir d’un script PHP. Avant cela, nous devons créer une base de données test et un nouvel utilisateur MySQL correctement configuré pour y accéder.

      Au moment de la rédaction du présent document, la bibliothèque MySQL PHP native mysqlnd ne prend pas en charge caching_sha2_authentification, la méthode d’authentification par défaut pour MySQL 8. Nous devrons créer un nouvel utilisateur avec le mot de passe mysql_native_password afin de pouvoir se connecter à la base de données MySQL à partir de PHP. 

      Nous allons créer une base de données appelée exemple_database et un utilisateur nommé example_user, mais vous pouvez remplacer ces noms par des valeurs différentes. 

      Tout d’abord, connectez-vous à la console MySQL en utilisant le compte root :

      Pour créer une nouvelle base de données, exécutez la commande suivante depuis votre console MySQL :

      • CREATE DATABASE example_database;

      Vous pouvez maintenant créer un utilisateur et lui accorder tous les privilèges sur la base de données personnalisée que vous venez de créer.

      La commande suivante crée un nouvel utilisateur nommé example_user, en utilisant mysql_native_password comme méthode d’authentification par défaut. Nous définissons le mot de passe de cet utilisateur comme password, mais vous devez remplacer cette valeur par un mot de passe sécurisé de votre choix. 

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

      Nous devons maintenant donner à cet utilisateur une autorisation sur la base de données example_database : 

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

      Cela donnera à l’utilisateur example_user tous les privilèges sur la base de données example_database, tout en empêchant cet utilisateur de créer ou de modifier d’autres bases de données sur votre serveur.

      Maintenant, quittez le shell MySQL avec :

      Vous pouvez tester si le nouvel utilisateur a les bonnes autorisations en vous connectant à nouveau à la console MySQL, cette fois-ci en utilisant les identifiants personnalisés de l’utilisateur :

      Remarquez le drapeau -p dans cette commande qui vous demandera le mot de passe utilisé lors de la création de l’utilisateur example_user. Après vous être connecté à la console MySQL, confirmez que vous avez accès à la base de données example_database :

      Cela donnera la sortie suivante :

      Output

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

      Ensuite, nous allons créer une table de test appelée todo_list. Depuis la console MySQL, lancez la déclaration suivante :

      • CREATE TABLE example_database.todo_list (
      • item_id INT AUTO_INCREMENT,
      • content VARCHAR(255),
      • PRIMARY KEY(item_id)
      • );

      Insérez quelques lignes de contenu dans la table de test. Vous pouvez répéter la commande suivante plusieurs fois, en utilisant des valeurs différentes :

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

      Pour confirmer que les données ont bien été enregistrées dans votre tableau, exécutez :

      • SELECT * FROM example_database.todo_list;

      Vous verrez la sortie suivante :

      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)

      Après avoir confirmé que vous avez des données valides dans votre table de test, vous pouvez quitter la console MySQL :

      Vous pouvez maintenant créer le script PHP qui se connectera à MySQL et interrogera votre contenu. Créez un nouveau fichier PHP dans votre répertoire root personnalisé en utilisant votre éditeur préféré. Nous utiliserons nano pour cela :

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

      Le script PHP suivant se connecte à la base de données MySQL et interroge le contenu de la table todo_list affichant les résultats dans une liste. S’il y a un problème avec la connexion à la base de données, il y aura une exception. Copiez ce contenu dans votre script todo_list.php : 

      /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 "<h2>TODO</h2><ol>";
        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();
      }
      

      Enregistrez et fermez le fichier lorsque vous avez fini de le modifier.

      Vous pouvez maintenant accéder à cette page dans votre navigateur web en consultant le nom de domaine ou l’adresse IP publique configurée de votre site web, suivi de /todo_list.php :

      http://server_domain_or_IP/todo_list.php
      

      Vous devriez voir une page comme celle-ci, montrant le contenu que vous avez inséré dans votre tableau de test :

      Exemple todo list PHP

      Cela signifie que votre environnement PHP est prêt à se connecter et à interagir avec votre serveur MySQL.

      Conclusion

      Dans ce guide, nous avons établi une base souple pour offrir des sites web et des applications PHP à vos visiteurs en utilisant Nginx comme serveur web et MySQL comme système de base de données.

      À partir de là, vous pouvez effectuer certain nombre d’étapes supplémentaires. Par exemple, vous devez vous assurer que les connexions à votre serveur sont sécurisées. Pour cela, vous pourriez sécuriser votre installation Nginx avec Let’s Encrypt. En suivant ce guide, vous allez acquérir un certificat TLS/SSL gratuit pour votre serveur, ce qui lui permettra de servir du contenu sur HTTPS.



      Source link