Distribuzione di un'applicazione su Laravel 7 su Ubuntu e Nginx

Distribuzione di un'applicazione su Laravel 7 su Ubuntu e Nginx

Ho deciso di creare il mio portfolio utilizzando Laravel 7. In modo che la pagina principale fosse una pagina di destinazione e tutte le informazioni su di essa potessero essere modificate utilizzando il pannello di amministrazione. Non è questo il punto. Si è trattato di schieramento. Ho trovato un paio di buoni tutorial su come farlo su un server completo con tutti i problemi. Non sono molto forte nello schieramento; generalmente sono più davanti che full stack. E, se riesco ancora a scrivere e testare in PHP, prima di gestire il server, ecc. Non sono ancora cresciuto. Ma dovevo capirlo.

Ora eseguiremo tutti i passaggi, iniziando con il lancio tramite SSH e finendo con il sito di lavoro. Cercheremo di evitare tutte le trappole.

Potresti riuscire a trovare istruzioni simili online. Dopotutto, finalmente l'ho trovato. È vero, non in un unico posto, non senza l'aiuto di StackOverflow e difficilmente in russo. Ho sofferto. Ecco perché ho deciso di semplificarti la vita.

Faremo tutto con un droplet su DigitalOcean. Questo, ovviamente, non è necessario; scegli qualsiasi hosting. Quando raggiungi un server funzionante su Ubuntu, torna indietro. Per chi deciderà ancora di farlo su DigitalOcean, ci saranno ulteriori consigli su come impostare un dominio. E Collegamento di riferimento da $ 100.

Tutti i passaggi specifici di DigitalOcean verranno forniti in note a piè di pagina come queste.

Iniziamo.

TL;DR (solo comandi di base)

Crea un utente

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

Aggiungi SSH ad esso

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Inserisci 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 '<Ваш пароль для 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/<Ваш домен>

Configurazione di base:

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

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 <Ваш домен или 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;
    }
}

Impostazione 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: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

Crea un droplet su DigitalOcean e registra una nuova chiave SSH

Credo davvero che capirai tu stesso come registrarti su DigitalOcean. Non è facile, con tante verifiche e altro. Se ricevi costantemente un errore di rete durante la verifica utilizzando i documenti, prova a fare tutto tramite una VPN, dovrebbe essere d'aiuto.

Nel menu in alto, fai clic su Creare->Droplets. Scegliere Ubuntu.

Non appena ti registri, riceverai $ 100 sul tuo account. Ma non lasciarti ingannare. Hai solo 60 giorni per spenderlo. E questo è davvero poco. Potresti, come me, voler utilizzare un piano più costoso, in modo che in seguito, quando inizieranno a fluire i soldi veri, potrai passare a uno più economico. Ti dico subito che non funzionerà. Puoi aumentarlo, ma non puoi diminuirlo. Così è andata. scelgo Standard->$5.

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

Effettueremo immediatamente l'autenticazione tramite SSH. Clic Nuova chiave SSH. Se non hai SSH, ci sono istruzioni molto semplici sulla destra. Apri un terminale bash e incolla ssh-keygen. Quindi andiamo 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. Qualche nome.

Troviamo un nome host per il droplet.

Clicca qui Crea gocciolina

Crea un nuovo utente

  • ssh root@[IP-адрес вашего дроплета]
  • Sei sicuro di voler continuare la connessione (sì/no/[impronta digitale])? yes
  • Inserisci la tua password SSH
  • Crea un utente laravel: adduser laravel
  • Inserisci la tua password e altre informazioni (inserisco solo il nome completo)
  • Aggiungi l'utente al gruppo sudo: usermod -aG sudo laravel

SSH per il nuovo utente

  • Passa al nuovo utente: su laravel

Eseguiamo tutte le azioni successive, fino alla fine dell'articolo, per conto dell'utente laravel. Pertanto, se vieni interrotto improvvisamente, effettua nuovamente il login ed entra su laravel

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

Abbiamo aperto il file in Vim. Se non lo conosci affatto, puoi lavorare in Nano, hai ragione.

I comandi Vim più basilari

Per utilizzare l'editor Vim in tutto l'articolo, devi solo sapere quanto segue.

  • Vim ha diverse modalità: Modalità normale, in cui inserisci comandi e selezioni modalità e altre.
  • Per uscire da qualsiasi modalità e tornare alla modalità normale, basta premere Esc
  • Muoviti: puoi semplicemente usare le frecce
  • Uscire senza salvare <Normal mode>: :q!
  • Esci e salva <Normal mode>: :wq
  • Passa alla modalità di immissione del testo <Normal mode>: i (dall'inglese. insert)
  • Inseriamo la nostra chiave pubblica (cosa che abbiamo fatto sopra)
  • Proteggiamo dai cambiamenti: chmod 600 ~/.ssh/authorized_keys

Installazione di un firewall

  • Diamo un'occhiata a tutte le impostazioni disponibili: sudo ufw app list
  • Consenti OpenSSH (altrimenti ci bloccherà): sudo ufw allow OpenSSH
  • Lanciamo il firewall: sudo ufw enable, y
  • Controlliamo: sudo ufw status

Status: active

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

Va tutto bene.

Installazione di Nginx

Durante l'installazione a volte ti verrà chiesto "Sei sicuro?" Risposta y (beh, solo se sei sicuro).

  • sudo apt update
  • sudo apt install nginx

Aggiunta di Nginx alle impostazioni 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)

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

Distribuzione di un'applicazione su Laravel 7 su Ubuntu e Nginx

Installazione di MySQL

  • sudo apt install mysql-server
  • Avvio di uno script di protezione automatica sudo mysql_secure_installation

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

  • Convalida plug-in password - N

  • Rimuovere gli utenti anonimi? — Y

  • Non consentire l'accesso root da remoto? — N

  • Rimuovere il database di test e accedervi? — N

  • Ricaricare le tabelle dei privilegi adesso? — Y

  • Andiamo a MySQL: sudo mysql

  • Vediamo le modalità di accesso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Imposta una password per root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Consideriamo nuovamente le modalità di accesso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Applica le modifiche ed esci da MySQL: FLUSH PRIVILEGES; и exit

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

Installazione di PHP

Usiamo un repository di terze parti da 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

Ora scegliamo. Per Laravel 7, puoi scegliere PHP 7.3 o 7.4. L'unica differenza sarà 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) funziona con le richieste PHP. mysql, ovviamente, per lavorare con MySQL.

D'ora in poi farò tutto sulla 7.4.

Configurazione di Nginx

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

Invece di "<Il tuo dominio>" inserisci il dominio (ad esempio, mysite.ru) che desideri utilizzare in futuro. Se non ne hai ancora uno, scrivine uno e poi ripeti i passaggi di questo capitolo per il tuo dominio quando lo selezioni.

Digita il seguente:

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

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

Ascolta la porta 80 server_namequando arriviamo alla richiesta root /var/www/html prendi il file indice. Se dopo server_name C'è qualcosa, stiamo cercando un file del genere. Se non lo troviamo, buttiamo via 404. Se finisce con .php, corri attraverso fpm. Se c'è .ht, vietare (403).

  • Creare un collegamento da sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Rimozione del collegamento a default: sudo unlink /etc/nginx/sites-enabled/default
  • Controllo degli errori: sudo nginx -t
  • Riavviare: sudo systemctl reload nginx

Controllo del lavoro:

  • sudo vim /var/www/html/info.php
  • Noi scriviamo: <?php phpinfo();
  • Andare avanti <Ваш IP>/info.php

Dovresti vedere qualcosa del genere:

Distribuzione di un'applicazione su Laravel 7 su Ubuntu e Nginx

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

Installa 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

  • Andiamo a MySQL: mysql -u root -p

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

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Crea una cartella per il progetto: sudo mkdir -p <Имя проекта>

  • Forniamo all'utente laravel diritti sul progetto: sudo chown laravel:laravel <Имя проекта>

Successivamente è necessario trasferire il progetto. Ad esempio, clonazione da Github.

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

Vale la pena considerare che se non hai salvato file statici (ad esempio from /public) su Github, naturalmente non li avrai. Ad esempio, ho creato un thread separato per risolvere questo problema deploy, da cui ho già clonato: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Installazione delle dipendenze: composer install
  • Crea .env: vim .env

La versione base è simile a questa:

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>

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

  • Migrazione del database: php artisan migrate
  • Generazione del codice: php artisan key:generate

Modifica delle autorizzazioni:

  • 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 rimasta è 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 <Ваш домен или 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;
    }
}

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

Configurazione di un dominio su DigitalOcean

In realtà è tutto molto semplice. Acquista un dominio (ovunque), passa a DigitalOcean su Creare->Domini/DNS... In campo Aggiungi un dominio inserisci questo dominio e fai clic su Aggiungi. Quindi vai alle impostazioni del dominio e al campo HOSTNAME accedere @. Selezionare un progetto e fare clic Crea record.
Ora vai sul sito dove hai acquistato il dominio, trova lì “Server DNS” (o qualcosa di simile) e inserisci i server DigitalOcean (ovvero ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Ora devi aspettare un po' (o molto) finché queste impostazioni non verranno accettate. Pronto!
L'unico problema è che il tuo sito si aprirà solo come HTTP. Per avere HTTPS, passa alla parte successiva.

Configurazione di HTTPS

Installa certbot e passagli il nome di dominio (format mysite.ru) e 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 devi riconfigurare Nginx (non dimenticare di sostituire 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: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;
    }
}

Penso che tu abbia già capito cosa deve essere cambiato per PHP 7.3.

Qui, infatti, tutto è semplice. Reindirizziamo semplicemente tutte le richieste da HTTP (porta 80) a HTTPS (porta 443). E lì facciamo tutto come prima, ma con la crittografia.

Non resta che impostare i permessi 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 dovrebbe.

[Avanzato] Installazione di Node.js

Se all'improvviso hai bisogno di eseguire comandi npm direttamente sul server, devi installare Node.js.

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

Questo è tutto, mi sono fermato a questo punto. In linea di principio, sono soddisfatto del risultato. Forse passerò da DigitalOcean a un posto più vicino alla Russia e più economico. Ma poiché avevo già svolto tutti i cicli di verifica sul sito e avevo fatto tutto lì, li ho mostrati con l'esempio. Inoltre, i loro 100 dollari iniziali sono un ottimo trampolino di lancio per la formazione.

PS Un ringraziamento speciale all'autore questa sostanza, che è servito come base per tutte le azioni di cui sopra. In alcuni casi non funziona per Laravel 7, l'ho risolto.

PPS Se ti capita di essere un ingegnere di punta che pensa ai comandi bash, per favore non giudicare duramente. Potresti trovare questo articolo di basso livello, ma sarei stato felice di trovarne uno quando ne avessi avuto bisogno. Se ci sono suggerimenti per migliorare, sono assolutamente d'accordo.

Fonte: habr.com

Aggiungi un commento