Implementarea aplicației Laravel 7 pe Ubuntu & Nginx

Implementarea aplicației pe Laravel 7 pe Ubuntu & Nginx

Am decis să-mi creez un portofoliu pe Laravel 7. Cea mai importantă pagină va fi un landing page, iar tot conținutul de pe aceasta poate fi modificat prin intermediul panoului de administrare. Dar să trecem la lucru. Am ajuns la etapa de deploy. Am găsit câteva tutoriale utile despre cum să fac asta pe un server complet, cu toate detaliile tehnice. Nu sunt foarte bun la deploy, de fapt, mă pricep mai bine la front-end decât la full stack. Și, chiar dacă pot scrie și testa în PHP, în gestionarea serverelor nu am ajuns încă. Dar a trebuit să învăț.

Acum vom parcurge toți pașii, începând cu lansarea prin SSH și terminând cu un site funcțional. Vom încerca să evităm toate capcanele.

Poate veți găsi instrucțiuni similare pe internet. Până la urmă, eu am găsit. De fapt, nu într-un singur loc, ci cu ajutorul StackOverflow și probabil nu și în limba română. M-am chinuit. De aceea am decis să vă simplific viața.

Vom face totul cu un droplet pe DigitalOcean. Evident, nu este obligatoriu, alegeți orice serviciu de hosting. Odată ce ajungeți la un server funcțional pe Ubuntu, întoarceți-vă. Pentru cei care au decis să utilizeze DigitalOcean, vor exista și sfaturi pentru configurarea domeniului. De asemenea, o link de recomandare pentru 100$.

Toți pașii specifici pentru DigitalOcean vor fi oferiți în note de subsol similare.

Să începem.

TL;DR (doar comenzile principale)

Creăm utilizatorul

  • ssh root@[IP-ul dropletului dvs.]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Adăugăm cheia SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Inserăm cheia publică
  • 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/

Configurarea de bază:

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

Doar configurația HTTP pentru 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;
    }
}

Configurare HTTPS pentru 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 '';

  • 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

Creăm un droplet pe DigitalOcean și înregistrăm o nouă cheie SSH

Cred cu tărie că veți reuși să vă înregistrați pe DigitalOcean. Procesul nu este simplu, având multe verificări și alte complicații. Dacă întâmpinați o eroare de rețea în timpul verificării documentelor, încercați să faceți totul prin VPN, ar trebui să ajute.

În meniul de sus, apăsăm Creează->Droplets. Alegem Ubuntu.

Odată ce v-ați înregistrat, veți primi 100$ în cont. Dar nu vă lăsați păcăliți. Aveți doar 60 de zile pentru a-i cheltui. Și aceasta este foarte puțin. Puteți, ca și mine, să doriți să utilizați un plan mai scump, astfel încât, când vor începe să vină banii reali, să treceți la un plan mai ieftin. Vă spun de la început, nu va funcționa. Puteți să măriți, dar nu să micșorați. Așa stau lucrurile. Eu aleg Standard->$5.

Regiunea pe care o aleg este cea mai apropiată de noi Frankfurt. Rețea VPC->default-fra1

Vom face autentificarea imediat prin SSH. Facem clic pe Cheie SSH nouă. Dacă nu aveți SSH, în partea dreaptă există un ghid foarte simplu. Deschideți terminalul bash, lipiți ssh-keygen. Apoi, intrați în fișierul cu cheia publică /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub sau simplu cat ~\/ .ssh\/ id_rsa.pub), copiați conținutul și lipiți în fereastra din stânga. Numele poate fi orice.

Găsim un nume de gazdă pentru droplet.

Facem clic pe Creează Droplet

Creăm un nou utilizator

  • ssh root@[IP-ul dropletului dvs.]
  • Sunteți sigur că doriți să continuați conectarea (da/nu/[amprenta])? da
  • Introduceți parola dvs. SSH
  • Creăm utilizatorul laravel: adduser laravel
  • Introduceți parola și alte informații (eu introduc doar Numele complet)
  • Adăugăm utilizatorul în grupul sudo: usermod -aG sudo laravel

SSH pentru noul utilizator

  • Ne schimbăm pe noul utilizator: su laravel

Toate acțiunile de aici, până la finalul articolului, le facem în numele utilizatorului laravel. Așadar, dacă vă întrerupeți, reconectați-vă și introduceți su laravel

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

Am deschis fișierul în Vim. Dacă nu sunteți familiarizat cu acesta, puteți lucra în Nano, este dreptul dvs..

Cele mai de bază comenzi Vim

Pentru a utiliza editorul Vim pe parcursul articolului, trebuie doar să cunoașteți următoarele.

  • În Vim există diferite moduri: modul normal (Normal mode), în care introduceți comenzi și alegeți moduri și altele.
  • Pentru a ieși din orice mod și a reveni în modul normal, este suficient să apăsați Esc
  • Pentru a vă deplasa: puteți folosi pur și simplu săgețile
  • Ieșiți fără a salva <Normal mode>: :q!
  • Ieșiți și salvați <Normal mode>: :wq
  • Trebuie să intrați în modul de introducere a textului <Normal mode>: i (de la engleză inserați)
  • Lipim cheia publică (pe care am creat-o mai sus)
  • Protejăm de modificări: chmod 600 ~/.ssh/authorized_keys

Instalăm firewall-ul

  • Vedem toate setările disponibile: sudo ufw app list
  • Permitem OpenSSH (altfel ne va bloca): sudo ufw allow OpenSSH
  • Pornim firewall-ul: sudo ufw enable, Stabiliți o parolă și păstrați-o în siguranță!
  • Verificăm: sudo ufw status

Status: activ

Către                         Acțiune      De la
--                         ------      ----
OpenSSH                    ALLOW       Orice
OpenSSH (v6)               ALLOW       Orice (v6)

Totul este în regulă.

Instalăm Nginx

Când instalați, uneori veți fi întrebat "Sunteți sigur?". Răspundeți Stabiliți o parolă și păstrați-o în siguranță! (numai dacă sunteți sigur).

  • sudo apt update
  • sudo apt install nginx

Adăugăm Nginx în setările firewall-ului

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

Status: activ

Către                         Acțiune      De la
--                         ------      ----
OpenSSH                    PERMITE       Oricine
Nginx HTTP                 PERMITE       Oricine
OpenSSH (v6)               PERMITE       Oricine (v6)
Nginx HTTP (v6)            PERMITE       Oricine (v6)

Accesați IP-ul dumneavoastră. Dacă totul merge bine, ar trebui să vedeți următoarele.

Implementarea aplicației pe Laravel 7 pe Ubuntu & Nginx

Instalăm MySQL

  • sudo apt install mysql-server
  • Porniți scriptul automat de securitate sudo mysql_secure_installation

Răspundeți la întrebările puse. Dacă nu știți ce să răspundeți, iată variantele recomandate:

  • Plugin pentru validarea parolei — N

  • Eliminați utilizatorii anonimi? — Y

  • Interziceți conectarea root de la distanță? — N

  • Eliminați baza de date de test și accesul la aceasta? — N

  • Reîncărcați tabelele de privilegii acum? — Y

  • Intrăm în MySQL: sudo mysql

  • Vizionăm metodele de acces: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Stabilim parola pentru root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Verificăm din nou metodele de acces: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Aplicăm modificările și ieșim din MySQL: FLUSH PRIVILEGES; și exit

  • Acum, pentru a intra în MySQL trebuie să folosiți mysql -u root -p și să introduceți parola

Instalăm PHP

Vom folosi un depozit extern de 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

Acum alegem. Pentru Laravel 7, puteți alege PHP 7.3 sau 7.4. Diferența va fi doar în cifrele 3 și 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) lucrează cu cererile PHP. mysql, desigur, pentru a lucra cu MySQL.

În continuare, voi face totul pe 7.4.

Configurăm Nginx

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

În loc de "", introduceți domeniul (de exemplu, mysite.ro), pe care doriți să-l folosiți în viitor. Dacă nu aveți unul încă, scrieți orice, apoi repetați pur și simplu pașii din acest capitol pentru domeniul dvs. atunci când îl alegeți.

Introducem următoarele:

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

Dacă ați ales versiunea 7.3 în loc de php7.4-fpm.sock introduceți php7.4-fpm.sock.

Ascultăm portul 80 la server_name, atunci când venim cu cererea în rădăcină /var/www/html luăm fișierul index. Dacă după server_name există altceva, căutăm un astfel de fișier. Nu găsim, aruncăm 404. Dacă se termină cu .php, trecem prin fpm. Dacă există .ht, interzicem (403).

  • Facem un link din sites-available în sites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • Ștergem linkul de la default: sudo unlink /etc/nginx/sites-enabled/default
  • Verificăm erorile: sudo nginx -t
  • Reîncărcăm: sudo systemctl reload nginx

Verificăm funcționarea:

  • sudo vim /var/www/html/info.php
  • Scriem: <?php phpinfo();
  • Accesăm /info.php

Ar trebui să vedeți ceva de genul:

Implementarea aplicației pe Laravel 7 pe Ubuntu & Nginx

Acum acest fișier poate fi șters: sudo rm /var/www/html/info.php

Instalăm 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

  • Intrăm în MySQL: mysql -u root -p

  • Creăm o bază de date cu numele laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Oferim acces root la laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Creăm un folder pentru proiect: sudo mkdir -p

  • Oferim utilizatorului laravel drepturi pe proiect: sudo chown laravel:laravel

Apoi trebuie să transferați proiectul. De exemplu, prin clonare de pe Github.

  • cd ./
  • git clone .

Trebuie să luați în considerare că, dacă nu ați salvat fișierele statice (de exemplu, din /public) pe Github, atunci nu le veți avea, desigur. Eu, de exemplu, am creat o ramură separată pentru a rezolva asta, deploydin care am clonat deja: git clone -b --single-branch ..

  • Instalăm dependențele: composer install
  • Creăm .env: vim .env

Versiunea de bază arată așa:

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=

Dacă copiați .env-ul dvs., schimbați APP_ENV în production, APP_DEBUG în false și introduceți setările corecte pentru MySQL.

  • Migram baza de date: php artisan migrate
  • Generăm cod: php artisan key:generate

Schimbăm permisiunile:

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

Ultimul lucru care rămâne – reconfigurarea Nginx pentru 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;
    }
}

Ca și data trecută, dacă ați ales versiunea 7.3 în loc de php7.4-fpm.sock introduceți php7.4-fpm.sock.

Configurarea domeniului pe DigitalOcean

Totul este, de fapt, foarte simplu. Cumpărați un domeniu (unde doriți), mergeți pe DigitalOcean la Creează->Domains/DNS. În câmpul Adăugați un domeniu introduceți acest domeniu, apăsați adăugați. Apoi mergeți la setările domeniului și în câmpul HOSTNAME introduceți @. Alegeți proiectul și apăsați Creează înregistrare.
Acum mergeți pe site-ul de unde ați cumpărat domeniul, găsiți acolo "Servere DNS" (sau ceva similar) și introduceți serverele DigitalOcean (anume ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Acum trebuie să așteptați puțin (sau mult) până când aceste setări sunt acceptate. Gata!
Singura problemă – site-ul dvs. se va deschide doar ca HTTP. Pentru a avea HTTPS, trecem la partea următoare.

Configurăm HTTPS

Instalăm certbot și îi transmitem numele domeniului (format mysite.ro) și numele domeniului cu www (www.mysite.ro).

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

Acum trebuie să reconfigurăm Nginx (nu uitați să introduceți valorile dvs.):

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

Cred că deja ați înțeles ce trebuie să schimbați pentru PHP 7.3.

Aici, de fapt, totul este simplu. Redirecționăm toate solicitările de la HTTP (portul 80) la HTTPS (portul 443). Iar acolo facem la fel ca înainte, dar deja cu criptare.

Rămâne să setăm permisiunile în firewall:

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

Acum totul ar trebui să funcționeze cum trebuie.

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

Dacă dintr-o dată aveți nevoie să rulați comenzi npm direct pe server, trebuie să instalați Node.js.

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

Totul, eu m-am oprit în acest pas. În principiu, rezultatul mă mulțumește. Poate că mă voi muta de la DigitalOcean undeva mai aproape de Rusia și mai ieftin. Dar, având în vedere că am parcurs toate etapele de verificare pe site și totul am făcut acolo, am arătat pe exemplul lor. În plus, cei 100 de dolari de început sunt o bază excelentă pentru antrenamente.

P.S. Mulțumiri speciale autorului acestui gist, care a servit ca bază pentru toate acțiunile enumerate mai sus. În unele momente nu funcționează pentru Laravel 7, am corectat asta.

P.P.S. Dacă ești un inginer de top care gândește în comenzi bash, te rog să nu judeci prea aspru. Este posibil ca nivelul acestui articol să ți se pară prea scăzut, dar m-aș fi bucurat să găsesc așa ceva când aveam nevoie. Dacă ai sugestii de îmbunătățire, sunt foarte deschis la ele.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster