Inicio
Artículos
Categorias
Etiquetas
Configuración de un entorno de desarrollo con Laravel en Ubuntu Server 20.04
publicado el: 2020-12-29   actualizado el: 2020-12-29   incluido en: Programación , Laravel
palabras totales: 5417   tiempo de lectura: 26 mins  

Voy a crear una máquina virtual con Ubuntu Server 20.04 en VirtualBox donde instalaré todas las herramientas y servicios necesarios para el entorno de desarrollo con Laravel.

Accederé a la MV vía ssh desde la línea de comandos de mi equipo anfitrión. Para facilitar la tarea debo establecer una ip estática en la interface del servidor desde la que tendré acceso. para ello arranco la MV con Ubuntu Server

Configurar una dirección IP estática en Ubuntu Server 20.04

Para el caso de Ubuntu Server 20.04, es importante anotar que el archivo de configuración de red Netplan por defecto lo encontraré en la ruta /etc/netplan/00-installer-config.yaml.

Paso 1

Voy a detectar la interfaz de red actual con el comando ip a:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
enrique@enrique-server:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP/> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP/> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:e2:ed:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.160/24 brd 192.168.100.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fee2:ed03/64 scope link
       valid_lft forever preferred_lft forever

Paso 2

En este caso el adaptador es “enp0s3” con la dirección IP “192.168.100.160”. Es momento de validar que CloudInit no gestiona la interfaz de red, para ello abriré el archivo de configuración con mi editor habitual:

1
enrique@enrique-server:~$ sudo nano /etc/cloud/cloud.cfg.d/subiquity-disable-cloudinit-networking.cfg

Paso 3

Allí debo validar que existe la siguiente línea, si no está la debo ingresar manualmente:

1
network: {config: disabled}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
  GNU nano 4.8             /etc/cloud/cloud.cfg.d/subiquity-disable-cloudinit-networking.cfg                        
network: {config: disabled}







             [ File '/etc/cloud/cloud.cfg.d/subiquity-disable-cloudinit-networking.cfg' is unwritable ]
^G Get Help     ^O Write Out    ^W Where Is     ^K Cut Text     ^J Justify      ^C Cur Pos      M-U Undo
^X Exit         ^R Read File    ^\ Replace      ^U Paste Text   ^T To Spell     ^_ Go To Line   M-E Redo

Paso 4

Guardo los cambios si aplica y luego de esto abriré el archivo de configuración Netplan con la siguiente orden. Allí verifico que el adaptador de red posea el protocolo dhcp en estado “true, esto significa que usar DNS para las direcciones IP.

1
enrique@enrique-server:~$ nano /etc/netplan/00-installer-config.yaml 

Paso 5

Debo borrar estas líneas e ingresar las siguientes con los datos deseados:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  GNU nano 4.8                           /etc/netplan/00-installer-config.yaml                                      
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      addresses: [192.168.100.160/24]
      gateway4: 192.168.100.11
      nameservers:
        addresses: [192.168.100.11, 8.8.8.8]
  version: 2



                           [ File '/etc/netplan/00-installer-config.yaml' is unwritable ]
^G Get Help     ^O Write Out    ^W Where Is     ^K Cut Text     ^J Justify      ^C Cur Pos      M-U Undo
^X Exit         ^R Read File    ^\ Replace      ^U Paste Text   ^T To Spell     ^_ Go To Line   M-E Redo

Paso 6

Guardo los cambios usando la combinación de teclas siguiente:

Ctrl + O

Salo del editor usando:

Ctrl + X

Paso 7

Compruebo que no existen errores con el siguiente comando:

1
enrique@enrique-server:~$ sudo netplan try

Paso 8

Si todo es correcto aplico los cambios con el siguiente comando:

1
enrique@enrique-server:~$ sudo netplan apply

Paso 9

Reinicio el sistema para completar el proceso de cambio:

1
enrique@enrique-server:~$ sudo reboot

Una vez iniciemos sesión ejecuto de nuevo el comando “ip a” para comprobar que los cambios realizados en la red han sido aplicados de forma correcta. Allí veré la nueva IP establecida.

Acceso remoto via ssh a Ubuntu Server 20.04

Lo siguiente para poder acceder desde mi pc es instalar el servidor ssh openssh en la máquina virtual con Ubuntu.

1
enrique@enrique-server:~$ sudo apt-get install ssh

y compruebo su estado.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
enrique@enrique-server:~$ systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enab
   Active: active (running) since Sun 2020-05-31 13:31:34 BST; 18min ago
  Process: 523 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
 Main PID: 525 (sshd)
    Tasks: 5 (limit: 4915)
   CGroup: /system.slice/ssh.service
           ├─525 /usr/sbin/sshd -D
           ├─555 sshd: root@pts/0
           ├─569 -bash
           ├─860 systemctl status ssh.service
           └─861 systemctl status ssh.service

Todo está correcto, ya puedo habrir una terminal desde mi equipo anfitrión y conectarme vía ssh por el puerto 22 a mi servidor virtualizado. Como es un entorno de desarrollo no cambio más en el servidor ssh, pero quiero recordar que por seguridad en producción se debería haber cambiando el puerto de escucha por defecto, prohibir el cceso de root, etc, todo ello editando el archivo de configuración sshd_config.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
enrique@enrique-server:~$ sudo nano /etc/ssh/sshd_config
#       $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none

Como dije anteriormente abro una consola en mi equipo anfitrion y tecleo ssh enrique@192.168.100.160, intruzco mi contraseña y ya estoy dentro:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
enrique@asuspc:~$ ssh enrique@192.168.100.160
enrique@192.168.100.160´s password: 
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-52-generic x86_64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
  System information as of Thu Nov  5 09:59:26 UTC 2020
  System load:  0.37               Processes:               115
  Usage of /:   23.4% of 18.57GB   Users logged in:         0
  Memory usage: 10%                IPv4 address for enp0s3: 192.168.100.160
  Swap usage:   0%

64 updates can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable


Last login: Wed Nov  4 18:54:04 2020 from 192.168.100.136
enrique@enrique-server:~$ 

Prerequisitos a la instalación de Laravel

Laravel es un marco PHP gratuito y de código abierto que implementa el patrón de diseño MVC (Model-View-Controller). Taylor Otwell lo creó en 2011 como un intento de proporcionar una alternativa avanzada al marco CodeIgniter (CI). En 2011, Laravel lanzó la versión 1 y la versión 2. La última versión 8.x viene con más características mejoradas como esquema de versiones, política de soporte, etiquetas y mejoras de componentes Blade, operaciones de cadenas fluidas, mejoras de enlace del modelo de ruta, etc.

Lo ideal a la hora de trabajar con Laravel en local es instalar su máquina virtual, Laravel Homestead, que viene lista para el desarrollo de proyectos con Laravel y otras tecnologías de PHP como Symfony y Statamic. Al ser una máquina virtual nos va a permitir ejecutar nuestros proyectos sin necesidad de instalar PHP, MySQL, etc. Cuando se tiene experiancia tanto en desarrollo como en producción con laravel, esta opción es la más cómoda. En mi caso no es la que usaré. Estoy aprendiendo a desarrollar con Laravel y quiero aprender lo mas posible al entorno de desarrollo y producción de este ecosistema. Por lo tanto debo de preocuparme de cumplir los prerequisitos necesarios en la instalacion. Mirando en la página de laravel encuentro que son los siguientes:

  • Apache / Nginx
  • MySQL / MariaDB
  • PHP >= 7.3
  • BCMath PHP Extension
  • Ctype PHP Extension
  • Fileinfo PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

1 Instalar el servidor web Apache

Primero, instalaré el servidor web Apache en el sistema Ubuntu 20.04 y configuraré el firewall UFW que solo permite conexiones entrantes para algunos servicios, incluidos SSH, HTTP y HTTPS.

Actualico todos los repositorios disponibles en el sistema e instalo el servidor web Apache.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
enrique@enrique-server:~$  sudo apt update
nrique@enrique-server:~$ sudo apt-get install apache2
[sudo] password for enrique: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap libjansson4 liblua5.2-0 ssl-cert
Suggested packages:
  apache2-doc apache2-suexec-pristine | apache2-suexec-custom www-browser openssl-blacklist
The following NEW packages will be installed:
  apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3
  libaprutil1-ldap libjansson4 liblua5.2-0 ssl-cert
0 upgraded, 11 newly installed, 0 to remove and 3 not upgraded.
Need to get 1865 kB of archives.
After this operation, 8080 kB of additional disk space will be used.
Do you want to continue? [Y/n] 

Una vez completada la instalación, inicio el servicio Apache y lo agréguo al inicio del sistema.

1
2
enrique@enrique-server:~$  sudo systemctl start apache2
enrique@enrique-server:~$  sudo systemctl enable apache2

Ahora verifico el estado del servicio Apache usando el siguiente comando.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
enrique@enrique-server:~$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-11-05 11:12:19 UTC; 2min 23s ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 19476 (apache2)
      Tasks: 55 (limit: 2282)
     Memory: 5.1M
     CGroup: /system.slice/apache2.service
             ├─19476 /usr/sbin/apache2 -k start
             ├─19478 /usr/sbin/apache2 -k start
             └─19479 /usr/sbin/apache2 -k start

Nov 05 11:12:19 enrique-server systemd[1]: Starting The Apache HTTP Server...
Nov 05 11:12:19 enrique-server apachectl[19475]: AH00558: apache2: Could not reliably determine t>
Nov 05 11:12:19 enrique-server systemd[1]: Started The Apache HTTP Server.
lines 1-15/15 (END)

Como resultado, el servicio Apache está en funcionamiento.

Luego, agreguo los servicios SSH, HTTP y HTTPS al firewall UFW usando el siguiente comando.

1
2
3
4
for svc in ssh http https
do 
ufw allow $svc
done

Ahora habilito los servicios de firewall de UFW.

1
sudo ufw enable

Escribo ’ y ’ para continuar y se habrá habilitado el firewall UFW. A continuación, abro su navegador web y escriba la dirección IP de su servidor en la barra de direcciones. http://10.5.5.25/ Y obtengo la página index.html predeterminada de Apache.

Como resultado, puedo afirmar que se completaron correctamente la instalación del servidor web Apache y la configuración del firewall UFW.

2 Instalar y configurar PHP 7.4

En este paso, instalaremos y configuraremos PHP 7.4 para nuestra instalación de Laravel. Para instalar Laravel 8.x, al menos debe tener PHP> = 7.2.5 en su sistema. Y, de forma predeterminada, el repositorio oficial de Ubuntu 20.04 proporciona paquetes PHP 7.4.

Instalé paquetes PHP 7.4 usando el comando apt .

1
sudo apt install libapache2-mod-php php php-common php-mysql php-xml php-gd php-opcache php-mbstring php-tokenizer php-json php-bcmath php-zip unzip
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enrique@enrique-server:~$ sudo apt install libapache2-mod-php php php-common php-mysql php-xml php-gd php-opcache php-mbstring php-tokenizer php-json php-bcmath php-zip unzip
[sudo] password for enrique: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'php7.4-opcache' instead of 'php-opcache'
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core libapache2-mod-php7.4 libfontconfig1 libgd3 libjbig0
  libjpeg-turbo8 libjpeg8 libonig5 libtiff5 libwebp6 libxpm4 libzip5 php7.4 php7.4-bcmath
  php7.4-cli php7.4-common php7.4-gd php7.4-json php7.4-mbstring php7.4-readline php7.4-xml
  php7.4-zip
Suggested packages:
  php-pear libgd-tools zip
The following NEW packages will be installed:
  fontconfig-config fonts-dejavu-core libapache2-mod-php libapache2-mod-php7.4 libfontconfig1
  libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libonig5 libtiff5 libwebp6 libxpm4 libzip5 php
  php-bcmath php-common php-gd php-json php-mbstring php-tokenizer php-xml php-zip php7.4
  php7.4-bcmath php7.4-cli php7.4-common php7.4-gd php7.4-json php7.4-mbstring php7.4-opcache
  php7.4-readline php7.4-xml php7.4-zip unzip
0 upgraded, 35 newly installed, 0 to remove and 3 not upgraded.
Need to get 6785 kB of archives.
After this operation, 27.0 MB of additional disk space will be used.
Do you want to continue? [Y/n] 

Una vez completada toda la instalación, voy al directorio /etc/php/7.4/ y edito la configuración de php.ini para el servidor web Apache2.

1
2
cd /etc/php/7.4/
nano apache2/php.ini

Descomento la opción ‘cgi.fix_pathinfo’ y cambio el valor a ‘0’, cgi.fix_pathinfo=0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  GNU nano 4.8                             apache2/php.ini                              Modified  
; every request. PHP's default behavior is to disable this feature.
;cgi.nph = 1

; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution.  Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
; http://php.net/cgi.redirect-status-env
;cgi.redirect_status_env =

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0


^G Get Help     ^O Write Out    ^W Where Is     ^K Cut Text     ^J Justify      ^C Cur Pos
^X Exit         ^R Read File    ^\ Replace      ^U Paste Text   ^T To Spell     ^_ Go To Line

Guardar y cerrar.

A continuación, reinicio el servicio Apache para aplicar la nueva configuración ‘php.ini’.

1
enrique@enrique-server:~$ sudo systemctl restart apache2

Como resultado, la configuración básica de PHP 7.4 se ha completado con éxito.

3 Instalar la administración de paquetes PHP de Composer

Composer es un administrador de dependencias para PHP. Es un administrador de paquetes a nivel de aplicación para PHP que le permite descargar bibliotecas y dependencias PHP adicionales a su proyecto PHP.

En este tutorial, usaré Composer para instalar Laravel e instalaré Composer descargando el archivo binario desde el sitio web oficial de Composer.

Descargué el archivo binario del Composer y lo muevo al directorio / usr / local / bin.

1
2
3
4
5
6
7
8
enrique@enrique-server:~$ sudo curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 2.0.4) successfully installed to: /home/enrique/composer.phar
Use it: php composer.phar

enrique@enrique-server:~$ sudo mv composer.phar /usr/local/bin/composer

Después de eso, verifico la versión de Composer usando el siguiente comando.

1
2
enrique@enrique-server:~$ composer --version
Composer version 2.0.4 2020-10-30 22:39:11

4 Instalar servidor MySQL

Los paquetes del servidor MySQL 8.0 están disponibles en los repositorios predeterminados en Ubuntu 20.04. Después de iniciar sesión en su servidor, actualice apt cache y ejecute los paquetes de instalación. Para instalar el tipo de servidor MySQL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
enrique@enrique-server:~$ sudo apt-get install mysql-server
[sudo] password for enrique: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libcgi-fast-perl libcgi-pm-perl libencode-locale-perl libevent-core-2.1-7
  libevent-pthreads-2.1-7 libfcgi-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl
  liblwp-mediatypes-perl libmecab2 libtimedate-perl liburi-perl mecab-ipadic
  mecab-ipadic-utf8 mecab-utils mysql-client-8.0 mysql-client-core-8.0
  mysql-common mysql-server-8.0 mysql-server-core-8.0
Suggested packages:
  libdata-dump-perl libipc-sharedcache-perl libwww-perl mailx tinyca
The following NEW packages will be installed:
  libcgi-fast-perl libcgi-pm-perl libencode-locale-perl libevent-core-2.1-7
  libevent-pthreads-2.1-7 libfcgi-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl
  liblwp-mediatypes-perl libmecab2 libtimedate-perl liburi-perl mecab-ipadic
  mecab-ipadic-utf8 mecab-utils mysql-client-8.0 mysql-client-core-8.0
  mysql-common mysql-server mysql-server-8.0 mysql-server-core-8.0
0 upgraded, 25 newly installed, 0 to remove and 3 not upgraded.
Need to get 30.7 MB of archives.
After this operation, 249 MB of additional disk space will be used.
Do you want to continue? [Y/n] 

Espero a que el administrador de paquetes complete la instalación. Después de finalizar la instalación, el servicio MySQL se iniciará automáticamente. Para comprobar el tipo de estado del servicio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
enrique@enrique-server:~$ sudo systemctl status mysql
● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-11-05 21:06:59 UTC; 1min 18s ago
   Main PID: 1767 (mysqld)
     Status: "Server is operational"
      Tasks: 37 (limit: 2282)
     Memory: 331.8M
     CGroup: /system.slice/mysql.service
             └─1767 /usr/sbin/mysqld

Nov 05 21:06:54 enrique-server systemd[1]: Starting MySQL Community Server...
Nov 05 21:06:59 enrique-server systemd[1]: Started MySQL Community Server.

5 Asegurando el servidor mysql

En esta etapa, el servidor MySQL aún no está protegido. Puede cambiar al usuario root de su sistema y conectarse al servidor MySQL. No solicitará ninguna contraseña.

Entonces, aquí necesito asegurar el servidor MySQL. Los paquetes proporcionan un script para hacerlo. Ejecuto el siguiente comando para la configuración inicial de mi servidor MySQL. El script solicitará más configuraciones que las versiones anteriores de MySQL, como la política de validación de contraseña, etc.

1
enrique@enrique-server:~$ sudo mysql_secure_installation

Sigo las instrucciones en pantalla para finalizar el asistente. Todas las entradas del usuario están resaltadas en el asistente a continuación. Esto creará una contraseña para el usuario raíz, eliminará la base de datos de prueba y el usuario para proteger el servidor de la base de datos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
enrique@enrique-server:~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Please set the password for root here.

New password: esaborit

Re-enter new password: esaborit

Estimated strength of the password: 50 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL 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? (Press y|Y for Yes, any other key for No) : 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? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL 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? (Press y|Y for Yes, any other key for No) : 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? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 

6 Administrando el servidor MySQL

El servicio MySQL se administra bajo el administrador de servicios systemd. Puedo usar los comandos systemctl predeterminados para administrar el servicio de base de datos en la línea de comandos. A continuación se muestran algunos comandos de uso frecuente para administrar el servicio:

  • Para detener el servicio MySQL, escriba: sudo systemctl detener mysql
  • Para iniciar el servicio MySQL, escriba: sudo systemctl iniciar mysql
  • Deténgase y luego inicie el servicio MySQL, escriba: sudo systemctl reiniciar mysql
  • Para ver el estado del servicio MySQL, escriba: sudo systemctl estado mysql

7 Conectandome al servidor MySQL

He instalado y asegurado correctamente el servidor de base de datos MySQL en mi sistema Ubuntu 20.04. Ahora me conecto a mi servidor de base de datos en la línea de comandos con el siguiente comando.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
enrique@enrique-server:~$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.22-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

Nota: Cuando instala MySQL e intenta acceder a él en la máquina local con el usuario root , el comando que usa es:mysql -u root -p. En la mayoría de los casos, recibirá el mensaje de error: ERROR 1698 (28000): Access denied for user ‘root’@’localhost’. Para poder iniciar sesión en MySQL como root, primero use sudo para modificar el usuario root:sudo mysql. Utilice el comando ALTER USER y cambie el método de autenticación para iniciar sesión en MySQL como root : ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'esaborit';

Ya puedo entrar como root.

8 Creo un usuario y una base de datos MySQL para mi proyecto en Laravel

Como me he conectado al servidor MySQL en la línea de comandos. El servidor de base de datos está listo para que sus aplicaciones almacenen datos.

Crearé un usuario de base de datos independiente para conectar la base de datos mediante la aplicación. Utilice los siguientes comandos para crear una base de datos en MySQL. Luego crearé un usuario y le asignaré privilegios en la base de datos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
mysql> CREATE DATABASE laravel_proyecto1;
Query OK, 1 row affected (0.46 sec)

mysql> CREATE USER 'laraveluser'@'localhost' IDENTIFIED BY 'Laravel_user1';
Query OK, 0 rows affected (0.37 sec)

mysql> GRANT ALL PRIVILEGES ON laravel_proyecto1.* TO 'laraveluser'@'localhost'; 
Query OK, 0 rows affected (0.29 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.15 sec)

Instalación de Laravel 8.x en Ubuntu 20.04

Para este paso, voy a describir dos formas diferentes de instalar el marco web de Laravel. Instalaré Laravel a través del Instalador de Laravel y a través de Composer. Esta sección instalará el marco web de Laravel con el usuario no root llamado ’enrique’.

Nota: En mi caso el usuario ya existe y si tiene privilegios de sudo que no utilizo para instalar laravel Se puede agregar el usuario y configurar su contraseña usando el siguiente comando.

1
2
useradd -m -s /bin/bash enrique
passwd enrique

Después de eso, inicie sesión con el usuario ’enrique’.

1
su - enrique

1 Instalando Laravel Via Composer create-project

Una forma de instalar el marco web de Laravel es mediante la gestión de paquetes PHP de Composer. Para instalar Laravel, me dirijo al directorio “proyectos_laravel” que he creado en mi directorio personal. Como estamos en Ubuntu y usando Apache,otra opción poría ser instalarlo en el directorio /var/www/laravel. Pero voy a usar Visual Studio como IDE de desarrollo y accederé vía ssh al servidor con Ubuntu y me resulta mas cómodo trabajar desde mi directorio personal.

1
2
enrique@enrique-server:~$ cd /home/proyectos_laravel/
enrique@enrique-server:/var/www/laravel$ sudo composer create-project --prefer-dist laravel/laravel prueba1

El comando anterior creará el directorio «prueba1» con la instalación de Laravel. Composer usa git para descargar e instalar todos los paquetes y módulos que Laravel requiere para funcionar.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
enrique@enrique-server:~/proyectos_laravel$ composer create-project --prefer-dist laravel/laravel prueba1
Creating a "laravel/laravel" project at "./prueba1"
Installing laravel/laravel (v8.4.0)
  - Downloading laravel/laravel (v8.4.0)
  - Installing laravel/laravel (v8.4.0): Extracting archive
Created project in /home/enrique/proyectos_laravel/prueba1
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 104 installs, 0 updates, 0 removals
  - Locking asm89/stack-cors (v2.0.2)
  - Locking brick/math (0.9.1)
  - Locking dnoegel/php-xdg-base-dir (v0.1.1)
  - Locking doctrine/inflector (2.0.3)
  - Locking doctrine/instantiator (1.3.1)
  - Locking doctrine/lexer (1.2.1)
  - Locking dragonmantank/cron-expression (v3.0.2)
  .........

A continuación, cambie la propiedad del directorio del proyecto ‘prueba1’ al usuario ‘www-data’ y haga que se pueda escribir en el directorio ‘storage’.

1
2
enrique@enrique-server:~$ sudo chown -R www-data:www-data /home/enrique/proyectos_laravel/prueba1
enrique@enrique-server:~$ sudo chmod -R 775 /home/enrique/proyectos_laravel/prueba1/storage

Como resultado, ha instalado el marco web de Laravel usando el comando Composer.

1.2 Configuracion de Apache para el proyecto prueba1 en Laravel

En este paso, configuraremos el host virtual Apache para el proyecto prueba1.

Ahora voy al directorio ‘/etc/apache/sites-available’ y creo con el editor nano una nueva configuración de host virtual llamada ‘prueba1.conf’.

1
2
cd /etc/apache2/sites-available/
sudo nano prueba1.conf

Cambio el nombre de dominio y el directorio root por el mio y peguo la configuración en él.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<VirtualHost *:80>
    ServerName prueba1.com
    ServerAdmin admin@prueba1.com
    DocumentRoot /home/enrique/proyectos_laravel/prueba1/public

    <Directory /home/enrique/proyectos_laravel/prueba1/>
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Order Allow,Deny
          Allow from all
          Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName proyectolaravel_1.com
    ServerAdmin admin@proyectolaravel_1.com
    DocumentRoot /var/www/laravel/proyectolaravel_1/public

    <Directory /var/www/laravel/proyectolaravel_1/>
          Options Indexes FollowSymLinks MultiViews
          AllowOverride All
          Order Allow,Deny
          Allow from all
          Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Guardar y cerrar.

A continuación, activo el módulo de reescritura de Apache y la configuración del host virtual de Laravel usando el siguiente comando.

1
2
sudo a2enmod rewrite
sudo a2ensite laravel.conf

Después de eso, pruebo la configuración de Apache, asegúrese de que no haya ningún error y reinicie el servicio Apache.

1
2
apachectl configtest
systemctl restart apache2

Con esto, completo la configuración del host virtual Apache para Laravel. Puedo acceder a prueba1.com desde un navegador web de mi pc anfitrión con solo modificar el hosts.

2 Instalando Laravel con su instalador

Hay una alternativa para instalar Laravel y es con su instalador, que también es un paquete, por tanto, también usaremos Composer para instalarlo de forma global con el comando:

1
enrique@enrique-server:~$ composer global require "laravel/installer"

Luego, nos tenemos que asegurar que la variable de entorno PATH del sistema operativo tenga incluido el directorio donde se alojan los paquetes instalados globalmente y así se puedan ejecutar sin ningún problema, para ello debemos agregar su ruta:

Para MacOs y Linux la variable PATH la podemos definir en ~/.bashrc o ~/.bash_profile:

1
enrique@enrique-server:~$ sudo nano ~/.bashrc

donde la ruta a añadir al final de lo que tiene asignado la variable es:

1
export PATH="$HOME/.config/composer/vendor/bin:$PATH"

Para Windows debes modificar la variable de entorno PATH para agregar la ruta

1
;C:\Users\tu-usuario\AppData\Roaming\Composer\vendor\bin

Ahora cargo la nueva versión de la configuración ~ / .bashrc y verifico la variable de entorno $ PATH. A continuación se muestra el resultado que obtendrá.

1
2
3
enrique@enrique-server:~$ source ~/.bashrc
enrique@enrique-server:~$ echo $PATH
/home/enrique/.config/composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Bien, de esta manera ya tenemos disponible el instalador de Laravel, por tanto, podemos ejecutar desde cualquier directorio:

1
laravel new nombre-proyecto

y se instalará tal y como se hizo con el comando composer create-project.

Accesibilidad del proyecto laravel desde APACHE

Para que el servidor web Apache acceda al directorio de su proyecto de Laravel, cambie el propietario del grupo del directorio del proyecto al grupo ‘www-data’ y haga que el directorio de ‘almacenamiento’ se pueda escribir.

1
2
enrique@enrique-server:~$ sudo chgrp -R www-data /var/www/laravel/blog
enrique@enrique-server:~$ sudo chmod -R 775 /var/www/laravel/blog/storage

El proyecto está listo para configurar el host virtual Apache para su proyecto Laravel.

Cómo configurar una identificación de grupo en un directorio:

1
chmod 2775 /var/www

El 2 delante de 775 hace que el grupo que es el propietario de /var/www se copie en todos los archivos/carpetas nuevos creados en ese directorio.

También hay otras opciones además de 2:

0: setuid, setgid, sticky bits are unset

1: sticky bit is in place

2: setgid bit is in place

3: setgid and sticky bits are in place

4: setuid bit is in place

5: setuid and sticky bits are in place

6: setuid and setgid bits are on

7: setuid, setgid, sticky bits are activated

Borrando la cache de la aplicación

Almacenamiento en caché de configuración
La configuración de laravel se extiende a través de docenas de archivos, e including cada uno de ellos para cada solicitud es un proceso costoso. Para combinar todos tus archivos de configuración en uno.

1
 php artisan config:cache 

Tenga en cuenta que cualquier cambio en la configuración no tendrá ningún efecto una vez que lo haya almacenado en caché. Para actualizar la caché de configuración, vuelva a ejecutar el comando anterior. En caso de que quiera deshacerse completamente de la caché de configuración, ejecute 1

1
 php artisan config:clear 

Enrutamiento de caché de rutas
El enrutamiento también es una tarea costosa en laravel. Para almacenar en caché el archivo routes.php, ejecute el siguiente comando: 1

1
 php artisan route:cache 

Tenga en cuenta que no funciona con cierres. En caso de que esté utilizando cierres, esta es una gran oportunidad para moverlos a un controlador, ya que el comando artesanal arrojará una excepción cuando intente comstackr rutas que estén unidas a cierres en lugar de a un método de control adecuado. Al igual que la caché de configuración, cualquier cambio en routes.php ya no tendrá ningún efecto. Para actualizar la memoria caché, ejecute el comando anterior cada vez que realice un cambio en el archivo de rutas. Para deshacerse completamente de la caché de ruta, ejecute el siguiente comando: 1

1
 php artisan route:clear 

Optimización de Classmap

No es raro que un proyecto de tamaño mediano se extienda a través de cientos de archivos PHP. Como los buenos comportamientos de encoding nos dictan, todo tiene su propio archivo. Esto, por supuesto, no viene sin inconvenientes. Laravel tiene que incluir docenas de archivos diferentes para cada solicitud, lo cual es una tarea costosa.

Por lo tanto, un buen método de optimización es declarar qué archivos se utilizan para cada solicitud (esto es, por ejemplo, todos sus proveedores de servicios, middleware y algunos más) y combinarlos en un solo archivo, que luego se cargará para cada solicitud. Esto no es diferente de combinar todos tus archivos javascript en uno, por lo que el navegador tendrá que hacer menos solicitudes al servidor.

Los archivos de comstackción adicionales (una vez más: proveedores de servicios, middleware, etc.) deben ser declarados por usted en config / compile.php, en la clave de archivos. Una vez que coloque allí todo lo esencial para cada solicitud hecha a su aplicación, concatenarlos en un archivo con: 1

1
 php artisan optimize --force 

Optimizar la autocarga del compositor

Este no es solo para laravel, sino para cualquier aplicación que esté haciendo uso del compositor.

Primero explicaré cómo funciona la carga automática del PSR-4, y luego le mostraré qué comando debe ejecutar para optimizarlo. Si no está interesado en saber cómo funciona el compositor, le recomiendo que salte directamente al comando de la consola.

Cuando le pides a compsoser la clase App\Controllers\AuthController, primero busca una asociación directa en el mapa de clases. El mapa de clases es una matriz con asociaciones de clases y archivos de 1 a 1. Como, por supuesto, no agregó manualmente la clase de inicio de sesión y su archivo asociado al mapa de clases, el compositor continuará y buscará en los espacios de nombres. Como App es un espacio de nombres PSR-4, que viene por defecto con Laravel y está asociado a la aplicación/carpeta, el compositor intentará convertir el nombre de la clase PSR-4 en un nombre de archivo con procedimientos básicos de manipulación de cadenas. Al final, adivina que App\Controllers\AuthController debe estar ubicado en un archivo AuthController.php, que se encuentra en una carpeta de Controladores que afortunadamente debe estar en la carpeta del espacio de nombres, que es la aplicación /.

Todo este trabajo duro solo para conseguir que la clase App\Controllers\AuthController exista en el archivo app/Controllers/AuthController.php. Para que el compositor explore toda la aplicación y cree asociaciones directas de clases y archivos de 1 a 1, ejecute el siguiente comando:

1
 composer dumpautoload -o 

Tenga en cuenta que si ya ejecutó php artisan optimize –force, ya no tiene que ejecutar este. Dado que el comando de optimización ya le dice al compositor que cree una carga automática optimizada.

Clear Cache:

1
php artisan cache:clear

Clear Route Cache:

1
php artisan route:cache

Clear View Cache:

1
php artisan view:clear

Clear Config Cache:

1
php artisan config:cache

You can also clear cache without command using route. so you can create route as like bellow:

1
2
3
4
5
Route::get('/clear-cache-all', function() {
    Artisan::call('cache:clear');
  
    dd("Cache Clear All");
});