Book

Cómo instalar y configurar Laravel con Nginx en Ubuntu 20.04

Linux BasicsGetting StartedDigitalOceanBooks

Introducción

Laravel es un marco PHP de código abierto que ofrece un conjunto de herramientas y recursos para crear aplicaciones PHP modernas. Con un ecosistema completo que aprovecha sus funciones integradas, la popularidad de Laravel ha aumentado rápidamente en los últimos años, y muchos desarrolladores lo han adoptado como su marco preferido para un proceso de desarrollo agilizado.

En esta guía, instalará y configurará una nueva aplicación de Laravel en un servidor de Ubuntu 20.04, usando Composer para descargar y administrar las dependencias del marco y Nginx para presentar la aplicación. Cuando termine, tendrá una aplicación de demostración funcional de Laravel que extrae contenido de una base de datos MySQL 8.

Requisitos previos

Para completar esta guía, primero deberá realizar las siguientes tareas en su servidor Ubuntu 20.04:

Paso 1: Instalar los módulos PHP requeridos

Antes de que pueda instalar Laravel, deberá instalar algunos módulos PHP que el marco necesita. Usaremos apt para instalar los módulos PHP php-mbstring, php-xml y php-bcmath. Estas extensiones PHP ofrecen un soporte adicional para tratar con la codificación de caracteres, el XML y las matemáticas de precisión.

Si esta es la primera vez que utliza apt en esta sesión, primero debería ejecutar el comando update para actualizar el caché del administrador de paquetes:

  • sudo apt update

Ahora puede instalar los paquetes necesarios con:

  • sudo apt install php-mbstring php-xml php-bcmath

Su sistema está ahora listo para ejecutar la instalación de Laravel a través de Composer, pero antes de hacerlo, necesitará una base de datos para su aplicación.

Paso 2: Crear una base de datos para la aplicación

Para demostrar la instalación y uso básicos de Laravel, crearemos una aplicación travel list para mostrar una lista de lugares a los que un usuario le gustaría viajar, y una lista de lugares que ya ha visitado. Esto puede almacenarse en una tabla places con un campo para las ubicaciones al que llamaremos name y otro campo para marcarlas como visited (visitadas) o not visited (no visitadas, al que llamaremos visited. Además, incluiremos un campo id para identificar cada entrada de forma única.

Para conectar con la base de datos desde la aplicación Laravel, crearemos un usuario MySQL dedicado, y concederemos a este usuario privilegios completos sobre la base de datos travellist.

En el momento de escribir este artículo, la biblioteca PHP de MySQL nativa mysqlnd no admite caching_sha2_authentication, el método de autenticación predeterminado para MySQL 8. Necesitaremos configurar el usuario de nuestra base de datos con el método de autenticación mysql_native_password para poder conectar con la base MySQL desde PHP.

Para comenzar, inicie sesión en la consola de MySQL como usuario root de la base de datos con:

  • sudo mysql

Para crear una base de datos nueva, ejecute el siguiente comando desde su consola de MySQL:

  • CREATE DATABASE travellist;

Ahora puede crear un nuevo usuario y concederle privilegios completos sobre la base de datos personalizada que acaba de crear. En este ejemplo, estamos creando un usuario llamado travellist_user con la contraseña password, aunque debería cambiarla a una contraseña segura:

  • CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Ahora, debemos darle permiso a este usuario a la base de datos travellist:

  • GRANT ALL ON travellist.* TO 'travellist_user'@'%';

Esto proporcionará al usuario travellist_user privilegios completos sobre la base de datos travellist, al mismo tiempo que se impide que este usuario cree o modifique otras bases de datos en su servidor.

Después de esto, cierre el shell de MySQL:

  • exit

Puede probar si el usuario nuevo tiene los permisos adecuados al volver a iniciar sesión en la consola de MySQL, esta vez, con las credenciales de usuario personalizadas:

  • mysql -u travellist_user -p

Observe el indicador -p en este comando, que le solicitará la contraseña que utilizó cuando creó el usuario travellist_user. Tras iniciar sesión en la consola MySQL, confirme que tiene acceso a la base de datos travellist:

  • SHOW DATABASES;

Con esto se generará el siguiente resultado:

Output
+--------------------+ | Database | +--------------------+ | information_schema | | travellist | +--------------------+ 2 rows in set (0.01 sec)

A continuación, cree una tabla llamada places en la base de datos travellist. Desde la consola de MySQL, ejecute la siguiente instrucción:

  • CREATE TABLE travellist.places (
  • id INT AUTO_INCREMENT,
  • name VARCHAR(255),
  • visited BOOLEAN,
  • PRIMARY KEY(id)
  • );

Ahora, complete la tabla places con algunos datos de ejemplo:

  • INSERT INTO travellist.places (name, visited)
  • VALUES ("Tokyo", false),
  • ("Budapest", true),
  • ("Nairobi", false),
  • ("Berlin", true),
  • ("Lisbon", true),
  • ("Denver", false),
  • ("Moscow", false),
  • ("Olso", false),
  • ("Rio", true),
  • ("Cincinnati", false),
  • ("Helsinki", false);

Para confirmar que los datos se guardaron correctamente en su tabla, ejecute lo siguiente:

  • SELECT * FROM travellist.places;

Verá un resultado similar a este:

Output
+----+-----------+---------+ | id | name | visited | +----+-----------+---------+ | 1 | Tokyo | 0 | | 2 | Budapest | 1 | | 3 | Nairobi | 0 | | 4 | Berlin | 1 | | 5 | Lisbon | 1 | | 6 | Denver | 0 | | 7 | Moscow | 0 | | 8 | Oslo | 0 | | 9 | Rio | 1 | | 10 | Cincinnati| 0 | | 11 | Helsinki | 0 | +----+-----------+---------+ 11 rows in set (0.00 sec)

Después de confirmar que haya datos válidos en su tabla de prueba, puede cerrar la consola de MySQL:

  • exit

Ahora está listo para crear la aplicación y configurarla para que se conecte con la nueva base de datos.

Paso 3: Crear una nueva aplicación Laravel

Ahora creará una nueva aplicación Laravel usando el comando composer create-project. Este comando de Composer normalmente se usa para arrancar nuevas aplicaciones en base a marcos y sistemas de gestión de contenido existentes.

A lo largo de esta guía, usaremos travellist como aplicación de ejemplo, pero puede cambiar esto a otra cosa. La aplicación travellist mostrará una lista de ubicaciones extraídas de un servidor MySQL local, que pretende demostrar la configuración básica de Laravel y confirmar que puede conectar con la base de datos.

Primero, vaya al directorio de inicio de su usuario:

  • cd ~

El siguiente comando creará un nuevo directorio travellist que contiene una aplicación Laravel barebones basada en los ajustes predeterminados:

  • composer create-project --prefer-dist laravel/laravel travellist

Verá un resultado similar a este:

Output
Installing laravel/laravel (v5.8.17) - Installing laravel/laravel (v5.8.17): Downloading (100%) Created project in travellist > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 80 installs, 0 updates, 0 removals - Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%) - Installing phpoption/phpoption (1.5.0): Downloading (100%) - Installing vlucas/phpdotenv (v3.4.0): Downloading (100%) - Installing symfony/css-selector (v4.3.2): Downloading (100%) ...

Cuando finalice la instalación, acceda al directorio de la aplicación y ejecute el comando artisan de Laravel para verificar que todos los componentes se instalaron correctamente.

  • cd travellist
  • php artisan

Verá un resultado similar a este:

Output
Laravel Framework 7.11.0 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug ...

Este resultado confirma que los archivos de la aplicación están listos y que las herramientas de la línea de comando de Laravel funcionan como se espera. Sin embargo, aún debemos configurar la aplicación para configurar la base de datos y algunos detalles más.

Paso 4: Configurar Laravel

Los archivos de configuración de Laravel se encuentran en un directorio llamado config, dentro del directorio root de la aplicación. Además, cuando instala Laravel con Composer, crea un archivo de entorno. Este archivo contiene ajustes que son específicos para el entorno actual en el que se ejecuta la aplicación, y tendrá precedencia sobre los valores establecidos en los archivos de configuración regulares ubicados en el directorio config. Para cada instalación en un nuevo entorno se requiere un archivo de entorno personalizado a fin de definir elementos como las configuraciones de conexión de bases de datos, las opciones de depuración y las URL de aplicación, entre otros elementos que pueden variar dependiendo del entorno en el que se ejecute la aplicación.

Advertencia: En el archivo de configuración del entorno se encuentra información confidencial sobre su servidor, incluidas las credenciales de bases de datos y las claves de seguridad. Por ese motivo, nunca debe compartir públicamente este archivo.

Ahora editaremos el archivo .env para personalizar las opciones de configuración para el entorno actual de la aplicación.

Abra el archivo .env usando el editor de línea de comandos que prefiera. Aquí usaremos nano:

  • nano .env

Aunque existen muchas variables de configuración en este archivo, no es necesario configurarlas todas ahora. La siguiente lista contiene una descripción general de las variables que requieren atención inmediata:

  • APP_NAME: nombre de la aplicación, usado para notificaciones y mensajes.
  • APP_ENV: entorno actual de la aplicación.
  • APP_KEY: se utiliza para generar salts y hashes; esta clave única se crea automáticamente cuando se instala Laravel a través de Composer, de forma que no es necesario cambiarla.
  • APP_DEBUG: decida si desea mostrar o no la información de depuración en el lado del cliente.
  • APP_URL: URL base para la aplicación, usada para generar enlaces de la aplicación.
  • DB_DATABASE: nombre de la base de datos.
  • DB_USERNAME: nombre de usuario para conectar con la base de datos.
  • DB_PASSWORD: contraseña para conectar con la base de datos.

Por defecto, estos valores se configuran para un entorno de desarrollo local que utiliza Homestead, un cuadro de Vagrant pre-empaquetado proporcionada por Laravel. Cambiaremos estos valores para que reflejen los ajustes actuales del entorno de nuestra aplicación de ejemplo.

En el caso de instalar Laravel en un entorno de desarrollo o de prueba, puede dejar la opción APP_DEBUG habilitada, ya que esto le proporcionará información de depuración importante mientras realiza pruebas a la aplicación desde un navegador. La variable APP_ENV debería establecerse a desarrollo o prueba en este caso.

En el caso de que esté instalando Laravel en un entorno de producción, debería deshabilitar la opción APP_DEBUG, porque muestra al usuario final información sensible sobre su aplicación. La opción APP_ENV en este caso debería configurarse a producción.

El siguiente archivo .env configura nuestra aplicación de ejemplo para desarrollo:

Nota: La variable APP_KEY contiene una clave única que se generó automáticamente cuando instaló Laravel a través de Composer. No es necesario que cambie este valor. Si desea generar una nueva clave segura, puede usar el comando php artisan key:generate.

/var/www/travellist/.env
APP_NAME=TravelList
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

...

Ajuste las variables según corresponda. Cuando termine de editar, guarde y cierre el archivo para conservar sus cambios. Si utiliza nano, puede hacer esto escribiendo CTRL+X y, luego, Y y ENTER para confirmar.

Su aplicación Laravel ahora está configurada, pero aún debemos configurar el servidor web para poder acceder a ella desde un navegador. En el siguiente paso, configuraremos Nginx para presentar su aplicación Laravel.

Paso 5: Configurar Nginx

Hemos instalado Laravel en una carpeta local del directorio de inicio de su usuario remoto, y, aunque esto funciona bien para los entornos de desarrollo local, no es una práctica recomendada para los servidores web que están abiertos al Internet público. Moveremos la carpeta de la aplicación a /var/www, que es la ubicación habitual para las aplicaciones web que se ejecutan en Nginx.

Primero, utilice el comando mv para mover la carpeta de la aplicación con todo su contenido a /var/www/travellist:

  • sudo mv ~/travellist /var/www/travellist

Ahora, deberá proporcionar al usuario del servidor web acceso de escritura para las carpetas storage y cache, donde Laravel guarda los archivos generados por la aplicación.

  • sudo chown -R www-data.www-data /var/www/travellist/storage
  • sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache

Los archivos de la aplicación ahora están en orden, pero aún necesitamos configurar Nginx para presentar el contenido. Para hacer esto, crearemos un nuevo archivo de configuración del host virtual en /etc/nginx/sites-available:

  • sudo nano /etc/nginx/sites-available/travellist

El siguiente archivo de configuración contiene los ajustes recomendados para las aplicaciones de Laravel en Nginx:

/etc/nginx/sites-available/travellist
server {
    listen 80;
    server_name server_domain_or_IP;
    root /var/www/travellist/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Copie este contenido a su archivo /etc/nginx/sites-available/travellist y, si es necesario, ajuste los valores resaltados para que se adapten a su propia configuración. Guarde y cierre el archivo cuando finalice la edición.

Para activar el nuevo archivo de configuración del host virtual, cree un enlace simbólico a travellist en sites-enabled:

  • sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

Nota: Si tiene otro archivo de host virtual que fue configurado previamente para el mismo server_name usado en el host virtual travellist, es posible que deba desactivar la configuración antigua eliminando el enlace simbólico correspondiente dentro de /etc/nginx/sites-enabled/.

Para confirmar que la configuración no contiene errores de sintaxis, puede usar:

  • sudo nginx -t

Debería ver el siguiente resultado:

Output
  • nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  • nginx: configuration file /etc/nginx/nginx.conf test is successful

Para aplicar los cambios, vuelva a cargar Nginx con:

  • sudo systemctl reload nginx

Ahora vaya a su navegador y acceda a la aplicación usando el nombre de dominio del servidor o la dirección IP, como se define en la directiva server_name en su archivo de configuración:

http://server_domain_or_IP

Verá una página como la siguiente:

Página de presentación de Laravel

Eso confirma que su servidor Nginx está configurado correctamente para presentar Laravel. Desde este punto, puede comenzar a crear su aplicación sobre el esqueleto proporcionado por la instalación predeterminada.

En el siguiente paso, modificaremos la ruta principal de la aplicación para que consulte datos usando la fachada DB de Laravel.

Paso 6: Personalizar la página principal

Asumiendo que ha seguido todos los pasos de esta guía, debería tener una aplicación Laravel funcionando y una tabla de base de datos llamada places que contiene algunos datos de ejemplo.

Ahora editaremos la ruta principal de la aplicación para que consulte la base de datos y devuelva contenido a la vista de la aplicación.

Abra el archivo de la ruta principal, routes/web.php:

  • nano routes/web.php

Este archivo viene por defecto con el siguiente contenido:

routes/web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Las rutas se definen con este archivo usando el método estático Route::get, que recibe una ruta y una función de invocación como argumentos.

El siguiente código sustituye la función de invocación de la ruta principal. Realiza dos consultas a la base de datos usando el indicador visited para filtrar los resultados. Devuelve los resultados a una vista llamada travellist, que vamos a crear a continuación. Copie este contenido a su archivo routes/web.php, sustituyendo el código que ya está ahí:

routes/web.php
<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
  $visited = DB::select('select * from places where visited = ?', [1]); 
  $togo = DB::select('select * from places where visited = ?', [0]);

  return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
});

Guarde y cierre el archivo cuando finalice la edición. Ahora crearemos la vista que mostrará los resultados de la base de datos al usuario. Cree un nuevo archivo de vista dentro de resources/views:

  • nano resources/views/travellist.blade.php

La siguiente plantilla crea dos listas de lugares basadas en las variables visited y togo. Copie este contenido a su nuevo archivo de vista:

resources/views/travellist/blade.php
<html>
<head>
    <title>Travel List</title>
</head>

<body>
    <h1>My Travel Bucket List</h1>
    <h2>Places I'd Like to Visit</h2>
    <ul>
      @foreach ($togo as $newplace)
        <li>{{ $newplace->name }}</li>
      @endforeach
    </ul>

    <h2>Places I've Already Been To</h2>
    <ul>
          @foreach ($visited as $place)
                <li>{{ $place->name }}</li>
          @endforeach
    </ul>
</body>
</html>

Guarde y cierre el archivo cuando termine. Ahora vaya a su navegador y vuelva a cargar la aplicación. Verá una página como la siguiente:

Aplicación de demostración de Laravel

Ahora tiene una aplicación de Laravel funcional que extrae contenido de una base de datos MySQL.

Conclusión

En este tutorial, ha configurado una nueva aplicación de Laravel sobre una pila LEMP (Linux, Nginx, MySQL y PHP) que se ejecuta en un servidor Ubuntu 20.04. También ha personalizado su ruta predeterminada para consultar el contenido de la base de datos y mostrar los resultados en una vista personalizada.

A partir de aquí, puede crear nuevas rutas y vistas para cualquier página adicional que necesite su aplicación. Consulte la documentación oficial de Laravel para obtener más información sobre las rutas, las vistas y la compatibilidad con bases de datos. Si está implementando para producción, debería consultar también la sección de optimización para ver diferentes formas en las cuales puede mejorar el rendimiento de su aplicación.

0 Comments

Creative Commons License