Deploy dell'applicazione su Laravel 7 su Ubuntu & Nginx.

Deploy di un'applicazione su Laravel 7 su Ubuntu & Nginx

Ho deciso di creare un portfolio su Laravel 7. Volevo che la homepage fosse un landing page, con la possibilità di cambiare tutte le informazioni tramite il pannello di amministrazione. Ma non è questo il punto. Siamo arrivati al deployment. Ho trovato un paio di buoni tutorial su come farlo su un server completo con tutte le complicazioni. Non sono molto esperto di deployment, sono più un frontend che un fullstack. Se posso ancora scrivere e testare in PHP, non sono ancora alla pari con la gestione del server e simili. Ma ho dovuto informarmi.

Ora passeremo attraverso tutti i passaggi, dal lancio tramite SSH fino al sito web funzionante. Cercheremo di evitare tutte le trappole.

È possibile trovare istruzioni simili in internet. Infondo, anche io le ho trovate. Anche se non in un unico posto, non senza l'aiuto di StackOverflow e probabilmente non in russo. Ho faticato. Perciò ho deciso di semplificarvi la vita.

Faremo tutto con un droplet su DigitalOcean. Questo, ovviamente, non è obbligatorio, scegliete qualsiasi hosting. Arrivate a un server funzionante su Ubuntu, poi tornate. Per coloro che hanno deciso di utilizzare DigitalOcean, ci saranno anche consigli sulla configurazione del dominio. Inoltre, un link di riferimento per 100$.

Tutti i passaggi specifici per DigitalOcean saranno forniti in note simili.

Iniziamo.

TL;DR (solo comandi principali)

Creiamo un utente

  • ssh root@[IP-del-tuo-droplet]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Aggiungiamo la sua SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Incolliamo la chiave pubblica
  • chmod 600 ~/.ssh/authorized_keys

Firewall

  • 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 '';
  • 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/

Impostazione di base:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name ;

        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;
        }
}

Solo configurazione HTTP per Laravel:

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

    root /var/www/html//public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name ;

    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;
    }
}

Configurazione HTTPS per 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:ECDHE-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 '';

  • 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=

  • 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

Creiamo un droplet su DigitalOcean e registriamo una nuova chiave SSH

Credo sinceramente che riuscirai a registrarti su DigitalOcean. Non è facile, con molte verifiche e altre complicazioni. Se hai sempre un errore di rete durante la verifica con documenti, prova a fare tutto tramite VPN, dovrebbe aiutare.

Nel menu in alto, clicchiamo Crea->Droplets. Selezioniamo Ubuntu.

Non appena ci siamo registrati, riceverai 100$ sul tuo conto. Ma non illuderti. Hai solo 60 giorni per spenderli. E sono davvero pochi. Potresti, come me, voler utilizzare un piano più costoso, per poi, quando inizieranno ad arrivare soldi veri, passare a uno più economico. Ti dico subito, non sarà possibile. Puoi solo aumentare, non ridurre. Ecco come stanno le cose. Io scelgo Standard->$5.

La regione che scelgo è la più vicina a noi Francoforte. Rete VPC->default-fra1

Effettuiamo subito l'autenticazione tramite SSH. Clicchiamo su Nuova chiave SSH. Se non hai SSH, a destra c'è un'istruzione molto semplice. Apri il terminale bash, incolla ssh-keygen. Poi accedi al file con la chiave pubblica /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (o semplicemente cat ~/.ssh/id_rsa.pub), copia il contenuto e incollalo nella finestra a sinistra. Il nome può essere qualsiasi.

Inventiamo un hostname per il droplet.

Clicchiamo su Crea Droplet

Creiamo un nuovo utente

  • ssh root@[IP-del-tuo-droplet]
  • Sei sicuro di voler continuare a connetterti (sì/no/[fingerprint])?
  • Inserisci la tua password SSH
  • Creiamo un utente laravel: adduser laravel
  • Inserisci la password e altre informazioni (io inserisco solo il nome completo)
  • Aggiungiamo l'utente al gruppo sudo: usermod -aG sudo laravel

SSH per il nuovo utente

  • Passa al nuovo utente: su laravel

Tutte le operazioni successive, fino alla fine dell'articolo, verranno eseguite a nome dell'utente laravel. Quindi, se vi siete interrotti, riconnettetevi e inserite su laravel

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

Abbiamo aperto il file in Vim. Se non lo conoscete affatto, potete lavorare in Nano, è una vostra scelta.

I comandi di base di Vim

Per poter utilizzare l'editor Vim durante l'articolo, è sufficiente conoscere quanto segue.

  • In Vim ci sono diversi modalità: la modalità normale (Normal mode), in cui si immettono comandi e si selezionano modalità e altre.
  • Per uscire da qualsiasi modalità e tornare alla modalità normale, è sufficiente premere Esc
  • Per muoversi: si possono usare semplicemente le frecce
  • Uscire senza salvare <Normal mode>: :q!
  • Uscire e salvare <Normal mode>: :wq
  • Passare alla modalità di inserimento testo <Normal mode>: i (da inglese. insert)
  • Inseriamo la nostra chiave pubblica (che abbiamo creato sopra)
  • Proteggere da modifiche: chmod 600 ~/.ssh/authorized_keys

Impostiamo il firewall

  • Visualizziamo tutte le impostazioni disponibili: sudo ufw app list
  • Consentiamo OpenSSH (altrimenti verremo bloccati): sudo ufw allow OpenSSH
  • Avviamo il firewall: sudo ufw enable, y
  • Controllando: sudo ufw status

Status: active

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

Tutto a posto.

Installiamo Nginx

Durante l'installazione a volte verrà chiesto "Sei sicuro?". Rispondete y (beh, solo se siete sicuri).

  • sudo apt update
  • sudo apt install nginx

Aggiungiamo Nginx alle impostazioni del firewall

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

Stato: attivo

Azione                      Da
--                         ------       ----
OpenSSH                    CONSENTI    Ovunque
Nginx HTTP                 CONSENTI    Ovunque
OpenSSH (v6)               CONSENTI    Ovunque (v6)
Nginx HTTP (v6)            CONSENTI    Ovunque (v6)

Accedi al tuo IP. Se tutto va bene, dovresti vedere quanto segue.

Deploy di un'applicazione su Laravel 7 su Ubuntu & Nginx

Installiamo MySQL

  • sudo apt install mysql-server
  • Eseguiamo lo script automatico per la protezione sudo mysql_secure_installation

Rispondi alle domande poste. Se non sai cosa rispondere, ecco alcune opzioni consigliate:

  • Valida il plugin della password — N

  • Rimuovere gli utenti anonimi? — Y

  • Disallow root login remotely? — N

  • Rimuovi il database di prova e l'accesso ad esso? — N

  • Ricarica ora le tabelle dei privilegi? — Y

  • Accedi a MySQL: sudo mysql

  • Controlliamo i metodi di accesso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Impostiamo la password per root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Controlliamo di nuovo i metodi di accesso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Applichiamo le modifiche e usciamo da MySQL: FLUSH PRIVILEGES; e exit

  • Ora, per accedere a MySQL, è necessario utilizzare mysql -u root -p e inserire la password

Installiamo PHP

Utilizzeremo un repository di terze parti di Ondřej Surý

  • 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

Ora scegliamo. Per Laravel 7 possiamo scegliere PHP 7.3 o 7.4. La differenza sarà solo nei numeri 3 e 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) gestisce le richieste PHP. mysql, ovviamente, serve per lavorare con MySQL.

D'ora in poi farò tutto su 7.4.

Configuriamo Nginx

  • sudo vim /etc/nginx/sites-available/

Invece di "", scrivi il dominio (ad esempio, mysite.ru), che desideri utilizzare in futuro. Se non ne hai ancora uno, scrivi qualsiasi cosa, poi ripeti semplicemente le azioni in questo capitolo per il tuo dominio quando lo scegli.

Inserisci quanto segue:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name ;

        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;
        }
}

Se hai scelto la versione 7.3 invece di php7.4-fpm.sock inserisci php7.4-fpm.sock.

Ascoltiamo la porta 80 su server_name, quando riceviamo una richiesta alla radice /var/www/html prendiamo il file index. Se dopo server_name c'è qualcosa, cerchiamo quel file. Se non lo troviamo, restituiamo un 404. Se termina con .php, lo passiamo attraverso fpm. Se ci sono .ht, vietiamo (403).

  • Creiamo un link da sites-available in sites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • Rimuoviamo il link a default: sudo unlink /etc/nginx/sites-enabled/default
  • Controlliamo gli errori: sudo nginx -t
  • Riavviamo: sudo systemctl reload nginx

Controlliamo il funzionamento:

  • sudo vim /var/www/html/info.php
  • Scriviamo: <?php phpinfo();
  • Andiamo a /info.php

Dovresti vedere qualcosa di simile:

Deploy di un'applicazione su Laravel 7 su Ubuntu & Nginx

Ora questo file può essere eliminato: sudo rm /var/www/html/info.php

Installiamo 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

  • Accedi a MySQL: mysql -u root -p

  • Creiamo un database con il nome laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Forniamo accesso root a laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Creiamo una cartella per il progetto: sudo mkdir -p

  • Forniamo all'utente laravel diritti sul progetto: sudo chown laravel:laravel

Poi dobbiamo trasferire il progetto. Ad esempio, clonando da Github.

  • cd ./
  • git clone .

Vale la pena considerare che, se non hai salvato i file statici (ad esempio, da /public) su Github, quindi non li avrai. Io, ad esempio, ho creato un ramo separato per risolvere questo problema. deploy, da cui ho già clonato: git clone -b --single-branch ..

  • Installa le dipendenze: composer install
  • Crea .env: vim .env

La versione base appare così:

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=

Se stai copiando il tuo .env, sostituisci APP_ENV con production, APP_DEBUG con false e inserisci le impostazioni corrette per MySQL.

  • Migriamo il database: php artisan migrate
  • Generiamo il codice: php artisan key:generate

Modifichiamo i permessi:

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

L'ultima cosa che resta è riconfigurare Nginx per 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 ;

    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;
    }
}

Come l'ultima volta, se hai scelto la versione 7.3 invece di php7.4-fpm.sock inserisci php7.4-fpm.sock.

Configurazione del dominio su DigitalOcean

In realtà, è tutto molto semplice. Acquisti un dominio (dove vuoi), poi vai su DigitalOcean in Crea->Domains/DNS. Nel campo Aggiungi un dominio inserisci questo dominio e premi aggiungi. Poi vai nelle impostazioni del dominio e nel campo HOSTNAME inserisci @. Scegli il progetto e premi Crea record.
Ora vai sul sito dove hai acquistato il dominio, trova "DNS Servers" (o qualcosa di simile) e inserisci i server di DigitalOcean (ovvero ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Ora devi aspettare un po' (o molto) affinché queste impostazioni vengano propagate. Fatto!
L'unico problema è che il tuo sito si aprirà solo come HTTP. Per avere HTTPS, passiamo alla prossima parte.

Configuriamo HTTPS

Installiamo certbot e gli passiamo il nome di dominio (formato mysite.ru) e il nome di 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.

Ora bisogna riconfigurare Nginx (non dimenticare di inserire i tuoi valori):

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:ECDHE-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;
    }
}

Credo che ormai tu abbia capito cosa cambiare per PHP 7.3.

In realtà, qui è tutto molto semplice. Basta reindirizzare tutte le richieste da HTTP (porta 80) a HTTPS (porta 443). E qui facciamo tutto come prima, ma già con cifratura.

Resta da impostare le autorizzazioni nel firewall:

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

Ora tutto dovrebbe funzionare come si deve.

[Дополнительно] Установка Node.js

Se mai avessi bisogno di eseguire comandi npm direttamente sul server, è necessario installare Node.js.

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

Ecco, mi fermo a questo punto. In linea di massima, il risultato mi soddisfa. Forse passerò a un servizio più vicino alla Russia e più economico rispetto a DigitalOcean. Ma dato che ho già completato tutti i passaggi di verifica sul sito e ho fatto tutto lì, ho usato il loro esempio. Inoltre, i loro 100 dollari di partenza rappresentano un ottimo punto di partenza per allenamenti.

P.S. Un ringraziamento speciale all'autore di questo gist, che ha servito da base per tutte le azioni sopra menzionate. In alcuni punti non funziona per Laravel 7, l'ho corretto.

P.P.S. Se sei un ingegnere esperto che pensa in comandi bash, ti prego di non essere troppo severo. Potrebbe sembrarti che il livello di questo articolo sia un po' basso, ma sarei felice di trovarne uno così quando ne avevo bisogno. Se hai suggerimenti per migliorarne il contenuto, sono tutto orecchi.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster