Implementación de una aplicación en Laravel 7 en Ubuntu y Nginx

Implementación de una aplicación en Laravel 7 en Ubuntu y Nginx

Decidí hacer mi portafolio usando Laravel 7. Para que la página principal fuera una página de destino y toda la información que contiene se pudiera cambiar usando el panel de administración. No es la cuestión. Llegó el momento del despliegue. Encontré un par de buenos tutoriales sobre cómo hacer esto en un servidor completo con todos los problemas. No soy muy fuerte en implementación; generalmente soy más front-stack que full-stack. Y, si todavía puedo escribir y probar en PHP, antes de administrar el servidor, etc. No he crecido todavía. Pero tuve que resolverlo.

Ahora repasaremos todos los pasos, comenzando con el inicio a través de SSH y terminando con el sitio de trabajo. Intentaremos evitar todos los obstáculos.

Es posible que pueda encontrar instrucciones similares en línea. Después de todo, finalmente lo encontré. Es cierto que no en un solo lugar, no sin la ayuda de StackOverflow y difícilmente en ruso. Yo sufrí. Por eso decidí simplificar tu vida.

Haremos todo con una gota en DigitalOcean. Esto, por supuesto, no es necesario, elige cualquier hosting. Cuando llegue a un servidor que funcione en Ubuntu, regrese. Para aquellos que aún decidan hacerlo en DigitalOcean, habrá más consejos sobre cómo configurar un dominio. Y Enlace de referencia de $100.

Todos los pasos específicos de DigitalOcean se darán en notas a pie de página como estas.

Vamos a empezar

TL;DR (solo comandos básicos)

Crear un usuario

  • ssh root@[IP-адрес вашего дроплета]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Agrégale SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Insertar la clave pública
  • chmod 600 ~/.ssh/authorized_keys

Cortafuegos

  • sudo ufw allow OpenSSH
  • sudo ufw enable
  • sudo ufw status

Nginx

  • sudo apt update
  • sudo apt install -y nginx
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

MySQL

  • sudo apt install -y mysql-server
  • sudo mysql_secure_installation, NYNNY
  • sudo mysql
  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';
  • SELECT user,authentication_string,plugin,host FROM mysql.user;
  • FLUSH PRIVILEGES;
  • exit

PHP

  • sudo apt update

  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https

  • sudo apt-add-repository ppa:ondrej/php

  • sudo apt update

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql

  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

Configuración básica:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

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

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

        location ~ /.ht {
                deny all;
        }
}

Sólo configuración HTTP para Laravel:

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

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

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

    location ~ /.ht {
        deny all;
    }
}

Configuración HTTPS para Laravel:

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

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

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

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

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

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

  • sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • sudo unlink /etc/nginx/sites-enabled/default
  • sudo nginx -t
  • sudo systemctl reload nginx

laravel

  • 7.3: sudo apt install -y php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install -y php7.4-mbstring php7.4-xml composer unzip

  • mysql -u root -p

  • CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • sudo mkdir -p <Имя проекта>

  • sudo chown laravel:laravel <Имя проекта>

  • cd ./<Имя проекта>

  • git clone <ссылка на проект> . / git clone -b <имя ветки> --single-branch <ссылка на проект> .

  • composer install

  • vim .env

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

  • php artisan migrate

  • php artisan key:generate

  • sudo chown -R $USER:www-data storage

  • sudo chown -R $USER:www-data bootstrap/cache

  • chmod -R 775 storage

  • chmod -R 775 bootstrap/cache

HTTPS

  • sudo add-apt-repository ppa:certbot/certbot

  • sudo apt install -y python-certbot-nginx

  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

  • sudo nginx -t

  • sudo ufw allow 'Nginx HTTPS'

  • sudo ufw status

  • sudo systemctl reload nginx

Cree un droplet en DigitalOcean y registre una nueva clave SSH

Realmente creo que usted mismo descubrirá cómo registrarse en DigitalOcean. No es fácil, con muchas verificaciones y otras cosas. Si recibe constantemente un error de red al verificar mediante documentos, intente hacerlo todo a través de una VPN, debería ayudar.

En el menú de la parte superior, haz clic en Crear->Gotitas. Elegir Ubuntu.

Tan pronto como se registre, recibirá $100 en su cuenta. Pero no se deje engañar. Sólo tienes 60 días para gastarlo. Y esto es muy poco. Es posible que, como yo, quieras utilizar un plan más caro, para que luego, cuando el dinero real empiece a fluir, puedas cambiar a uno más barato. Te diré de inmediato que no funcionará. Puedes aumentarlo, pero no puedes disminuirlo. Así que va. yo elijo Estándar->$5.

Elijo la región más cercana a nosotros. Frankfurt. Red de VPC->predeterminado-fra1

Inmediatamente realizaremos la autenticación vía SSH. Hacer clic Nueva clave SSH. Si no tiene SSH, hay instrucciones muy simples a la derecha. Abra una terminal bash y pegue ssh-keygen. Luego vamos al archivo con la clave pública. /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (o simplemente cat ~/.ssh/id_rsa.pub), copia el contenido y pégalo en la ventana de la izquierda. Cualquier nombre.

Se nos ocurre un nombre de host para la gota.

Haga clic aquí Crear gota

Crear un nuevo usuario

  • ssh root@[IP-адрес вашего дроплета]
  • ¿Está seguro de que desea continuar conectándose (sí/no/[huella digital])? yes
  • Ingrese su contraseña SSH
  • Crear un usuario laravel: adduser laravel
  • Ingresa tu contraseña y otros datos (solo ingreso Nombre Completo)
  • Agregue el usuario al grupo sudo: usermod -aG sudo laravel

SSH para nuevo usuario

  • Cambie al nuevo usuario: su laravel

Llevamos a cabo todas las acciones hasta el final del artículo, en nombre del usuario de laravel. Por lo tanto, si de repente te interrumpen, vuelve a iniciar sesión e ingresa su laravel

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys

Abrimos el archivo en Vim. Si no estás familiarizado con él en absoluto, puedes trabajar en Nano, tu derecho.

Los comandos más básicos de Vim

Para utilizar el editor Vim a lo largo del artículo, sólo necesita saber lo siguiente.

  • Vim tiene diferentes modos: Modo normal, en el que ingresas comandos y seleccionas modos y otros.
  • Para salir de cualquier modo y volver al modo normal, simplemente presione Esc
  • Moverse: solo puedes usar flechas
  • Salir sin guardar <Normal mode>: :q!
  • Salir y guardar <Normal mode>: :wq
  • Cambiar al modo de entrada de texto <Normal mode>: i (del inglés. insertar)
  • Insertamos nuestra clave pública (lo cual hicimos arriba)
  • Nos protegemos contra cambios: chmod 600 ~/.ssh/authorized_keys

Instalación de un cortafuegos

  • Veamos todas las configuraciones disponibles: sudo ufw app list
  • Permitir OpenSSH (de lo contrario nos bloqueará): sudo ufw allow OpenSSH
  • Iniciemos el firewall: sudo ufw enable, y
  • Comprobamos: sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Esta todo bien

Instalación de Nginx

Durante la instalación a veces se le preguntará "¿Está seguro?" Respuesta y (bueno, sólo si estás seguro).

  • sudo apt update
  • sudo apt install nginx

Agregar Nginx a la configuración del firewall

  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Vaya a su IP. Si todo va bien deberías ver lo siguiente.

Implementación de una aplicación en Laravel 7 en Ubuntu y Nginx

Instalación de MySQL

  • sudo apt install mysql-server
  • Lanzar un script de protección automática sudo mysql_secure_installation

Responde las preguntas formuladas. Si no sabes qué responder, aquí te sugerimos algunas opciones:

  • Complemento de validación de contraseña - N

  • ¿Eliminar usuarios anónimos? — Y

  • ¿No permitir el inicio de sesión de root de forma remota? — N

  • ¿Eliminar la base de datos de prueba y acceder a ella? — N

  • ¿Recargar tablas de privilegios ahora? — Y

  • Vayamos a MySQL: sudo mysql

  • Veamos los métodos de acceso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Establezca una contraseña para root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Veamos nuevamente los métodos de acceso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Aplique los cambios y salga de MySQL: FLUSH PRIVILEGES; и exit

  • Ahora, para iniciar sesión en MySQL necesitas usar mysql -u root -p e ingresa la contraseña

Instalando PHP

Usemos un repositorio de terceros de Ondrej Sury

  • sudo apt update
  • sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https
  • sudo apt-add-repository ppa:ondrej/php
  • sudo apt update

Ahora elijamos. Para Laravel 7, puedes elegir PHP 7.3 o 7.4. La única diferencia estará en los números 3 y 4.

  • 7.3: sudo apt install -y php7.3-fpm php7.3-mysql
  • 7.4: sudo apt install -y php7.4-fpm php7.4-mysql

PHP FastCGI Process Manager (fpm) funciona con solicitudes PHP. mysql, por supuesto, para trabajar con MySQL.

De ahora en adelante haré todo en 7.4.

Configurando Nginx

  • sudo vim /etc/nginx/sites-available/<Ваш домен>

En lugar de "<Su dominio>", ingrese el dominio (por ejemplo, mysite.ru) que desea utilizar en el futuro. Si aún no tiene uno, escriba ninguno y luego simplemente repita los pasos de este capítulo para su dominio cuando lo seleccione.

Introduzca la siguiente:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name <Ваш домен или IP>;

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

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

        location ~ /.ht {
                deny all;
        }
}

Si elige la versión 7.3 en su lugar php7.4-fpm.sock Escribir en php7.4-fpm.sock.

Escuche el puerto 80 encendido server_namecuando llegamos a la solicitud raíz /var/www/html tome el archivo de índice. si después server_name Hay algo, estamos buscando ese archivo. Si no lo encontramos, descartamos 404. Si termina en .php, ejecutar a través de fpm. Si hay .ht, prohibir (403).

  • Hacer un enlace desde sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Eliminando el enlace a default: sudo unlink /etc/nginx/sites-enabled/default
  • Comprobando errores: sudo nginx -t
  • Reiniciar: sudo systemctl reload nginx

Comprobando el trabajo:

  • sudo vim /var/www/html/info.php
  • Nosotros escribimos: <?php phpinfo();
  • Seguir adelante <Ваш IP>/info.php

Debería ver algo como esto:

Implementación de una aplicación en Laravel 7 en Ubuntu y Nginx

Ahora este archivo se puede eliminar: sudo rm /var/www/html/info.php

Instalar Laravel

  • 7.3: sudo apt install php7.3-mbstring php7.3-xml composer unzip

  • 7.4: sudo apt install php7.4-mbstring php7.4-xml composer unzip

  • Vayamos a MySQL: mysql -u root -p

  • Crea una base de datos con el nombre laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Proporcionamos acceso root a laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Cree una carpeta para el proyecto: sudo mkdir -p <Имя проекта>

  • Proporcionamos al usuario laravel derechos sobre el proyecto: sudo chown laravel:laravel <Имя проекта>

A continuación debe transferir el proyecto. Por ejemplo, clonación desde Github.

  • cd ./<Имя проекта>
  • git clone <ссылка на проект> .

Vale la pena considerar que si no guardó archivos estáticos (por ejemplo, de /public) en Github, entonces, naturalmente, no los tendrás. Por ejemplo, creé un hilo separado para resolver esto. deploy, del cual ya cloné: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instalación de dependencias: composer install
  • Crear .env: vim .env

La versión básica se ve así:

APP_NAME=Laravel
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://<Ваш домен>

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=<Ваш пароль от MySQL>

Si copia su .env, reemplace APP_ENV con producción, APP_DEBUG con falso e ingrese la configuración correcta para MySQL.

  • Migrando la base de datos: php artisan migrate
  • Generando el código: php artisan key:generate

Cambiar permisos:

  • sudo chown -R $USER:www-data storage
  • sudo chown -R $USER:www-data bootstrap/cache
  • chmod -R 775 storage
  • chmod -R 775 bootstrap/cache

Lo último que queda es reconfigurar Nginx para Laravel:

sudo vim /etc/nginx/sites-available/<Ваш домен>

server {
    listen 80;
    listen [::]:80;

    root /var/www/html/<Имя проекта>/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <Ваш домен или IP>;

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

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

    location ~ /.ht {
        deny all;
    }
}

Como la última vez, si eliges la versión 7.3 php7.4-fpm.sock Escribir en php7.4-fpm.sock.

Configurar un dominio en DigitalOcean

En realidad, todo es muy sencillo. Compras un dominio (en cualquier lugar), te cambias a DigitalOcean en Crear->Dominios/DNS... En campo Agregar un dominio ingresas este dominio y haces clic en agregar. Luego vaya a la configuración del dominio y al campo HOSTNAME ingresar @. Seleccione un proyecto y haga clic Crear registro.
Ahora vaya al sitio donde compró el dominio, busque allí "Servidores DNS" (o algo similar) e ingrese los servidores de DigitalOcean (es decir, ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Ahora debes esperar un poco (o mucho) hasta que se acepten estas configuraciones. ¡Listo!
El único problema es que su sitio se abrirá sólo como HTTP. Para tener HTTPS, pase a la siguiente parte.

Configurando HTTPS

Instale certbot y pásele el nombre de dominio (formato mysite.ru) y nombre de dominio con www (www.mysite.ru).

  • sudo add-apt-repository ppa:certbot/certbot
  • sudo apt install python-certbot-nginx
  • sudo certbot certonly --webroot --webroot-path=/var/www/html/<Имя проекта>/public -d <Ваш домен> -d www.<Ваш домен>

Ahora necesitas reconfigurar Nginx (no olvides sustituir tus valores):

server {
    listen 80;
    listen [::]:80;

    server_name <Ваш домен> www.<Ваш домен>;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name <Ваш домен> www.<Ваш домен>;
    root /var/www/html/<Имя проекта>/public;

    ssl_certificate /etc/letsencrypt/live/<Ваш домен>/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/<Ваш домен>/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;

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

    index index.php index.html index.htm index.nginx-debian.html;

    charset utf-8;

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

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

    location ~ /.ht {
            deny all;
    }

    location ~ /.well-known {
            allow all;
    }
}

Creo que ya comprende lo que se debe cambiar para PHP 7.3.

Aquí, de hecho, todo es sencillo. Simplemente redirigimos todas las solicitudes de HTTP (puerto 80) a HTTPS (puerto 443). Y ahí hacemos todo igual que antes, pero con cifrado.

Ya sólo queda configurar los permisos en el firewall:

  • sudo nginx -t
  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

Ahora todo debería funcionar como debería.

[Avanzado] Instalación de Node.js

Si de repente necesita ejecutar comandos npm directamente en el servidor, debe instalar Node.js.

  • sudo apt update
  • sudo apt install -y nodejs npm
  • nodejs -v

Eso es todo, me detuve en esta etapa. En principio estoy satisfecho con el resultado. Quizás me cambie de DigitalOcean a algún lugar más cercano a Rusia y más barato. Pero como ya pasé por todas las rondas de verificación en el sitio e hice todo allí, se los mostré con el ejemplo. Además, sus $100 iniciales son un excelente trampolín para el entrenamiento.

PD Un agradecimiento especial al autor. esta esencia, que sirvió de base para todas las acciones anteriores. En algunos casos no funciona para Laravel 7, lo arreglé.

PPS Si eres un ingeniero destacado que piensa en comandos bash, no juzgues con dureza. Puede que este artículo le parezca de bajo nivel, pero me hubiera encantado encontrar uno cuando lo necesitaba. Si hay sugerencias para mejorar, estoy totalmente a favor.

Fuente: habr.com

Añadir un comentario