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
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.