Sobre este post, documentaremos el proceso de instalacion de Laravel sobre una distribucion GNU-Linux, esto con el fin de crear un entorno de desarrollo basado en este FrameWork.

Herramientas:

  • Servidor Gnu-Linux basado en Ubuntu 18.04LTS con Acceso Root.
  • PC de escritorio con cliente SSH para conectarse al servidor.

Actualizando el Sistema Operativo y creando memoria Swap.

Antes de realizar la instalacion de nuestro FrameWork, es necesario tener la paqueteria de nuestro sistema al dia, para esto actualizamos aplicando el siguiente comando

apt-get update && apt-get upgrade

tambien, recomendamos asignar memoria swap al sistema de la siguiente manera.
Comprobamos que no exista ninguna swap montada

swapon -s

Creamos la swap de 2GB

dd if=/dev/zero of=/swapfile count=2048 bs=1M

Asignamos permisos al archivo creado

chmod 600 /swapfile

Se configura el archivo

mkswap /swapfile

Se enciende la swap

swapon /swapfile

editamos el siguiente archivo y agregamos la linea

nano /etc/fstab
/swapfile   none    swap    sw    0   0

instalando Nginx

Para crear el usuario laravel sobre el directorio de trabajo del servidor Web, instalaramos el servidor Nginx.

apt-get install nginx

despues de instalar el servidor, validamos que se ha creado el directorio de trabajo.

ls -l /var/www/html/
total 4
-rw-r--r-- 1 root root 612 May 13 16:27 index.nginx-debian.html

Instalando php y sus dependencias

Instalamos php sobre su ultima version disponible para nuestro sistem perativo.

apt-get install php

validamos la version de php instalada

php --version
PHP 7.2.3-1ubuntu1 (cli) (built: Mar 14 2018 22:03:58) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.3-1ubuntu1, Copyright (c) 1999-2018, by Zend Technologies

apt-get install php7.2-mbstring php-xml php7.2-zip php-fpm

instalamos las dependencias necesarias para Laravel.

Configuramos php-fpm editando el siguiente archivo

sudo nano /etc/php/7.2/fpm/php.ini

editamos los siguientes parametros con los valores mostrados acontinuacion

memory_limit = 256M
cgi.fix_pathinfo=0

Reiniciamos el servicio php-fpm

systemctl restart php7.2-fpm

Validamos el Status del servicio

systemctl status php7.2-fpm

creando el usuario Laravel.

sobre el directorio de trabajo para el servidor Nginx, vamos a crear un usuario el cual administrara todos los proyectos creados con laravel.

adduser --home /var/www/html/laravel laravel
usermod -a -G sudo laravel

para esta prueba, daremos permisos de sudo a nuestro usuario ya que es necesario al momento de instalar composer en php.

Instalando Composer

Para instalarlo, seguiremos el procedimiento descrito por el desarrollador.
pero es necesario loguearse con el usuario laravel.

su laravel

nos movemos al directorio de trabajo del usuario

cd && pwd
/var/www/html/laravel

descargamos el instalador y validamos su hash.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

ejecutamos el setup

php composer-setup.php
php -r "unlink('composer-setup.php');"

Si todo se ejecuto correctamente, sobre el directorio del usuario se creara un archivo llamado "composer.phar", es necesario moverlo para que quede de manera global sobre el sistema.

ls -lh
total 1.8M
-rwxr-xr-x 1 laravel laravel 1.8M May 13 16:56 composer.phar

para mover el archivo, se debe de tener permisos de super usuario.

sudo mv composer.phar /usr/local/bin/composer

Instalando Laravel desde Composer

Seguiremos el procedimiento descrito por desarrollador para la instalacion

composer global require "laravel/installer"
Changed current directory to /var/www/html/laravel/.config/composer
Using version ^2.0 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 9 installs, 0 updates, 0 removals
  - Installing symfony/process (v4.0.9): Downloading (100%)         
  - Installing symfony/filesystem (v4.0.9): Downloading (100%)         
  - Installing symfony/polyfill-mbstring (v1.8.0): Downloading (100%)         
  - Installing symfony/console (v4.0.9): Downloading (100%)         
  - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)         
  - Installing psr/http-message (1.0.1): Downloading (100%)         
  - Installing guzzlehttp/psr7 (1.4.2): Downloading (100%)         
  - Installing guzzlehttp/guzzle (6.3.3): Downloading (100%)         
  - Installing laravel/installer (v2.0.1): Downloading (100%)         
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing symfony/lock ()
symfony/console suggests installing psr/log-implementation (For using the console logger)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files

editamos el archivo .bashrc de nuestro usuario laravel y agregamo la linea relacionada con el path al final del archivo

export PATH=$PATH:/var/www/html/laravel/.config/composer/vendor/bin/

es necesario cerrar sesion del usuario y volverla a iniciar sobre bash para que la configuracion tome efecto

exit
su laravel

Imprimimos las variables del path y confirmamos que apuntel a que acabamos de agregar

echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:u:/var/www/html/laravel/.config/composer/vendor/bin/

Validamos que se pueda ejecutar laravel con el usuario.

laravel
Laravel Installer 2.0.1

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
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help  Displays help for a command
  list  Lists commands
  new   Create a new Laravel application.
laravel@laravel:~$ 

Creando un proyecto Laravel.

Una vez instalado, podremos crear sobre el directorio del usuario algun proyecto basado en Laravel utilizando la siguiente instruccion.

laravel new ProyectoLaravel

es posible tambien desplegar un proyecto Laravel por medio de composer indicando la version de laravel a instalar, si no es indicada instala la version mas actual disponible, el siguiente comando crea un proyecto con la version de laravel 5.5

composer create-project laravel/laravel ProyectoLaravel 5.5

Si todo se ejecuto correctamente, se creara el directorio y se desplegara el Framework.

ls -lh ProyectoLaravel/
total 460K
drwxrwxr-x  6 laravel laravel 4.0K May 13 17:28 app
-rw-rw-r--  1 laravel laravel 1.7K May 13 17:28 artisan
drwxrwxr-x  3 laravel laravel 4.0K May 13 17:28 bootstrap
-rw-rw-r--  1 laravel laravel 1.5K May 13 17:28 composer.json
-rw-rw-r--  1 laravel laravel 141K May 13 17:28 composer.lock
drwxrwxr-x  2 laravel laravel 4.0K May 13 17:28 config
drwxrwxr-x  5 laravel laravel 4.0K May 13 17:28 database
-rw-rw-r--  1 laravel laravel 1022 May 13 17:28 package.json
-rw-rw-r--  1 laravel laravel 1.2K May 13 17:28 phpunit.xml
drwxrwxr-x  4 laravel laravel 4.0K May 13 17:28 public
drwxrwxr-x  5 laravel laravel 4.0K May 13 17:28 resources
drwxrwxr-x  2 laravel laravel 4.0K May 13 17:28 routes
-rw-rw-r--  1 laravel laravel  563 May 13 17:28 server.php
drwxr-xr-x  5 laravel laravel 4.0K May 13 17:28 storage
drwxrwxr-x  4 laravel laravel 4.0K May 13 17:28 tests
drwxrwxr-x 37 laravel laravel 4.0K May 13 17:29 vendor
-rw-rw-r--  1 laravel laravel  549 May 13 17:28 webpack.mix.js
-rw-rw-r--  1 laravel laravel 252K May 13 17:28 yarn.lock

Ejecutando el proyecto.

Es posible ejecutar el proyecto de manera local y comprobar que se este ejecutando correctamente, pero para ello tendremos que bajar primero el servidor nginx o ejecutar la aplicacion en un puerto diferente al 80.

sudo systemctl stop nginx.service

nos movemos al directorio del nuevo proyecto y ejecutamos de manera local el servidor.

cd ProyectoLaravel/
php artisan serve --host=149.28.43.181  --port=8080
Laravel development server started: <http://149.28.43.181:8080>
[Sun May 13 17:36:27 2018] 186.119.247.101:18746 [200]: /favicon.ico

esto desplegara la aplicacion sobre el servidor, lo podremos comprobar accediendo a la URL por medio del navegador WEB.
laravel1

Configurando la web sobre Nginx.

Como pudimos observar en el paso anterior , la aplicacion se desplego no sobre Nginx si no sobre el servidor disponible sobre el Framework Laravel llamado "artisan", el servidor Nginx se bajo mientras se confirmaba la ejecucion de la aplicacion.
El paso siguiente sera redireccionar las peticiones que se realizen sobre la web al directorio del proyecto, para esto se debe de agregar un host virtual en el servidor.

Configurando el host virtual

Creamos el archivo que administrara el host virtual, con el siguiente comando.

nano /etc/nginx/sites-available/laravel

y agregamos el siguiente contenidos

server {
    listen 80;
    listen [::]:80;
    root /var/www/html/laravel/ProyectoLaravel/public;
    index  index.php index.html index.htm;
    server_name  mipagina.com www.mipagina.com;

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


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

}

Habilitamos el sitio creando un enlace del archivo laravel sobre el directorio de sitios validos en nginx

ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/laravel

Asignamos los permisos al directorio del proyecto Laravel para el el usuario de Nginx pueda acceder a ellos.

sudo chown -R www-data:www-data /var/www/html/laravel/ProyectoLaravel/
sudo chmod -R 755 /var/www/html/laravel/ProyectoLaravel/

Reiniciamos el servidor y Confirmamos el acceso a la WEB.

systemctl restart nginx.service

laravel2

Configurando el servidor Bajo Https

El primer paso es crear o generar el certificado SSL con su respectiva Key para realizar la transmision del trafico via Https

Una vez creado el directorio, vamos a generar el certificado y la llave.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/mipagina.com.key -out /etc/ssl/certs/mipagina.com.crt

tambien crearemos el archivo para el grupo Diffie-Hellman

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Creamos un fragmento de codigo de configuracion el cual contendra el llamado a estos archivo, este se creara en el directorio /etc/nginx/snippets

sudo nano /etc/nginx/snippets/self-signed.conf

agregamos las lineas con la respectiva ruta del certificado y el key, guardamos el archivo.

ssl_certificate /etc/ssl/certs/mipagina.com.crt;
ssl_certificate_key /etc/ssl/private/mipagina.com.key;

Para agregar un poco mas de seguridad, crearemos otro fragmento de codigo de configuracion en donde habilitaremos algunas reglas para SSL, es necesario realizar la actualizacion de los servidores DNS.

sudo nano /etc/nginx/snippets/ssl-params.conf
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Debemos modificar de nuevo el archivo del servidor "/etc/nginx/sites-available/laravel"

nano  /etc/nginx/sites-available/laravel

Agregamos las siguientes lineas

server {
    listen 80;
    listen [::]:80;
    root /var/www/html/laravel/ProyectoLaravel/public;
    index  index.php index.html index.htm;
    server_name  mipagina.com www.mipagina.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
   
    return 301 https://$server_name$request_uri;
    }


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

}

server {
	listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
	root /var/www/html/laravel/ProyectoLaravel/public;
    index  index.php index.html index.htm;
    server_name mipagina.com www.mipagina.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        return 301 https://$server_name$request_uri;
    }
    
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass             unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }


         include snippets/self-signed.conf;
         include snippets/ssl-params.conf;       
       
}

reiniciamos el servidor Nginx

systemctl restart nginx.service

Ingresamos de nuevo al site y comprobamos el acceso via Https
larevel3