Ubuntu 18.04 Server: instalar y configurar Nginx, PHP y MariaDB

Para usar Nginx, PHP-FPM y MariaDB juntos en Ubuntu 18.04, necesitas instalar cada paquete, pasar las solicitudes PHP de Nginx al socket de PHP-FPM y luego configurar la base de datos con cuentas separadas. El ejemplo a continuación es solo para práctica local, no cambia sitios existentes y no usa la cuenta root de la base de datos para aplicaciones web.

Alcance de la práctica y preparación

El soporte general de seguridad para Ubuntu 18.04 ha finalizado. Verifique si se ha aplicado el Mantenimiento de Seguridad Extendido (ESM) de Ubuntu Pro y el rango de soporte para cada paquete en Calendario de Mantenimiento de Seguridad de Ubuntu, y se recomienda construir nuevos entornos operativos con versiones compatibles. Este artículo utiliza PHP 7.2 del repositorio predeterminado como ejemplo para comprender un servidor 18.04 existente.

Prepare un servidor de prueba separado con privilegios de administrador y acceso al repositorio. Nginx maneja las solicitudes web, PHP-FPM (FastCGI Process Manager) ejecuta el código PHP, y MariaDB almacena datos. Los ejemplos se reciben solo en 127.0.0.1:8080, por lo que no se puede acceder a ellos directamente desde fuera del servidor. Para el acceso público a Internet, se requiere un firewall separado, dominio, certificado TLS y revisión de seguridad.

En servidores con servicios o datos existentes, prepare procedimientos de respaldo y recuperación antes de realizar cambios. Si los caminos de práctica, cuentas, nombres de bases de datos o el puerto 8080 a continuación ya están en uso, no continúe tal cual; utilice un entorno de prueba separado. Puede verificar el uso del puerto con el siguiente comando. Si no hay salida, no hay un oyente TCP para ese puerto.

sudo ss -lntp | grep ':8080 '

Instalación de paquetes y verificación de servicios

La instalación de los paquetes puede iniciar automáticamente el sitio predeterminado de Nginx, que puede escuchar en el puerto 80. Restringir el sitio de prueba al puerto local 8080 no restringe el sitio predeterminado. Aísle el servidor de prueba con controles de red y firewall antes de instalar y compruebe el impacto en los servicios existentes.

Después de actualizar la lista de paquetes, instale Nginx, PHP 7.2 FPM con controlador MySQL, servidor MariaDB y curl para verificación. Si los paquetes no se pueden usar debido a problemas del repositorio o de soporte, resuelva los errores antes de continuar.

sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl

Después de la instalación, verifica el estado del servicio y el socket de PHP-FPM usando los siguientes comandos. Si el servicio no está funcionando, identifica la causa y inicia el servicio. Si la ruta del socket es diferente, ajusta la configuración de Nginx a continuación para que coincida con la ruta real.

systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/

Verifica si cada uno de los tres servicios es active. Si php7.2-fpm.sock no existe, revisa la causa en systemctl status php7.2-fpm y los registros del servicio. Cuando la versión de PHP sea diferente, debes cambiar tanto el paquete como la ruta del socket juntos.

Conexión entre Nginx y PHP-FPM

Cree un nuevo directorio de práctica y archivo de configuración. No sobrescriba /var/www/lnmp-demo, /etc/nginx/sites-available/lnmp-demo o /etc/nginx/sites-enabled/lnmp-demo si ya existen. Ejecute los comandos de edición a continuación después de confirmar que no hay ruta existente en un servidor limpio.

sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo

Guarde el siguiente bloque completo del servidor en el editor. fastcgi_pass debe coincidir con el socket PHP-FPM confirmado anteriormente. snippets/fastcgi-php.conf es un fragmento de configuración del paquete Nginx de Ubuntu; si el archivo no existe, verifique la configuración de FastCGI en la distribución.

server {
    listen 127.0.0.1:8080;
    server_name localhost;
    root /var/www/lnmp-demo;
    index index.php;

    location / {
        try_files $uri $uri/ =404;
    }

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

Active y revise el archivo de configuración. Solo recargue si nginx -t tiene éxito. Si falla, verifique y corrija errores, puertos y rutas de socket, luego verifique nuevamente. Si ocurre un problema, elimine solo los enlaces simbólicos creados en esta práctica, luego vuelva a verificar y recargar para mantener la configuración existente del sitio.

sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx

Las conexiones FastCGI de Nginx también se pueden verificar en Guía Oficial de Nginx.

Verificar la ejecución de PHP

Verifique que no haya un archivo en la ruta a continuación y cree un nuevo archivo. Guarde el código a continuación en su editor.

sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";

Ejecute el siguiente comando en el mismo servidor. Si aparecen PHP is working y SAPI: fpm-fcgi, Nginx ha ejecutado el código a través de PHP-FPM. Si el código PHP se muestra tal cual, la configuración no se ha aplicado, por lo que no exponga el archivo de prueba y verifique nuevamente la configuración de FastCGI.

curl http://127.0.0.1:8080/

Si hay un error 502, verifique el servicio PHP-FPM, la ruta del socket y los permisos; si hay un error 404, verifique el directorio de documentos y la ruta del archivo. No exponga la página phpinfo() que revela configuraciones detalladas del servidor.

Base de datos MariaDB y cuenta separada

La autenticación del administrador de MariaDB depende del método de instalación. Si se establece la autenticación mediante socket local, puedes abrir la consola de administración con el siguiente comando. Si falla, verifica el método de autenticación del administrador existente. MYSQL_HISTFILE=/dev/null especifica que esta sesión del cliente no debe dejar un archivo de historial de comandos.

sudo env MYSQL_HISTFILE=/dev/null mysql

Lo siguiente es SQL para crear una nueva base de datos de práctica y una cuenta solo local. Si ya existe el mismo nombre, no modifiques la entrada existente; usa un nombre diferente. Antes de la ejecución, reemplaza CHANGE_ME_STRONG_PASSWORD con una contraseña larga y única, y asegúrate de que cualquier comilla o barra invertida en la cadena SQL esté correctamente escapada.

CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;

Esta cuenta de ejemplo tiene permisos de solo lectura en la base de datos. Si una aplicación real requiere permisos de escritura o de cambio de esquema, otorgue solo los permisos necesarios por separado. No modifique directamente el complemento de autenticación de la cuenta de administrador ni otorgue privilegios de root a la aplicación web. Para más detalles sobre cuentas y autenticación, consulte la documentación de MariaDB CREATE USER.

Verifique que la nueva cuenta pueda conectarse localmente. No escriba la contraseña directamente en la línea de comandos; ingrésela en el aviso. Después de conectarse, ejecutar SELECT DATABASE(), CURRENT_USER(); mostrará la base de datos y las cuentas autenticadas. Salga de la consola usando EXIT;.

mysql -u lnmp_demo -p lnmp_demo

Verifique la conexión a la base de datos en PHP

El siguiente es un método de verificación temporal utilizando la cuenta creada anteriormente. Mantenga las credenciales fuera del directorio de documentos web. Si /etc/lnmp-demo ya existe, no lo sobrescriba; utilice un entorno de prueba separado en su lugar. Esto asume la configuración predeterminada donde PHP-FPM se ejecuta bajo el grupo www-data.

sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php

Inserte el siguiente contenido en el archivo y reemplace la contraseña con el valor establecido para la cuenta de la base de datos. Si hay comillas o barras invertidas en la cadena PHP, escápelas correctamente. Dado que otras aplicaciones que se ejecutan con los mismos permisos de www-data también pueden leer el archivo, se requiere un aislamiento separado en servidores compartidos.

<?php
return array(
    'user' => 'lnmp_demo',
    'password' => 'CHANGE_ME_STRONG_PASSWORD',
);

Asegúrese de que /var/www/lnmp-demo/db-check.php no exista y guarde el siguiente código. Solo indique el éxito o el fallo para evitar exponer mensajes de error o contraseñas en la respuesta web.

sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
    $db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
        $config['user'], $config['password'],
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    echo "Database connection OK\n";
} catch (PDOException $e) {
    http_response_code(500);
    echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php

Si aparece HTTP 200 y Database connection OK, la conexión PHP a MariaDB ha tenido éxito. Si falla, verifique la extensión PHP MySQL, el estado del servicio, la autenticación por socket y la cuenta/contraseña. Después de la verificación, elimine de manera segura los archivos PHP temporales y los archivos de credenciales, y limpie las cuentas de práctica y las bases de datos que ya no sean necesarias, revisando tanto los objetivos reales como las copias de seguridad.

Antes de aplicar al entorno de producción

La configuración de práctica es para la verificación de la conexión local. Antes de hacer públicos los servicios reales, migre a versiones de OS y PHP compatibles, y configure el nombre del servidor Nginx y la raíz del documento, los certificados HTTPS, el firewall y las reglas de red en la nube según el entorno. También necesita revisar el alcance de carga/ejecución de archivos PHP, la separación de usuarios FPM y el acceso a la red, respaldo y recuperación de MariaDB.

La herramienta de configuración de seguridad de MariaDB se proporciona como mysql_secure_installation o mariadb-secure-installation según la versión instalada. Dado que puede afectar a los servicios existentes, lea cada pregunta y elija según su entorno. Los elementos detallados se pueden encontrar en Descripción de la Herramienta de Configuración de Seguridad de MariaDB.