Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Odlučio sam napraviti svoj portfelj koristeći Laravel 7. Tako da glavna stranica bude odredišna stranica, a sve informacije na njoj mogu se mijenjati putem admin panela. Nije bit. Došlo je do raspoređivanja. Pronašao sam nekoliko dobrih tutorijala o tome kako to učiniti na punopravnom poslužitelju sa svim problemima. Nisam baš jak u implementaciji; općenito sam više front nego full stack. I, ako još mogu pisati i testirati u PHP-u, onda prije upravljanja poslužiteljem itd. Nisam još odrastao. Ali morao sam to shvatiti.

Sada ćemo proći kroz sve korake, počevši od pokretanja putem SSH-a do radnog mjesta. Pokušat ćemo izbjeći sve zamke.

Možda ćete moći pronaći slične upute na internetu. Uostalom, konačno sam ga pronašao. Istina, ne na jednom mjestu, ne bez pomoći StackOverflowa, a jedva na ruskom. Patio sam. Zato sam odlučio pojednostaviti vaš život.

Sve ćemo učiniti kapljicom na DigitalOceanu. To, naravno, nije potrebno, odaberite bilo koji hosting. Kada dođete do poslužitelja koji radi na Ubuntuu, vratite se. Za one koji se ipak odluče za to na DigitalOceanu, bit će više savjeta o postavljanju domene. I 100 dolara referentne veze.

Svi koraci specifični za DigitalOcean bit će navedeni u fusnotama poput ovih.

Počnimo.

TL;DR (samo osnovne naredbe)

Stvorite korisnika

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

Dodajte mu SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Umetnite javni ključ
  • chmod 600 ~/.ssh/authorized_keys

Vatrozid

  • 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/<Ваш домен>

Osnovna postavka:

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

Samo HTTP postavljanje za 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;
    }
}

HTTPS postavka za 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

Stvorite droplet na DigitalOceanu i registrirajte novi SSH ključ

Zaista vjerujem da ćete sami smisliti kako se registrirati na DigitalOcean. Nije lako, s puno provjera i ostalog. Ako stalno dobivate mrežnu pogrešku prilikom provjere pomoću dokumenata, pokušajte sve učiniti putem VPN-a, trebalo bi pomoći.

U izborniku pri vrhu kliknite stvoriti->kapljice. Odaberite Ubuntu.

Čim se registrirate, dobit ćete 100 USD na svoj račun. Ali ne dajte se zavarati. Imate samo 60 dana da ga potrošite. A ovo je jako malo. Možda ćete, kao i ja, htjeti koristiti skuplji plan, tako da kasnije, kada počne pritjecati pravi novac, možete prijeći na jeftiniji. Odmah ću vam reći da to neće uspjeti. Možete ga povećati, ali ga ne možete smanjiti. Tako to ide. biram standard->$5.

Biram regiju koja nam je najbliža Frankfurt. VPC mreža->default-fra1

Odmah ćemo izvršiti autentifikaciju putem SSH-a. Klik Novi SSH ključ. Ako nemate SSH, s desne strane nalaze se vrlo jednostavne upute. Otvorite bash terminal i zalijepite ssh-keygen. Zatim idemo na datoteku s javnim ključem /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (ili jednostavno cat ~/.ssh/id_rsa.pub), kopirajte sadržaj i zalijepite ga u prozor s lijeve strane. Bilo koje ime.

Smišljamo ime hosta za droplet.

Gurnuti Napravi Droplet

Stvorite novog korisnika

  • ssh root@[IP-адрес вашего дроплета]
  • Jeste li sigurni da želite nastaviti povezivanje (da/ne/[otisak prsta])? yes
  • Unesite svoju SSH lozinku
  • Stvorite korisnika laravel: adduser laravel
  • Unesite svoju lozinku i ostale podatke (upisujem samo puno ime)
  • Dodajte korisnika sudo grupi: usermod -aG sudo laravel

SSH za novog korisnika

  • Prijeđi na novog korisnika: su laravel

Sve radnje dalje, do kraja članka, provodimo u ime korisnika laravela. Stoga, ako vas iznenada prekinu, ponovno se prijavite i uđite su laravel

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

Otvorili smo datoteku u Vimu. Ako uopće niste upoznati s tim, možete raditi u Nanu, vaše pravo.

Najosnovnije Vim naredbe

Kako biste koristili Vim editor u cijelom članku, trebate znati sljedeće.

  • Vim ima različite načine rada: Normalni način rada, u kojem unosite naredbe i birate načine rada i ostale.
  • Za izlaz iz bilo kojeg načina rada i povratak u normalni način rada, samo pritisnite Esc
  • Krećite se: možete koristiti samo strelice
  • Izađi bez spremanja <Normal mode>: :q!
  • Izađi i spremi <Normal mode>: :wq
  • Prebacite se na način unosa teksta <Normal mode>: i (s engleskog. INSERT)
  • Umećemo naš javni ključ (što smo učinili gore)
  • Od promjena štitimo: chmod 600 ~/.ssh/authorized_keys

Instaliranje vatrozida

  • Pogledajmo sve dostupne postavke: sudo ufw app list
  • Dopusti OpenSSH (inače će nas zaključati): sudo ufw allow OpenSSH
  • Pokrenimo firewall: sudo ufw enable, y
  • Provjeravamo: sudo ufw status

Status: active

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

Sve je u redu.

Instaliranje Nginxa

Tijekom instalacije ponekad ćete biti upitani "Jeste li sigurni?" Odgovor y (dobro, samo ako ste sigurni).

  • sudo apt update
  • sudo apt install nginx

Dodavanje Nginxa u postavke vatrozida

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

Idi na svoj IP. Ako sve bude u redu, trebali biste vidjeti sljedeće.

Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Instaliranje MySQL-a

  • sudo apt install mysql-server
  • Pokretanje skripte za automatsku zaštitu sudo mysql_secure_installation

Odgovorite na postavljena pitanja. Ako ne znate što odgovoriti, evo nekoliko predloženih opcija:

  • Dodatak za potvrdu lozinke - N

  • Ukloniti anonimne korisnike? — Y

  • Onemogućiti root prijavu na daljinu? — N

  • Ukloniti test bazu podataka i pristup njoj? — N

  • Sada ponovno učitati tablice povlastica? — Y

  • Idemo na MySQL: sudo mysql

  • Pogledajmo metode pristupa: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Postavite lozinku za root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Pogledajmo ponovno metode pristupa: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Primijenite promjene i izađite iz MySQL-a: FLUSH PRIVILEGES; и exit

  • Sada, da biste se prijavili u MySQL morate koristiti mysql -u root -p i unesite lozinku

Instaliranje PHP-a

Upotrijebimo repozitorij treće strane iz 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

Sad izaberimo. Za Laravel 7 možete odabrati PHP 7.3 ili 7.4. Jedina razlika će biti u brojevima 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) radi s PHP zahtjevima. mysql, naravno, za rad s MySQL.

Od sada ću sve raditi 7.4.

Postavljanje Nginxa

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

Umjesto "<Vaša domena>" unesite domenu (npr. mysite.ru) koje želite koristiti u budućnosti. Ako ga još nemate, napišite bilo koji, a zatim samo ponovite korake u ovom poglavlju za svoju domenu kada je odaberete.

Unesite sljedeće:

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

Ako ste umjesto toga odabrali verziju 7.3 php7.4-fpm.sock upiši php7.4-fpm.sock.

Slušajte priključak 80 uključen server_namekada stignemo do root zahtjeva /var/www/html uzeti indeksnu datoteku. Ako nakon server_name Ima nešto, tražimo takvu datoteku. Ako ga ne pronađemo, izbacujemo 404. Ako završava s .php, protrčati fpm... Ako ima .ht, zabraniti (403).

  • Izrada veze iz sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Uklanjanje veze na default: sudo unlink /etc/nginx/sites-enabled/default
  • Provjera grešaka: sudo nginx -t
  • Ponovno podizanje sustava: sudo systemctl reload nginx

Provjera rada:

  • sudo vim /var/www/html/info.php
  • Pišemo: <?php phpinfo();
  • Idemo <Ваш IP>/info.php

Trebali biste vidjeti nešto poput ovoga:

Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Sada se ova datoteka može izbrisati: sudo rm /var/www/html/info.php

Instalirajte 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

  • Idemo na MySQL: mysql -u root -p

  • Stvorite bazu podataka s imenom laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Napravite mapu za projekt: sudo mkdir -p <Имя проекта>

  • Mi pružamo korisniku laravel prava na projekt: sudo chown laravel:laravel <Имя проекта>

Zatim morate prenijeti projekt. Na primjer, kloniranje s Githuba.

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

Vrijedno je uzeti u obzir da ako niste spremili statičke datoteke (na primjer, iz /public) na Githubu, onda ih, naravno, nećete imati. Na primjer, stvorio sam zasebnu nit da to riješim deploy, iz kojeg sam već klonirao: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instaliranje ovisnosti: composer install
  • Stvorite .env: vim .env

Njegova osnovna verzija izgleda ovako:

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>

Ako kopirate svoj .env, zamijenite APP_ENV s production, APP_DEBUG s false i unesite ispravne postavke za MySQL.

  • Migracija baze podataka: php artisan migrate
  • Generiranje koda: php artisan key:generate

Promjena dopuštenja:

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

Zadnje što preostaje je rekonfigurirati Nginx za 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;
    }
}

Kao i prošli put, ako ste umjesto toga odabrali verziju 7.3 php7.4-fpm.sock upiši php7.4-fpm.sock.

Postavljanje domene na DigitalOcean

Sve je zapravo vrlo jednostavno. Kupite domenu (bilo gdje), prebacite se na DigitalOcean na stvoriti->Domene/DNS... Na terenu Dodajte domenu unesete ovu domenu i kliknete dodaj. Zatim idite na postavke domene i na polje PRIMEN Unesi @. Odaberite projekt i kliknite Napravite zapis.
Sada idite na stranicu gdje ste kupili domenu, tamo pronađite “DNS poslužitelji” (ili nešto slično) i unesite poslužitelje DigitalOcean (tj. ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Sada trebate pričekati malo (ili puno) dok se ove postavke ne prihvate. Spreman!
Jedini problem je što će se vaša stranica otvoriti samo kao HTTP. Da biste imali HTTPS, prijeđite na sljedeći dio.

Postavljanje HTTPS-a

Instalirajte certbot i proslijedite mu naziv domene (format mysite.ru) i naziv domene s 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.<Ваш домен>

Sada trebate ponovno konfigurirati Nginx (ne zaboravite zamijeniti svoje vrijednosti):

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

Mislim da već razumijete što treba promijeniti za PHP 7.3.

Ovdje je, zapravo, sve jednostavno. Jednostavno preusmjeravamo sve zahtjeve s HTTP-a (port 80) na HTTPS (port 443). I tamo radimo sve isto kao i prije, ali uz enkripciju.

Sve što preostaje je postaviti dopuštenja u vatrozidu:

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

Sada bi sve trebalo raditi kako treba.

[Napredno] Instaliranje Node.js

Ako iznenada trebate pokrenuti npm naredbe izravno na poslužitelju, trebate instalirati Node.js.

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

To je to, stao sam u ovoj fazi. U principu sam zadovoljan rezultatom. Možda ću prijeći s DigitalOceana negdje bliže Rusiji i jeftinije. Ali budući da sam već prošao sve krugove provjere na stranici i sve napravio tamo, pokazao sam im na primjeru. Osim toga, njihovih početnih 100 dolara odlična je odskočna daska za trening.

PS Posebna zahvala autoru ovu bit, koji je poslužio kao temelj za sve navedene radnje. U nekim slučajevima ne radi za Laravel 7, ja sam to popravio.

PPS Ako ste slučajno vrhunski inženjer koji razmišlja u bash naredbama, nemojte strogo suditi. Možda ćete smatrati da je ovaj članak niske razine, ali bilo bi mi drago da sam ga pronašao kad mi je trebao. Ako ima prijedloga za poboljšanje, ja sam za to.

Izvor: www.habr.com

Dodajte komentar