GNU/Linux >> Tutoriales Linux >  >> Debian

Instale Nginx con PHP y MySQL (LEMP) más SSL en Debian 10

LEMP es un acrónimo que representa la siguiente pila de software:Linux núcleo, Nginx servidor web, MariaDB base de datos (o MySQL ), y el PHP Lenguaje de programación del lado del servidor. Este software se usa ampliamente en servidores en Internet hoy en día para proporcionar sitios web dinámicos o aplicaciones web interactivas.

Nginx es un servidor web moderno y eficiente en recursos que se desarrolla activamente y es el segundo servidor web más utilizado en Internet después del servidor Apache HTTP. Es particularmente rápido porque utiliza un enfoque asincrónico basado en eventos para procesar las solicitudes.

Este tutorial le muestra cómo instalar y configurar la pila LEMP (Nginx con MariaDB y PHP 7) en la última versión de Debian 10.

REQUISITOS

  • La última versión del sistema operativo Debian 10, que se puede obtener desde el siguiente enlace https://www.debian.org/CD/http-ftp/, instalada desde cero en un VPS, máquina virtual o directamente en una máquina dedicada.
  • Acceso directo a la consola del servidor o una conexión SSH remota.
  • Una interfaz de red configurada con una dirección IP estática para la máquina
  • Un nombre de dominio público registrado con registros DNS A y CNAME (www) configurados en el lado del servidor de nombres. En esta guía, usamos el dominio example.com como ejemplo.

Paso 1:Configuración inicial

El primer paso es iniciar sesión como root o con un usuario con privilegios de root en su sistema y actualizar los componentes de Debian 10 (actualizaciones del kernel, actualizaciones de paquetes y parches de seguridad) emitiendo los siguientes comandos.

sudo apt  update
sudo apt upgrade
sudo apt dist-upgrade

A continuación, asegúrese de agregar un nombre descriptivo para el nombre de host de su máquina ejecutando el siguiente comando. Posteriormente, debe reiniciar el sistema para aplicar el nuevo nombre de host en consecuencia.

sudo hostnamectl set-hostname hostname.yourdomain.com
sudo init 6

Luego, continúe e instale las utilidades wget, curl y bash-completion de net-tools para usarlas más tarde para administrar fácilmente su servidor Debian.

sudo apt install net-tools sudo wget curl bash-completion

Paso 2:Instale el servidor web Nginx

Nginx es un servidor web moderno y eficiente en recursos que se utiliza para mostrar páginas web a los visitantes en Internet. Instale el servidor web Nginx desde el repositorio de Debian 10 ejecutando el siguiente comando en la consola de su servidor.

sudo apt-get install nginx

Como se muestra en la imagen de arriba, el administrador de paquetes apt verificará las dependencias adicionales para el paquete y le preguntará si acepta continuar con el proceso de instalación. Responda con sí (y ) para instalar Nginx.

A continuación, ejecute netstat Comando para mostrar los sockets de red en su sistema y verificar si el demonio nginx está escuchando en el puerto 80/TCP. Alternativamente, es posible que desee emitir systemctl Comando para verificar el estado del demonio nginx como se ilustra en la imagen a continuación.

sudo netstat -tlp
sudo netstat –tlpn
sudo systemctl status nginx.service

Una vez que el servidor nginx esté funcionando en su sistema, emita ifconfig Comando para mostrar la información de las interfaces de red y enumerar las direcciones IP de su máquina. Luego, abra un navegador y visite la página web predeterminada de Nginx a través del protocolo HTTP agregando la dirección IP en su navegador. El mensaje "¡Bienvenido a Nginx!" debería aparecer en la ventana de su navegador.

http://www.ejemplo.com

o

http://192.168.0.100

Paso 3:active el protocolo Nginx HTTP/2.0

De forma predeterminada, las últimas versiones de los archivos binarios de Nginx proporcionados por los repositorios de Debian 10 se crean con el protocolo HTTP/2.0. HTTP/2.0 está integrado con los protocolos TSL/SSL y puede mejorar la velocidad de carga de la página web a través de transacciones seguras.

Todos los navegadores modernos, como Chrome o Firefox, deberían admitir este protocolo de forma predeterminada. Sin embargo, tenga en cuenta que los navegadores Microsoft Internet Explorer y Microsoft Edge aún no pueden analizar el protocolo http2.

Para habilitar el protocolo HTTP/2.0 en Nginx en Debian 10, debe realizar algunos cambios en el archivo de configuración predeterminado de Nginx o crear un nuevo archivo de configuración y agregar el bloque de código TLS para 443 servidores. Para lograr esto, primero cree una copia de seguridad de la configuración disponible predeterminada de los sitios de Nginx ejecutando el siguiente comando. Confirme que la copia de seguridad se realizó correctamente enumerando el contenido del directorio de sitios disponibles.

sudo cp /etc/nginx/sites-available/default{,.backup}
ls /etc/nginx/sites-available/

A continuación, cree un archivo de configuración Nginx TLS con un editor de texto y agregue el siguiente contenido.

sudo nano /etc/nginx/sites-available/default-ssl

SSL predeterminado extracto del archivo:

    server {
                listen 443 ssl http2 default_server;
                listen [::]:443 ssl http2 default_server;
                #server_name  www.domain.tld;
                server_name _;
                                
                root /var/www/html;
                                
                access_log /var/log/nginx/access.log;
                error_log /var/log/nginx/error.log;
                
                #SSL Certificates
                ssl_certificate "/etc/nginx/ssl/cert.pem";
                ssl_certificate_key "/etc/nginx/ssl/privekey.pem";
                ssl_dhparam /etc/nginx/ssl/dhparam.pem;
                
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                #ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 
                ssl_session_cache shared:SSL:1m;
                ssl_session_timeout 10m;
                ssl_ciphers HIGH:!aNULL:!MD5;
                ssl_prefer_server_ciphers  on;
               
                add_header Strict-Transport-Security "max-age=31536000;
                #includeSubDomains" always;
 
                location / {
                index index.php index.html index.htm;
                    try_files $uri $uri/ /index.php?$args $uri/ =404;
                }
 
                                set $cache_uri $request_uri;
                
                location ~ /.well-known {
                allow all;
                               }
               location ~ \.php$ {
                                include snippets/fastcgi-php.conf;
                #
                #             # With php-fpm (or other unix sockets):
                              fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                #             # With php-cgi (or other tcp sockets):
                #             fastcgi_pass 127.0.0.1:9000;
                }
 
                # deny access to .htaccess files, if Apache's document root
                # concurs with nginx's one
                #
                #location ~ /\.ht {
                #             deny all;
                #}
                   }

La declaración que permite el uso del protocolo HTTP/2.0 está representada por la palabra http2 de la línea de abajo.

 listen 443 ssl http2 default_server;

En caso de que los navegadores de sus visitantes no admitan el protocolo HTTP2, elimine el http2 palabra de las configuraciones de su servidor para deshabilitar el protocolo y reiniciar el servicio nginx para aplicar los cambios.

En caso de que tenga un dominio registrado o use alojamiento virtual basado en direcciones IP, debe agregar su nombre de dominio o dirección IP después de nombre_del_servidor directiva como se muestra en el siguiente ejemplo.

server_name www.example.com example.com;

Una vez que haya terminado de editar el archivo de configuración predeterminado de Nginx con la configuración anterior

Configurar SSL en Nginx

En el archivo de configuración TSL anterior de nginx, hemos especificado la ruta para el certificado y la clave TLS. Dado que aún no hemos instalado las claves en su sistema, ingrese el siguiente comando para generar el archivo y la clave del certificado SSL autofirmado. Durante la generación del certificado SSL, se le harán una serie de preguntas. Ingrese el código de dos dígitos de su país, estado o provincia, el nombre de su ciudad, el nombre de su organización, el nombre de la unidad de su organización, el nombre común de su servidor y una dirección de correo electrónico válida. Debe asegurarse de configurar el Nombre común para que coincida con el registro FQDN de su computadora desde el servidor DNS o la dirección IP de su servidor utilizada para acceder al sitio web. El certificado y la clave se almacenan en un nuevo directorio bajo el directorio nginx llamado ssl, como se muestra en la siguiente captura de pantalla.

sudo mkdir /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/privekey.pem -out /etc/nginx/ssl/cert.pem
ls /etc/nginx/ssl/

Además, genere un nuevo cifrado Diffie-Hellman fuerte, que se puede encontrar en el archivo de configuración anterior en ssl_dhparam línea de declaración, emitiendo el siguiente comando:

sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

Finalmente, una vez que haya generado la clave Diffie-Hellman, active el archivo de configuración de TLS creando un enlace simbólico para default-ssl archivo de configuración de sitios disponibles directorio a habilitado para sitios directorio emitiendo el siguiente comando.

ln -s /etc/nginx/sites-available/default-ssl /etc/nginx/sites-enabled/

A continuación, pruebe el archivo de configuración de Nginx en busca de errores de sintaxis y, si todo está bien, reinicie el demonio de Nginx para aplicar todos los cambios ejecutando los siguientes comandos.

sudo nginx -t
sudo systemctl restart nginx.service

Compruebe si la configuración SSL tuvo éxito

Para confirmar si el servidor web Nginx está vinculado al puerto SSL, emita el comando netstat y verifique si el puerto 443 se muestra en modo de escucha.

netstat -tlpn | grep nginx

La siguiente captura de pantalla ilustra los pasos anteriores.

Luego, navegue hasta su nombre de dominio o la dirección IP de su servidor a través del protocolo HTTP desde un navegador para mostrar la página predeterminada de nginx. Debido a que está utilizando certificados autofirmados, debería mostrarse un error en su navegador. Confirme el error para pasar a la página principal predeterminada de nginx.

En caso de que Nginx no proporcione un index.html predeterminado página en el directorio webroot, emita el siguiente comando para crear la página de índice.

echo "test page" | tee /var/www/html/index.html

Para confirmar la presencia del protocolo HTTP/2.0 anunciado por Nginx, emita el siguiente comando. Busque h2 palabra en protocolos anunciados por el servidor.

 openssl s_client -connect localhost:443 -nextprotoneg ''

También puede visualizar el estado de la conexión y verificar si Nginx anuncia el protocolo http2 desde el navegador Chrome presionando la tecla de función F12 y solicitar la página. Para mostrar el protocolo utilizado por la solicitud, vaya a la pestaña Red, haga clic con el botón derecho en el menú Tipo y marque Protocolo archivado. El protocolo HTTP2 debe mostrarse como h2 en la columna del protocolo actual, como se ilustra en la siguiente captura de pantalla.

Paso 4:Instale PHP 7

El servidor web Nginx puede servir contenido web dinámico con la ayuda del intérprete del lenguaje de programación PHP a través del administrador de procesos PHP FastCGI al que Nginx pasa las solicitudes de procesamiento. El administrador de procesos FastCGI se puede obtener instalando php-fpm paquete precompilado ofrecido por los repositorios oficiales de Debian 9.

Para instalar el administrador de procesos php-fpm y el intérprete PHP7.0 en el sistema junto con los paquetes adicionales que permitirán que PHP se comunique con el servidor web Nginx, emita el siguiente comando en la consola de su servidor:

sudo apt install php7.3 php7.3-fpm php7.3-curl php7.3-gd

Iniciar PHP-FPM

Una vez que el intérprete PHP 7.3 se haya instalado correctamente en su sistema, inicie y verifique el demonio php7.3-fpm emitiendo el siguiente comando:

sudo systemctl start php7.3-fpm
sudo systemctl status php7.3-fpm

En el archivo de configuración TLS anterior de Nginx, ya hemos agregado las configuraciones de bloque para el administrador de procesos PHP FastCGI para servir contenido dinámico. El bloque de código que permite a Nginx usar el intérprete de PHP se muestra en el siguiente extracto, por lo que no se necesitan más pasos para modificar el archivo de configuración de Nginx TSL. El signo de hashtag # desde el principio de las líneas en la siguiente captura de pantalla son comentarios. El servidor web Nginx ignora las líneas comentadas de los archivos de configuración de forma predeterminada.

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}

Configuración PHP de prueba

Para probar y validar si Nginx puede pasar correctamente archivos php al procesador PHP, cree un PHP info.php pruebe el archivo de configuración emitiendo el siguiente comando

sudo su -c 'echo "<?php phpinfo(); ?>" > /var/www/html/info.php'

Luego, visite la página de información de php en su navegador web navegando hasta el nombre de dominio de su servidor o la dirección IP pública seguida de /info.php como se muestra en la imagen de abajo.

https://www.ejemplo.com/info.php

o

http://192.168.0.100/info.php

También puede comprobar si el servidor anuncia el protocolo HTTP/2.0 buscando la línea $_SERVER[‘SERVER_PROTOCOL’] en Variables de PHP.

Para instalar otros módulos PHP7.3, ejecute apt search php7.3 comando para encontrar un módulo PHP específico e instalarlo. Si planea instalar un sistema de administración de contenido, como WordPress, instale estos módulos adicionales:

sudo apt install php7.3-mcrypt php7.3-mbstring

Sin embargo, los módulos PHP recién instalados no están habilitados de forma predeterminada en su sistema. Para activarlos, reinicie el servicio PHP-FPM.

sudo systemctl restart php7.3-fpm.service

Paso 5:Instalar la base de datos MariaDB

Finalmente, falta la última pieza del rompecabezas de la pila LAMP en la base de datos. El componente LEMP de la base de datos MariaDB se utiliza para almacenar registros en tablas y columnas. Gestionará dinámicamente los datos de una aplicación web. Para instalar MariaDB, ejecute el siguiente comando en la consola de su servidor. Luego, reinicie el demonio PHP FPM para habilitar el módulo PHP-MySQL que se requiere para acceder a la base de datos.

sudo apt install mariadb-server mariadb-client php7.0-mysql
sudo systemctl restart php7.0-fpm.service

De manera predeterminada, la cuenta raíz del sistema o los usuarios con privilegios raíz pueden acceder a la base de datos sin proporcionar una contraseña. Para cambiar este comportamiento de modo que MySQL solicite una contraseña cada vez que un usuario del sistema intente acceder a la base de datos, inicie sesión en la base de datos MySQL utilizando la interfaz de línea de comandos con privilegios de raíz y ejecute los siguientes comandos en la consola de MySQL:

sudo mysql
MariaDB> use mysql;
MariaDB> update user set plugin='' where User='root';
MariaDB> flush privileges;
MariaDB> exit

Establecer contraseña de root en MariaDB

En el siguiente paso, asegúrese de proteger MariaDB ejecutando el script de seguridad mysql_secure_installation. Lo proporciona el paquete de instalación de los repositorios de Debian. Mientras se ejecuta el script, se le harán una serie de preguntas diseñadas para proteger la base de datos MariaDB. Tales como:cambiar la contraseña raíz de MySQL, eliminar usuarios anónimos, deshabilitar los inicios de sesión raíz remotos y eliminar la base de datos de prueba. Ejecute el script emitiendo el siguiente comando. Responda sí a todas las preguntas formuladas para asegurar completamente el demonio MySQL. Use la salida del script a continuación, excepto como guía.

sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):

OK, successfully used password, moving on...

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

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] y

New password:

Re-enter new password:

Password updated successfully!

Reloading privilege tables..

 ... Success!

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

Remove anonymous users? [Y/n] y

 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] y

 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y

 ... Success!

Cleaning up...

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

Thanks for using MariaDB!

Finalmente, para probar la funcionalidad de MariaDB, inicie sesión en la base de datos desde la consola y ejecute el siguiente comando. Se debe mostrar una lista de las bases de datos predeterminadas en la consola de MariaDB. Salga de la consola de MariaDB con salir declaración.

mysql -u root –p
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
 
MariaDB [(none)]> exit

¡Eso es todo! El servidor web Nginx, la base de datos MariaDB y el lenguaje de programación PHP están instalados en su máquina Debian 10. Ahora puede comenzar a crear sitios web dinámicos o aplicaciones web para sus visitantes.


Debian
  1. Instale Lets Encrypt and Secure Nginx con SSL/TLS en Debian 9

  2. Cómo instalar Nginx con PHP y MySQL (LEMP Stack) en Ubuntu 18.04

  3. Cómo instalar y configurar PHP y Nginx (LEMP) en Debian 11

  4. Cómo instalar y configurar el servidor LEMP (Nginx, MySQL y PHP) en un VPS Debian 6 (squeeze)

  5. Cómo instalar LEMP Stack Nginx, MySQL, PHP en Debian 11

Cómo instalar Nginx con PHP + MySQL (LEMP) en Debian 9

Cómo instalar Grav CMS con Nginx en Debian 9

Cómo instalar Nginx, MariaDB, PHP (pila LEMP) en Debian 9

Cómo instalar Nginx con PHP-FPM en Debian 10

Cómo instalar LEMP WordPress Ubuntu y Debian con Virtualhost

Cómo instalar phpBB con LEMP (Nginx, MariaDB y PHP) en Debian 11 Bullseye