Implementarea unei aplicații pe Laravel 7 pe Ubuntu și Nginx

Implementarea unei aplicații pe Laravel 7 pe Ubuntu și Nginx

Am decis să-mi fac portofoliul folosind Laravel 7. Pentru ca pagina principală să fie o pagină de destinație, iar toate informațiile de pe ea să poată fi modificate folosind panoul de administrare. Nu ideea. S-a ajuns la desfășurare. Am găsit câteva tutoriale bune despre cum să fac asta pe un server cu drepturi depline, cu toate problemele. Nu sunt foarte puternic în implementare; în general, sunt mai mult în față decât în ​​stack complet. Și, dacă mai pot scrie și testa în PHP, atunci înainte de a gestiona serverul etc. Încă nu am crescut. Dar a trebuit să-mi dau seama.

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

Este posibil să găsiți instrucțiuni similare online. La urma urmei, în sfârșit l-am găsit. Adevărat, nu într-un singur loc, nu fără ajutorul lui StackOverflow și cu greu în rusă. Am suferit. De aceea am decis să-ți simplific viața.

Vom face totul cu o picătură pe DigitalOcean. Acest lucru, desigur, nu este necesar; alegeți orice găzduire. Când ajungeți la un server de lucru pe Ubuntu, reveniți. Pentru cei care încă decid să o facă pe DigitalOcean, vor exista mai multe sfaturi despre configurarea unui domeniu. Și Link de recomandare de 100 USD.

Toți pașii specifici DigitalOcean vor fi indicați în note de subsol ca acestea.

Să începem.

TL;DR (numai comenzi de bază)

Creați un utilizator

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

Adăugați SSH la el

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

Configurare de bază:

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

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

Setare 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 '<Ваш пароль от 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ți o picătură pe DigitalOcean și înregistrați o nouă cheie SSH

Cred cu adevărat că vă veți da seama cum să vă înregistrați la DigitalOcean. Nu este ușor, cu multe verificări și alte lucruri. Dacă primiți în mod constant o eroare de rețea la verificarea utilizării documentelor, încercați să faceți totul printr-un VPN, ar trebui să vă ajute.

În meniul din partea de sus, faceți clic Crea->Picături. Alege Ubuntu.

De îndată ce vă înregistrați, veți primi 100 USD în contul dvs. Dar nu te lăsa păcălit. Ai doar 60 de zile să-l petreci. Și asta este foarte puțin. S-ar putea, ca și mine, să doriți să utilizați un plan mai scump, pentru ca mai târziu, când încep să curgă banii reali, să puteți trece la unul mai ieftin. Îți spun imediat că nu va funcționa. Îl poți crește, dar nu îl poți reduce. Așa merge. aleg Standard->$5.

Aleg regiunea cea mai apropiată de noi Frankfurt. Rețeaua VPC->implicit-fra1

Vom efectua imediat autentificarea prin SSH. Clic Noua cheie SSH. Dacă nu aveți SSH, în dreapta sunt instrucțiuni foarte simple. Deschideți un terminal bash și lipiți ssh-keygen. Apoi mergem la fișierul cu cheia publică /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (sau pur și simplu cat ~/.ssh/id_rsa.pub), copiați conținutul și lipiți-l în fereastra din stânga. Orice nume.

Am venit cu un nume de gazdă pentru picătură.

presa Creați picătură

Creați un utilizator nou

  • ssh root@[IP-адрес вашего дроплета]
  • Sigur doriți să continuați conectarea (da/nu/[amprenta])? yes
  • Introduceți parola SSH
  • Creați un utilizator laravel: adduser laravel
  • Introduceți parola și alte informații (eu introduc doar numele complet)
  • Adăugați utilizatorul în grupul sudo: usermod -aG sudo laravel

SSH pentru utilizator nou

  • Comutați la noul utilizator: su laravel

Efectuăm toate acțiunile în continuare, până la sfârșitul articolului, în numele utilizatorului laravel. Prin urmare, dacă sunteți întrerupt brusc, reconectați-vă și intrați su laravel

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

Am deschis fișierul în Vim. Dacă nu ești deloc familiarizat cu el, poți lucra în Nano, dreptate.

Cele mai elementare comenzi Vim

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

  • Vim are diferite moduri: Modul normal, în care introdu comenzi și selectezi moduri și altele.
  • Pentru a ieși din orice mod și a reveni la modul normal, trebuie doar să apăsați Esc
  • Deplasați-vă: puteți utiliza doar săgețile
  • Iesire fara salvare <Normal mode>: :q!
  • Ieșiți și salvați <Normal mode>: :wq
  • Comutați la modul de introducere a textului <Normal mode>: i (din engleză. insera)
  • Introducem cheia noastră publică (ceea ce am făcut mai sus)
  • Ne protejăm împotriva schimbărilor: chmod 600 ~/.ssh/authorized_keys

Instalarea unui firewall

  • Să ne uităm la toate setările disponibile: sudo ufw app list
  • Permite OpenSSH (altfel ne va bloca): sudo ufw allow OpenSSH
  • Să lansăm firewall-ul: sudo ufw enable, y
  • Verificăm: sudo ufw status

Status: active

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

Totul e bine.

Instalarea Nginx

În timpul instalării, uneori vi se va întreba „Ești sigur?” Răspuns y (bine, doar daca esti sigur).

  • sudo apt update
  • sudo apt install nginx

Adăugarea Nginx la setările paravanului de protecție

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

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

Implementarea unei aplicații pe Laravel 7 pe Ubuntu și Nginx

Instalarea MySQL

  • sudo apt install mysql-server
  • Rulați un script de protecție automată sudo mysql_secure_installation

Răspunde la întrebările puse. Dacă nu știi ce să răspunzi, iată câteva opțiuni sugerate:

  • Validați pluginul pentru parolă - N

  • Eliminați utilizatori anonimi? — Y

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

  • Eliminați baza de date de testare și accesul la ea? — N

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

  • Să mergem la MySQL: sudo mysql

  • Să ne uităm la metodele de acces: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Setați o parolă pentru root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Să ne uităm din nou la metodele de acces: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Aplicați modificările și părăsiți MySQL: FLUSH PRIVILEGES; и exit

  • Acum, pentru a vă conecta la MySQL, trebuie să utilizați mysql -u root -p și introduceți parola

Instalarea PHP

Să folosim un depozit terță parte de la Ondrej 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 hai să alegem. Pentru Laravel 7, puteți alege PHP 7.3 sau 7.4. Singura diferență va fi în numerele 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) funcționează cu solicitări PHP. mysql, desigur, pentru lucrul cu MySQL.

De acum înainte voi face totul pe 7.4.

Configurarea Nginx

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

În loc de „<Domeniul dvs.>” introduceți domeniul (de exemplu, mysite.ru) pe care doriți să le utilizați în viitor. Dacă nu aveți încă unul, scrieți unul, apoi repetați pașii din acest capitol pentru domeniul dvs. când îl selectați.

Introduceți următoarele:

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

Dacă ați ales versiunea 7.3 php7.4-fpm.sock scrie in php7.4-fpm.sock.

Ascultați portul 80 server_namecând ajungem la cererea rădăcină /var/www/html luați fișierul index. Dacă după server_name Există ceva, căutăm un astfel de fișier. Dacă nu îl găsim, aruncăm 404. Dacă se termină cu .php, alerga prin fpm... Daca exista .ht, interzice (403).

  • Realizarea unui link de la sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Se elimină linkul către default: sudo unlink /etc/nginx/sites-enabled/default
  • Verificarea erorilor: sudo nginx -t
  • Reporniți: sudo systemctl reload nginx

Verificarea lucrarii:

  • sudo vim /var/www/html/info.php
  • Noi scriem: <?php phpinfo();
  • Mergeți la <Ваш IP>/info.php

Ar trebui să vezi așa ceva:

Implementarea unei aplicații pe Laravel 7 pe Ubuntu și Nginx

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

Instalați 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

  • Să mergem la MySQL: mysql -u root -p

  • Creați 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 '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Creați un folder pentru proiect: sudo mkdir -p <Имя проекта>

  • Oferim utilizatorului laravel drepturi asupra proiectului: sudo chown laravel:laravel <Имя проекта>

În continuare, trebuie să transferați proiectul. De exemplu, clonarea din Github.

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

Merită să luați în considerare faptul că, dacă nu ați salvat fișiere statice (de exemplu, din /public) pe Github, atunci, desigur, nu le veți avea. De exemplu, am creat un thread separat pentru a rezolva acest lucru deploy, din care am clonat deja: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instalarea dependențelor: composer install
  • Creați .env: vim .env

Versiunea de bază a acesteia arată astfel:

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>

Dacă copiați .env, înlocuiți APP_ENV cu producție, APP_DEBUG cu false și introduceți setările corecte pentru MySQL.

  • Migrarea bazei de date: php artisan migrate
  • Generarea codului: php artisan key:generate

Modificarea permisiunilor:

  • 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 rămas este să reconfigurați 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 <Ваш домен или 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;
    }
}

Ca și data trecută, dacă ați ales versiunea 7.3 php7.4-fpm.sock scrie in php7.4-fpm.sock.

Configurarea unui domeniu pe DigitalOcean

Totul este de fapt foarte simplu. Cumperi un domeniu (oriunde), treci la DigitalOcean la Crea->Domenii/DNS... În câmp Adăugați un domeniu introduceți acest domeniu și faceți clic pe adăugare. Apoi accesați setările domeniului și câmpul NOMUL DE GĂȘTARE introduce @. Selectați un proiect și faceți clic Creați înregistrarea.
Acum accesați site-ul de unde ați cumpărat domeniul, găsiți acolo „Servere DNS” (sau ceva similar) și introduceți serverele DigitalOcean (și 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ă este că site-ul dvs. se va deschide numai ca HTTP. Pentru a avea HTTPS, treceți la următoarea parte.

Configurarea HTTPS

Instalați certbot și transmiteți-i numele de domeniu (format mysite.ru) și numele de domeniu cu 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.<Ваш домен>

Acum trebuie să reconfigurați Nginx (nu uitați să vă înlocuiți valorile):

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ă înțelegeți deja ce trebuie schimbat pentru PHP 7.3.

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

Tot ce rămâne este să setați 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 așa cum ar trebui.

[Avansat] Instalarea Node.js

Dacă brusc trebuie 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

Gata, m-am oprit la faza asta. În principiu, sunt mulțumit de rezultat. Poate voi trece de la DigitalOcean undeva mai aproape de Rusia și mai ieftin. Dar din moment ce deja trecusem prin toate rundele de verificare de pe site și făcusem totul acolo, le-am arătat prin exemplu. În plus, cei 100 de dolari de pornire sunt o trambulină excelentă pentru antrenament.

PS Mulțumiri speciale autorului esența asta, care a servit drept bază pentru toate acțiunile de mai sus. În unele cazuri nu funcționează pentru Laravel 7, l-am reparat.

PPS Dacă se întâmplă să fiți un inginer de top care gândește în comenzi bash, vă rugăm să nu judeca aspru. S-ar putea să găsiți acest articol ca fiind de un standard scăzut, dar m-aș fi bucurat să găsesc unul când aveam nevoie de unul. Dacă există sugestii de îmbunătățire, sunt de acord.

Sursa: www.habr.com

Adauga un comentariu