¿Cómo instalar y configurar un servidor LEMP en Ubuntu 16.04 (Xenial Xerus)?

Actualizado el 16 de septiembre, 2016. Por BlueHosting.

Este documento describe una alternativa compatible con una infraestructura LAMP (Linux, Apache, MySQL y PHP). La infraestructura LEMP remplaza el componente del servidor web Apache (que se corresponde con la "A" en LAMP) con Nginx (o "Engine x", lo que se corresponde con la E en LEMP). Este último puede aumentar la capacidad del servidor de adaptarse en respuesta a la demanda.

Antes de comenzar

  • Asegúrese de que su servidor cumpla con los requisitos mínimos de seguridad y estabilidad.
  • Debe tener un conocimiento base sobre Linux antes de implementar las instrucciones sugeridas aquí, por lo que recomendamos tener claros los conceptos básicos y prácticos en Linux.
  • Actualice su sistema:
    sudo apt-get update && sudo apt-get upgrade
    

Esta guía está escrita para un usuario no root. Los comandos que lo requieren están precedidos por sudo. Si usted inició sesión como usuario root entonces puede obviar el uso de este prefijo.

Nginx

Instalar el servidor web Nginx

Para asegurar la compatibilidad de la instalación y las futuras actualizaciones, instale nginx desde el repositorio de paquetes de Ubuntu usando apt:

sudo apt-get install nginx

Configurar el hosting virtual en Nginx

Las antiguas versiones de nginx especifican los directorios de los sitios y otras informaciones en el archivo principal nginx.conf, pero las versiones más recientes -como la incluida en Ubuntu 16.04- son más compartimentadas. Mientras lee esta sección, tenga en cuenta los contenidos y ubicaciones de cada archivo para poder familiarizarse con la estructura y saber a dónde ir si necesita personalizar algún aspecto particular de su servidor web.

Nginx utiliza las directivas server para especificar los hosts virtuales basados en nombre. Nginx los llamadas bloques server. Todos los bloques están contenidos dentro de las directivas server en los archivos del sitio, ubicados en /etc/nginx/sites-available. Cuando están activados, estos están incluidos en el archivo de configuración principal de nginx por defecto.

  1. Nginx incluye una configuración de muestra que puede usar como plantilla. Para crear un nuevo archivo con un bloque server base para su configuración, ingrese el siguiente comando remplazando ejemplo.com con los datos reales de su dominio:

    tail /etc/nginx/sites-available/default -n 13 | cut -c 2- | sudo tee /etc/nginx/sites-available/ejemplo.com 1> /dev/null
    

    El comando arriba lee el bloque server del ejemplo contenido en las últimas 13 líneas del archivo predeterminado del sitio, corta los símbolos # e imprime el resultado en un nuevo archivo del sitio.
    De forma alternativa, puede copiar manualmente la última sección de /etc/nginx/sites-available/default en un nuevo archivo llamado /etc/nginx/sites-available/ejemplo.com. Tendrá que eliminar manualmente los numerales (#) de las líneas relevantes.

  2. Ahora tendrá el siguiente bloque server en la configuración del host virtual de nginx:
    Archivo: /etc/nginx/sites-available/ejemplo.com

    server {
        listen 80;
        listen [::]:80;
    
        server_name ejemplo.com;
    
        root   /var/www/ejemplo.com;
        index  index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    

    Remplace ejemplo.com con el nombre de su dominio. Si su página principal utiliza PHP, agregue index.php a la línea index:
    Extracto del archivo: /etc/nginx/sites-available/ejemplo.com

    index index.html index.php;
    
  3. La configuración de ejemplo de nginx utiliza /var/www/ como documento raíz, pero Ubuntu utiliza /var/www/html como un estándar. Adicionalmente, se recomienda la práctica estándar de usar el subdirectorio llamado public_html para excluir los archivos web que no deberían ser accesibles públicamente. Actualice la directica root para que coincida con las siguientes convenciones:
    Extracto del archivo: /etc/nginx/sites-available/ejemplo.com

    root   /var/www/html/ejemplo.com/public_html;
    
  4. Cree el directorio root al cual se hace referencia en esta configuración, remplazando ejemplo.com con su nombre de dominio:

    sudo mkdir -p /var/www/html/ejemplo.com/public_html
    
  5. Habilite el sitio, desactive el host predeterminado y reinicie el servidor web:

    sudo ln -s /etc/nginx/sites-available/ejemplo.com /etc/nginx/sites-enabled
    sudo rm /etc/nginx/sites-enabled/default
    sudo systemctl restart nginx
    

    Para desactivar un sitio, simplemente elimine el enlace simbólico:

    sudo rm /etc/nginx/sites-enabled/ejemplo.com
    sudo systemctl restart nginx
    

    El archivo fuente está guardado y el sitio puede ser reactivado en cualquier momento al recrear el enlace simbólico.

Si usted está usando nginx para alojar más de un sitio, cree varios archivos de host virtual usando el método anterior.

Puede que también desee editar el bloque http en /etc/nginx/nginx.conf, el cual aplica para todos los sitios y permite las siguientes opciones (entre otras):

  • Esconder la información de la cabecera HTTP usando server_tokens;
  • Configurar los ajustes de SSL/TLS;
  • Personalizar las rutas de los registros o logs.

Implementar PHP con FastCGI

Con el fin de desarrollar aplicaciones PHP, implemente la siguiente solución PHP-FastCGI para permitir que nginx pueda manejar y servir páginas que contengan PHP de forma apropiada.

  1. Instale las dependencias requeridas:

    sudo apt-get install php7.0-cli php7.0-cgi php7.0-fpm
    
  2. Modifique la configuración de su host virtual para incluir la directiva location tal como se muestra a continuación:
    Extracto del archivo: /etc/nginx/sites-available/ejemplo.com

    server {
            listen 80;
            listen [::]:80;
    
            server_name ejemplo.com;
    
            root /var/www/html/ejemplo.com/public_html;
            index index.html;
    
            location / {
                    try_files $uri $uri/ =404;
            }
            location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
                    include fastcgi_params;
                    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                    fastcgi_param SCRIPT_FILENAME /var/www/html/ejemplo.com/public_html$fastcgi_script_name;
            }
    }
    
  3. Reinicie los servicios php7.0-fpm y nginx:

    sudo systemctl restart php7.0-fpm nginx
    

¡Felicidades! Ahora puede desarrollar scripts PHP en su servidor web.

Instalar el servidor de base de datos MySQL

MySQL es probablemente el motor de base de datos relacional de código abierto líder, y es una solución de base de datos popular para aplicaciones basadas en web.

  1. Instale los paquetes del servidor MySQL y el soporte PHP requerido para MySQL:

    sudo apt-get install mysql-server php7.0-mysql
    

    Durante el proceso de instalación se le pedirá que configure una contraseña para el usuario root de MySQL a través del menú ncurses. Escoja una contraseña sólida y manténgala en un lugar seguro para futuras consultas.

  2. Inicie sesión en la línea de comandos de MySQL como usuario root. Cuando se le solicite, ingrese la contraseña que especificó en el primer paso:

    mysql -u root -p
    
  3. Cree una base de datos y un usuario con los permisos para acceder a esta. Remplace web y usuarioweb con nombres apropiados, y SuContraseña con una contraseña sólida:

    CREATE DATABASE web;
    CREATE USER 'usuarioweb' IDENTIFIED BY 'SuContraseña';
    GRANT ALL PRIVILEGES ON web.* TO 'usuarioweb';
    quit
    

    Ahora puede proporcionar las credenciales de la base de datos web y del usuario usuarioweb a su aplicación, la cual ahora podrá usar dicha base de datos para sus propósitos. Para asegurarse de que PHP podrá acceder al conector MySQL que acaba de instalar, reinicie el servicio PHP ejecutando el siguiente comando:

    sudo systemctl restart php7.0-fpm
    

Nota:
Si en algún punto necesita cambiar su contraseña root, inicie sesión como se muestra en el paso 2 e ingrese el siguiente comando, remplazando NuevaContraseña con su nueva contraseña para el usuario root:

ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'password';

Opcional: probar y solucionar problemas de su infraestructura LEMP

En esta sección, creará una página de prueba que muestre si nginx puede interpretar código PHP y conectarse a la base de datos MySQL. Esto puede ser útil para ubicar la fuente de un error si alguno de los elementos de infraestructura LEMP no se está comunicando correctamente con otro.

  1. Pegue el siguiente código en un nuevo archivo, phptest.php en el directorio public_html. Modifique usuarioweb y SuContraseña para que coincida con la información ingresada en el servidor de base de datos instalado en la sección anterior:
    Archivo: /var/www/html/ejemplo.com/public_html/phptest.php

    <html>
    <head>
        <title>Prueba de PHP</title>
    </head>
        <body>
        <?php echo '<p>¡Hola mundo!</p>';
    
        // En las variabels siguientes, remplace usuario y contraseña con sus propias credenciales MySQL tal como se crearon en el servidor
        $servername = "localhost";
        $username = "webuser";
        $password = "password";
    
        // Cree la conexión con MySQL 
        $conn = mysqli_connect($servername, $username, $password);
    
        // Comprueba la conexión - si falla, la salida incluirá un mensaje de error
        if (!$conn) {
            exit('<p>La conexión falló: <p>' . mysqli_connect_error());
        }
        echo '<p>Conectado con éxito</p>';
        ?>
    </body>
    </html>
    
  2. Navegue a ejemplo.com/phptest.php desde su máquina local. Si los componentes de su infraestructura LEMP están funcionando correctamente, el navegador mostrará un mensaje: "Conectado con éxito". Si no, la salida será un mensaje de error.

  3. Una vez que verifique que la infraestructura está operando, elimine el archivo de prueba:
    sudo rm -rf /var/www/html/ejemplo.com/public_html/phptest.php
    

Solución de problemas

  • Si el sitio no carga en lo absoluto, compruebe el estatus de nginx y reinícielo si es necesario:

    systemctl status nginx
    sudo systemctl restart nginx
    
  • Si el sitio carga, pero la página que se muestra es la página predeterminada de nginx, regrese a la sección "Configurar hosting virtual de Nginx" y verifique que la directiva root coincida con su carpeta ejemplo.com/public_html.

  • Si la página retorna una carpeta con una estructura de árbol y un mensaje que indica Index of /, cree un archivo de prueba index.html o un archivo de prueba tal como se observa arriba.

¡Felicidades! Ya cuenta con las herramientas básicas para el despliegue de una aplicación en su nuevo servidor LEMP que es completamente funcional y con todas las características.

Recursos adicionales

Para complementar la información aquí presentada puede consultar los siguientes recursos. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos certificar su actualidad o precisión.

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...