Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Odlučio sam da napravim svoj portfolio koristeći Laravel 7. Tako da glavna stranica bude landing stranica, a sve informacije na njoj mogu se mijenjati preko admin panela. Nije poenta. Došlo je do raspoređivanja. Našao sam nekoliko dobrih tutorijala o tome kako to učiniti na punom serveru sa svim problemima. Nisam baš jak u raspoređivanju; generalno sam više prednji nego full stack. I, ako još uvijek mogu pisati i testirati u PHP-u, onda prije upravljanja serverom, itd. Nisam još odrastao. Ali morao sam to shvatiti.

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

Možda ćete moći pronaći slična uputstva na internetu. Na kraju krajeva, konačno sam ga našao. Istina, ne na jednom mjestu, ne bez pomoći StackOverflow-a, i jedva na ruskom. Patio sam. Zato sam odlučio da ti pojednostavim život.

Sve ćemo raditi s kapljicom na DigitalOceanu. To, naravno, nije potrebno; odaberite bilo koji hosting. Kada dođete do radnog servera na Ubuntu, vratite se. Za one koji se ipak odluče to učiniti na DigitalOceanu, bit će još savjeta za postavljanje domene. I $100 link za preporuke.

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

Počnimo.

TL;DR (samo osnovne naredbe)

Kreirajte 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

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

Osnovno podešavanje:

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 podešavanje 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

Kreirajte kapljicu na DigitalOcean i registrirajte novi SSH ključ

Iskreno vjerujem da ćete sami shvatiti kako se registrovati na DigitalOcean. Nije lako, uz puno provjera i drugih stvari. Ako stalno dobivate mrežnu grešku prilikom provjere korištenja dokumenata, pokušajte sve učiniti preko VPN-a, trebalo bi pomoći.

U meniju na vrhu kliknite stvoriti->Kapljice. Odaberite Ubuntu.

Čim se registrujete, dobit ćete 100 USD na svoj račun. Ali nemojte se zavaravati. 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 pravi novac počne da teče, možete preći na jeftiniji. Odmah ću vam reći da to neće uspjeti. Možete ga povećati, ali ne možete smanjiti. Tako to ide. ja biram standard->$5.

Ja biram region koji je nama najbliži Frankfurt. VPC mreža->default-fra1

Mi ćemo odmah izvršiti autentifikaciju putem SSH-a. Kliknite Novi SSH ključ. Ako nemate SSH, na desnoj strani su vrlo jednostavne upute. Otvorite bash terminal i zalijepite ssh-keygen. Zatim idemo na fajl sa 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.

Pritisni Create Droplet

Kreirajte novog korisnika

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

SSH za novog korisnika

  • Prebacite se na novog korisnika: su laravel

Sve radnje vršimo dalje, do kraja članka, u ime korisnika laravel. Stoga, ako ste iznenada prekinuti, ponovo se prijavite i uđite su laravel

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

Otvorili smo fajl u Vimu. Ako uopšte niste upoznati, možete raditi u Nano-u, vaše pravo.

Najosnovnije Vim komande

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

  • Vim ima različite režime: Normalni režim, u kojem unosite komande i birate režime i druge.
  • Da biste izašli iz bilo kojeg moda i vratili se u normalan način rada, samo pritisnite Esc
  • Krećite se: možete koristiti samo strelice
  • Izađite bez spremanja <Normal mode>: :q!
  • Izađite i sačuvajte <Normal mode>: :wq
  • Prebacite se na način unosa teksta <Normal mode>: i (sa engleskog. umetnite)
  • Ubacujemo naš javni ključ (što smo uradili gore)
  • Štitimo od promjena: chmod 600 ~/.ssh/authorized_keys

Instaliranje zaštitnog zida

  • Pogledajmo sve dostupne postavke: sudo ufw app list
  • Dozvolite 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 uredu.

Instalacija Nginxa

Tokom instalacije ćete ponekad biti upitani "Jeste li sigurni?" Odgovori y (pa, samo ako ste sigurni).

  • sudo apt update
  • sudo apt install nginx

Dodavanje Nginxa u postavke zaštitnog zida

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

Idite na svoju IP adresu. Ako sve prođe kako treba, trebali biste vidjeti sljedeće.

Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Instaliranje MySQL

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

Odgovorite na postavljena pitanja. Ako ne znate šta da odgovorite, evo nekoliko predloženih opcija:

  • Potvrdi dodatak za lozinku - N

  • Ukloniti anonimne korisnike? — Y

  • Zabraniti root prijavu na daljinu? — N

  • Ukloniti testnu bazu podataka i pristupiti joj? — N

  • Ponovno učitati tablice privilegija sada? — 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 ponovo 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 na MySQL morate koristiti mysql -u root -p i unesite lozinku

Instaliranje PHP-a

Hajde da koristimo repozitorijum 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

Sada birajmo. 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 sa PHP zahtjevima. mysql, naravno, za rad sa MySQL.

Od sada ću sve raditi na 7.4.

Postavljanje Nginxa

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

Umjesto "<Vaša domena>" unesite domenu (na primjer, 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 port 80 uključen server_namekada stignemo do root zahtjeva /var/www/html uzmite indeksni fajl. Ako posle server_name Ima nešto, tražimo takav fajl. Ako ga ne pronađemo, izbacit ćemo 404. Ako se završi sa .php, protrčati fpm... Ako ima .ht, zabraniti (403).

  • Pravljenje veze od sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Uklanjanje veze do default: sudo unlink /etc/nginx/sites-enabled/default
  • Provjera grešaka: sudo nginx -t
  • Ponovno pokretanje: sudo systemctl reload nginx

Provjera rada:

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

Trebali biste vidjeti nešto ovako:

Postavljanje aplikacije na Laravel 7 na Ubuntu & Nginx

Sada se ovaj fajl 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

  • Kreirajte bazu podataka sa imenom laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Kreirajte folder za projekat: sudo mkdir -p <Имя проекта>

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

Zatim morate prenijeti projekat. Na primjer, kloniranje sa Githuba.

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

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

  • Instaliranje zavisnosti: composer install
  • Kreirajte .env: vim .env

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 sa proizvodnim, APP_DEBUG sa false i unesite ispravne postavke za MySQL.

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

Promjena dozvola:

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

Posljednja stvar koja je preostala 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->Domains/DNS. V pole Dodajte domenu unesete ovu domenu i kliknete na dodaj. Zatim idite na postavke domene i na polje IME HOST-a enter @. Odaberite projekat i kliknite Kreirajte zapis.
Sada idite na stranicu na kojoj ste kupili domenu, tamo pronađite “DNS servere” (ili nešto slično) i unesite servere DigitalOcean (tj. ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Sada morate pričekati malo (ili puno) dok se ove postavke ne prihvate. Spremni!
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 ime domene (format mysite.ru) i naziv domene sa 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 morate ponovo 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ć razumete šta treba da se promeni za PHP 7.3.

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

Sve što ostaje je da podesite dozvole u firewall-u:

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

Sada bi sve trebalo da radi kako treba.

[Napredno] Instaliranje Node.js

Ako iznenada trebate pokrenuti npm komande direktno na serveru, morate 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 se prebaciti sa DigitalOceana negdje bliže Rusiji i jeftinije. Ali pošto sam već prošao sve krugove verifikacije na sajtu i uradio sve tamo, pokazao sam im primerom. Uz to, njihovih početnih 100 dolara odlična je odskočna daska za trening.

PS Posebno hvala autoru ovu suštinu, koji je poslužio kao osnova za sve gore navedene radnje. U nekim slučajevima ne radi za Laravel 7, popravio sam to.

PPS Ako ste slučajno vrhunski inžinjer koji razmišlja bash komandama, nemojte strogo suditi. Možda ćete smatrati da je ovaj članak niskog nivoa, ali bilo bi mi drago da ga nađem kada mi je zatrebao. Ako ima prijedloga za poboljšanje, ja sam za.

izvor: www.habr.com

Dodajte komentar