En este artículo se listan los pasos básicos para configurar un servidor web en Linux que permita el funcionamiento de una aplicación o página web que funcione con el lenguaje de programación PHP y el motor de bases de datos MySQL.
A esta configuración se le denomina LEMP server, porque es la manera simplificada de decir: “Linux, Nginx, MySQL y PHP”.
Creación de un nuevo usuario con privilegios de administración en Linux
Creación del usuario
sudo adduser nombre_de_usuario
Inmediatamente la consola te solicitará ingresar una contraseña para ese nuevo usuario. Luego, otra información adicional.
Agregar usuario al grupo de súper usuarios para brindar los privilegios de administración
sudo usermod -aG sudo nombre_de_usuario
Iniciar sesión con el nuevo usuario
su nombre_de_usuario
La consola solicita la contraseña ingresada en el momento de la creación.
Actualización de paquetes del servidor
Si apenas creaste el servidor sería conveniente actualizar su software.
Actualizar el listado de paquetes
sudo apt-get update
Actualizar los paquetes ya instalados
sudo apt-get upgrade
Instalación de NGINX
NGINX es un servidor web de código abierto que permite gestionar la comunicación entre una persona que solicita una página o aplicación web con el servidor que lo hospeda.
Instalación de NGINX
sudo apt-get install nginx
Instalación del sistema de base de datos MySQL server
Instale un sistema gestor de bases de datos para que almacene y administre datos en su sitio web.
Instalación de MySLQ server
sudo apt-get install mysql-server
Durante la instalación la consola le va a solicitar que precione la tecla “y” para completar la instalación.
Mejorar la seguridad de MySQL server
Las configuraciones por defecto tras la instalación de MySQL server suelen ser inseguras. Así que se recomienda que se configuren unas directivas que mejoran notablemente la seguridad.
Para iniciar con el asistente de seguridad, ingrese la siguiente instrucción en la consola:
sudo mysql_secure_installation
Cuando ejecute el comando, la consola le imprimirá el siguiente aviso:
VALIDATE PASSWORD COMPONENT can be used to test passwordsand improve security. It checks the strength of passwordand allows the users to set only those passwords which aresecure enough. Would you like to setup VALIDATE PASSWORD component?Press y|Y for Yes, any other key for No:
Presione “y” para continuar y habilitar el componente para contraseñas.
Una vez inicie el asistente, se le preguntará qué grado de seguridad desea tener en sus contraseñas:
There are three levels of password validation policy:LOW Length >= 8MEDIUM Length >= 8, numeric, mixed case, and special charactersSTRONG Length >= 8, numeric, mixed case, special characters and dictionary filePlease enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
Precione “0”, “1” o “2” dependiendo de la configuración que usted desee.
De ahí, el asistente le solicitará que ingrese la contraseña para el usuario root y le calificará el grado de seguridad de la misma, además, le preguntará si desea mantenerla o no:
Vaya aceptando con “y” y presionando Enter las configuraciones que le sugiera el asistente. Así eliminará algunos usuarios anónimos, deshabilitará la posibilidad de acceder a su gestor de base de datos de forma remota y la base de datos de prueba.
Instalación de PHP
A continuación se instalará en el servidor PHP para que pueda ejecutar aplicaciones basadas en este lenguaje de programación.
La diferencia entre APACHE y NGINX es que el primero integra el intérprete PHP por defecto, en cambio, con NGINX, se debe instalar un programa externo para que pueda interpretar el lenguaje de programación.
Al tener que instalar un programa externo, se creería que el rendimiento se vería afectado; pero en realidad, se considera que es un aspecto que mejora el rendimiento de aplicaciones hechas en PHP.
Entonces, se deberá instalar el paquete “php-fpm” que significa “PHP FastCGI Process Manager”, que se encarga de indicarle a NGINX que pase solicitudes PHP a este software para poder interpretarlo.
Por otra parte, se deberá instalar el paquete “php-mysql” para adivina qué… Si, lograr que las aplicaciones PHP puedan comunicarse con una base de datos creada con el motor de bases de datos MySQL.
PHP tiene unos paquetes básicos que igual serán instalados por defecto.
Instrucción para instalar PHP y que este funcione con NGINX y MySQL
sudo apt-get install php-fpm php-mysql
Configurar NGINX para ejecutar aplicaciones hechas con PHP
Con NGINX creamos bloques de servidor que contienen los detalles de configuración de cada nombre de donimio; lo que nos permite alojar más de un sitio web en un mismo web server.
Los bloques de servidor son algo parecido a los host virtuales de Apache.
A partir de Ubuntu 20.04, NGINX dispone de un bloque de servidor configurado por defecto que nos permite suministrar documentos a Internet a través del directorio /var/www/html
. Esta configuración funciona cuando deseamos alojar un solo sitio o aplicación web, pero no es la adecuada cuando intentemos alojar varios.
Entonces, para configurar diferentes nombres de dominio, crearemos una estructura de carpetas a partir de /var/www
y el directorio /var/www/html
lo dejaremos intacto para cuando un cliente acceda de forma equivocada a documentos alojados en nuestro servidor.
Creación de un directorio web para un nuevo nombre de dominio
sudo mkdir /var/www/nombre_de_dominio
Asignar propiedad del directorio a un usuario
sudo chown -R nombre_de_usuario:nombre_de_usuario /var/www/nombre_de_dominio
Si utilizas
$user
en lugar denombre_de_usuario
indicarás la propiedad al usuario logueado en consola.
Creación y activación del bloque de servidor
NGINX por sí solo no sabe que el directorio /var/www/nombre_de_dominio
está funcionando como una carpeta que aloja documentos disponibles en Internet. Por ello, se deben crear y activar los bloques de servidor, para que cuando un cliente ingrese el nombre de dominio en el navegador sea llevado al directorio que contiene la información que está solicitando con ese nombre de dominio.
Creación del bloque
sudo vi /etc/nginx/sites-available/nombre_de_dominio
Esta es la información básica que debe ir en el documento que contiene las configuraciones del bloque de servidor:
server { listen 80; server_name nombre_de_dominio www.nombre_de_dominio; root /var/www/nombre_de_dominio; 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; }}
Para este ejemplo se utilizó el editor de texto vi, pero se puede utilizar vim o nano.
- listen. Es el número de puerto que NGINX escuchará. En este caso, escucha el puerto 80, el puerto del protocolo HTTP
- server_name. Le indica a NGINX con qué nombre de dominio o IP se puede acceder a este bloque de servidor. Coloque el que corresponda.
- root. Indica a NGINX el directorio que contiene los documentos disponibles en Internet para ese nombre de dominio
- index. Le informa a NGINX el documento índice del directorio y su orden de prioridad. Por ejemplo, el servidor mostrará primero el documento
index.html
, luego elindex.htm
y por último elindex.php
. Esta configuración depende de las necesidades - location /. Primer bloque de ubicación. Este contiene información que confirma la existencia de archivos o directorios que coincidan con una solicitud URI a través de la directiva
try_files
- location ~ .php$. Este bloque de ubicación administra el procesamiento de PHP y orienta a NGINX hacia los documentos de configuración:
fastcgi-php.conf
yphp7.4-fpm.sock
, este último declara el socket que se asocia conphp-fpm
- location ~ /.ht. Este último bloque de ubicación es un manejador de archivos
.htaccesss
que NGINX no procesa. Con la directivadeny all
, si algunos de estos documentos se encuentran en el root del directorio, estos no se suminstran a los visitantes
Activación del bloque
Para la activación del bloque recién configurado se debe vincular el archivo de texto creado en sites-available
hacia sites-enabled
. Esto, le indicará a NGINX que utilice la configuración descrita en el documento la próxima vez que inicie.
sudo ln -s /etc/nginx/sites-available/nombre_de_dominio /etc/nginx/sites-enabled/
Para identificar errores de sintaxys en el documento de creación del bloque utiliza:
sudo nginx -t
Para finalizar, reinicie el servicio NGINX
sudo systemctl reload nginx