Distribuzione dell'applicazione su Laravel 7 su Ubuntu & Nginx

Deployment dell'applicazione su Laravel 7 su Ubuntu & Nginx

Ho deciso di creare il mio portfolio su Laravel 7. La homepage sarà un landing page, e tutte le informazioni su di essa potranno essere modificate tramite il pannello di amministrazione. Ma non è questo il punto. Siamo arrivati al deployment. Ho trovato un paio di buone guide su come farlo su un server completo con tutti i suoi problemi. Non sono molto esperto in deployment, in realtà sono più un front-end che un full-stack. E, se riesco ancora a scrivere e testare su PHP, non sono ancora pronto per gestire server e simili. Ma ho dovuto approfondire.

Adesso passeremo attraverso tutti i passaggi, partendo dall'avvio tramite SSH e finendo con il sito web funzionante. Cercheremo di evitare tutte le insidie nascoste.

Potresti trovare istruzioni simili su internet. Alla fine, io le ho trovate. Anche se non in un solo posto, non senza l'aiuto di StackOverflow e probabilmente non in russo. Ho faticato. Ecco perché ho deciso di semplificarti la vita.

Faremo tutto con un droplet su DigitalOcean. Questo, naturalmente, non è obbligatorio, puoi scegliere qualsiasi hosting. Una volta raggiunto il server funzionante su Ubuntu, torna da noi. Per coloro che hanno deciso di usare DigitalOcean, ci saranno anche consigli su come impostare il dominio. Inoltre, un link di referral per 100$.

Tutti i passaggi specifici per DigitalOcean saranno forniti in note a piè di pagina simili.

Iniziamo.

TL;DR (solo i comandi principali)

Creiamo un utente

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

Aggiungiamo 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 la 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 ci siate riusciti da soli a registrarvi su DigitalOcean. Non è semplice, con un sacco di verifiche e altre incombenze. Se riscontrate errori di rete durante la verifica con i documenti, provate a farlo tramite VPN, dovrebbe aiutare.

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

Non appena ci si registra, si riceveranno 100$ sul conto. Ma non illudetevi. Avete solo 60 giorni per spenderli. E sono davvero pochi. Potreste, come me, voler utilizzare un piano più costoso, per poi, quando inizieranno ad arrivare soldi veri, passare a uno più economico. Vi avviso subito, non sarà possibile. È possibile aumentare, ma non ridurre. Queste sono le regole. Io scelgo Standard->$5.

Sceglierò la regione più vicina a noi Francoforte. Rete VPC->default-fra1

Procediamo subito con l'autenticazione tramite SSH. Clicchiamo su Nuova chiave SSH. Se non avete SSH, a destra c'è una guida molto semplice. Aprite il terminale bash e incollate ssh-keygen. Poi accediamo al file con la chiave pubblica /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (o semplicemente cat ~\/s/.ssh/id_rsa.pub), copiamo il contenuto e lo incolliamo nella finestra a sinistra. Qualsiasi nome va bene.

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 collegarti (sì/no/[fingerprint])?
  • Inserisci la tua password SSH
  • Creiamo un utente laravel: adduser laravel
  • Inserisci la password e le altre informazioni (io inserisco solo il Nome Completo)
  • Aggiungiamo l'utente al gruppo sudo: usermod -aG sudo laravel

SSH per il nuovo utente

  • Passiamo al nuovo utente: su laravel

Tutte le azioni successive, fino alla fine dell'articolo, verranno eseguite con il nome utente laravel. Quindi, se vi siete interrotti, rientrate 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, a vostra discrezione..

Comandi base di Vim

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

  • In Vim ci sono diversi modi: il modo normale (Normal mode), in cui immettete comandi e scegliete modalità e altro.
  • Per uscire da qualsiasi modalità e tornare alla modalità normale, basta premere Esc
  • Spostarsi: si può semplicemente usare le frecce
  • Uscire senza salvare <Normal mode>: :q!
  • Uscire e salvare <Normal mode>: :wq
  • Passare alla modalità di inserimento testo <Normal mode>: i (da "insert" in inglese) Inseriamo la nostra chiave pubblica (quella che abbiamo creato sopra))
  • Proteggere dalle modifiche:
  • Impostiamo il firewall chmod 600 ~/.ssh/authorized_keys

Controlliamo tutte le impostazioni disponibili:

  • sudo ufw app list Consenti OpenSSH (altrimenti ci bloccherà):
  • Avviamo il firewall: sudo ufw allow OpenSSH
  • Stato: attivoA Azione Da -- ------ ---- OpenSSH CONSENTI Ovunque OpenSSH (v6) CONSENTI Ovunque (v6) sudo ufw enable, y
  • Controlliamo: sudo ufw status

Tutto va bene.

Impostiamo Nginx

Durante l'installazione a volte vi verrà chiesto "Sei sicuro?" Rispondete

(solo se siete sicuri). y sudo apt install nginx

  • sudo apt update
  • Aggiungiamo Nginx alle impostazioni del firewall

Aggiungiamo Nginx nelle impostazioni del firewall

  • Consenti OpenSSH (altrimenti ci bloccherà):
  • 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)

Visita il tuo IP. Se tutto va bene, dovresti vedere quanto segue.

Deployment dell'applicazione su Laravel 7 su Ubuntu & Nginx

Installiamo MySQL

  • sudo apt install mysql-server
  • Avviamo lo script automatico di protezione sudo mysql_secure_installation

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

  • Plugin per la convalida della password — N

  • Rimuovere gli utenti anonimi? — Y

  • Negare l'accesso remoto all'utente root? — N

  • Rimuovere il database di test e l'accesso ad esso? — N

  • Ricaricare le tabelle di autorizzazione ora? — Y

  • Accediamo a MySQL: sudo mysql

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

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

  • Controlliamo i metodi di accesso di nuovo: 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

Utilizziamo un repository esterno 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 è possibile 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

Il PHP FastCGI Process Manager (fpm) gestisce le richieste PHP. mysql, ovviamente, per lavorare con MySQL.

D'ora in avanti farò tutto su 7.4.

Configurazione di Nginx

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

Al posto di "" inserisci il dominio (ad esempio, mysite.ru), che desideri utilizzare in futuro. Se non ne hai ancora uno, inserisci qualsiasi dominio, poi semplicemente ripeti le azioni in questo capitolo per il tuo dominio, quando lo avrai scelto.

Inseriamo 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 nella root /var/www/html prendiamo il file index. Se dopo server_name c'è qualcosa, cerchiamo tale file. Se non lo troviamo, lanciamo 404. Se termina con .php, lo passiamo attraverso fpm. Se ci sono .ht, neghiamo (403).

  • Facciamo 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 su /info.php

Dovresti vedere qualcosa di simile:

Deployment dell'applicazione su Laravel 7 su Ubuntu & Nginx

Ora puoi eliminare questo file: 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

  • Accediamo a MySQL: mysql -u root -p

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

  • Concediamo l'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

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

In seguito è necessario trasferire il progetto. Ad esempio, clonandolo da Github.

  • cd ./
  • git clone .

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

  • Installiamo le dipendenze: composer install
  • Creiamo .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 copi il tuo .env, sostituisci APP_ENV con production, APP_DEBUG con false e inserisci le impostazioni corrette per MySQL.

  • Migra 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 da fare è 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 la volta scorsa, se hai scelto la versione 7.3 invece di php7.4-fpm.sock inserisci php7.4-fpm.sock.

Configurazione del dominio su DigitalOcean

Tutto è, in realtà, molto semplice. Acquisti un dominio (ovunque), vai su DigitalOcean in Crea->Domains/DNS. Nel campo Aggiungi un dominio scrivi questo dominio e premi aggiungi. Poi vai alle 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 "Server DNS" (o qualcosa di simile) e inserisci i server DigitalOcean (ossia ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Ora devi aspettare un po' (o molto) affinché queste impostazioni vengano accettate. Fatto!
L'unico problema è che il tuo sito si aprirà solo come HTTP. Per avere HTTPS, passiamo alla parte successiva.

Configurazione di HTTPS

Installa certbot e passagli il nome del dominio (formato mysite.ru) e il nome del 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 è necessario 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;
    }
}

Penso che tu abbia già capito cosa cambiare per PHP 7.3.

Qui, in realtà, è tutto semplice. Stiamo semplicemente reindirizzando tutte le richieste da HTTP (porta 80) a HTTPS (porta 443). E lì facciamo tutto quello che facevamo prima, ma con la crittografia.

Resta solo da impostare i permessi nel firewall:

  • sudo nginx -t
  • Consenti OpenSSH (altrimenti ci bloccherà):
  • sudo ufw allow 'Nginx HTTPS'
  • sudo ufw status
  • sudo systemctl reload nginx

Ora tutto dovrebbe funzionare come dovrebbe.

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

Se ti serve eseguire comandi npm direttamente sul server, devi installare Node.js.

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

Tutto qui, mi sono fermato a questo punto. In linea di massima, il risultato mi soddisfa. Potrei spostarmi da DigitalOcean da qualche parte più vicino alla Russia e più economico. Ma poiché ho già passato tutti i livelli di verifica sul sito e ho fatto tutto lì, ho mostrato il loro esempio. Inoltre, i loro 100 dollari iniziali sono un ottimo punto di partenza per esercitazioni.

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

P.P.S. Se sei un ingegnere di alto livello che pensa in comandi bash, per favore, non giudicare troppo severamente. Potresti trovare il livello di questo articolo un po' basso, ma sarei felice di aver trovato qualcosa del genere quando ne avevo bisogno. Se hai suggerimenti per migliorare, sono completamente "a favore".

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