Nasadenie aplikácie do Laravel 7 na Ubuntu a Nginx

Nasadenie aplikácie do Laravel 7 na Ubuntu a Nginx

Rozhodol som sa vytvoriť svoje portfólio pomocou Laravel 7. Aby hlavná stránka bola vstupnou stránkou a všetky informácie na nej sa dali meniť pomocou admin panela. Nie pointa. Prišlo na nasadenie. Našiel som pár dobrých návodov, ako to urobiť na plnohodnotnom serveri so všetkými problémami. Nie som veľmi silný v nasadení, vo všeobecnosti som viac vpredu ako full stack. A ak môžem stále písať a testovať v PHP, potom pred správou servera atď. Ešte som nevyrástol. Ale musel som na to prísť.

Teraz prejdeme všetkými krokmi, počnúc spustením cez SSH a končiac pracovnou stránkou. Pokúsime sa vyhnúť všetkým nástrahám.

Podobné pokyny možno nájdete aj na internete. Napokon som to predsa len našiel. Pravda, nie na jednom mieste, nie bez pomoci StackOverflow a sotva v ruštine. Trpel som. Preto som sa rozhodol zjednodušiť vám život.

Všetko urobíme kvapôčkou na DigitalOcean. To, samozrejme, nie je potrebné, vyberte si akýkoľvek hosting. Keď sa dostanete na fungujúci server na Ubuntu, vráťte sa. Pre tých, ktorí sa to predsa len rozhodnú urobiť na DigitalOcean, pribudnú ďalšie tipy na nastavenie domény. A Odkaz na odporúčanie 100 USD.

Všetky kroky špecifické pre DigitalOcean budú uvedené v poznámkach pod čiarou, ako sú tieto.

Začnime.

TL;DR (iba základné príkazy)

Vytvorte používateľa

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

Pridajte k tomu SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Vložte verejný kľúč
  • chmod 600 ~/.ssh/authorized_keys

POŽARNE DVERE

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

Základné nastavenie:

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

Iba nastavenie HTTP pre 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;
    }
}

Nastavenie HTTPS pre 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

Vytvorte droplet na DigitalOcean a zaregistrujte nový kľúč SSH

Naozaj verím, že sami prídete na to, ako sa zaregistrovať v DigitalOcean. Nie je to jednoduché, s množstvom overovaní a iných vecí. Ak sa pri overovaní pomocou dokumentov neustále zobrazuje chyba siete, skúste urobiť všetko cez VPN, malo by to pomôcť.

V ponuke v hornej časti kliknite na vytvoriť->kvapôčky. Vyberte si ubuntu.

Hneď ako sa zaregistrujete, dostanete na svoj účet 100 $. Ale nenechajte sa oklamať. Máte na to iba 60 dní. A to je veľmi málo. Možno budete chcieť, ako ja, použiť drahší plán, aby ste neskôr, keď začnú tiecť skutočné peniaze, mohli prejsť na lacnejší. Hneď vám poviem, že to nepôjde. Môžete ho zvýšiť, ale nemôžete ho znížiť. Tak to ide. vyberám si štandard->$5.

Vyberám si región, ktorý je nám najbližšie Frankfurt. VPC sieť->default-fra1

Okamžite vykonáme autentifikáciu cez SSH. Kliknite Nový kľúč SSH. Ak nemáte SSH, vpravo je veľmi jednoduchý návod. Otvorte bash terminál a vložte ho ssh-keygen. Potom prejdeme k súboru s verejným kľúčom /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (alebo jednoducho cat ~/.ssh/id_rsa.pub), skopírujte obsah a vložte ho do okna vľavo. Hocijaké meno.

Prichádzame s názvom hostiteľa pre kvapôčku.

lis Vytvorte kvapôčku

Vytvorte nového používateľa

  • ssh root@[IP-адрес вашего дроплета]
  • Naozaj chcete pokračovať v pripájaní (áno/nie/[odtlačok prsta])? yes
  • Zadajte svoje heslo SSH
  • Vytvorte používateľa laravel: adduser laravel
  • Zadajte svoje heslo a ďalšie informácie (zadávam iba celé meno)
  • Pridajte používateľa do skupiny sudo: usermod -aG sudo laravel

SSH pre nového používateľa

  • Prepnúť na nového používateľa: su laravel

Všetky akcie vykonávame ďalej, až do konca článku, v mene užívateľa laravel. Preto, ak vás náhle vyrušia, znova sa prihláste a vstúpte su laravel

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

Súbor sme otvorili vo Vime. Ak sa v tom vôbec nevyznáte, môžete pracovať v Nano, máte právo.

Najzákladnejšie príkazy Vim

Aby ste mohli používať editor Vim v celom článku, potrebujete vedieť nasledovné.

  • Vim má rôzne režimy: Normálny režim, v ktorom zadávate príkazy a vyberáte režimy a iné.
  • Ak chcete ukončiť akýkoľvek režim a vrátiť sa do normálneho režimu, stačí stlačiť Esc
  • Pohybujte sa: môžete použiť iba šípky
  • Ukončiť bez uloženia <Normal mode>: :q!
  • Ukončite a uložte <Normal mode>: :wq
  • Prepnite do režimu zadávania textu <Normal mode>: i (z angličtiny. vložiť)
  • Vložíme náš verejný kľúč (čo sme urobili vyššie)
  • Chránime pred zmenami: chmod 600 ~/.ssh/authorized_keys

Inštalácia brány firewall

  • Pozrime sa na všetky dostupné nastavenia: sudo ufw app list
  • Povoliť OpenSSH (inak nás uzamkne): sudo ufw allow OpenSSH
  • Spustíme firewall: sudo ufw enable, y
  • skontrolujte: sudo ufw status

Status: active

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

Všetko je v poriadku.

Inštalácia Nginx

Počas inštalácie sa vás niekedy opýta: "Ste si istý?" Odpoveď y (no, len ak si si istý).

  • sudo apt update
  • sudo apt install nginx

Pridanie Nginx do nastavení brány 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)

Prejdite na svoju IP. Ak všetko pôjde dobre, mali by ste vidieť nasledovné.

Nasadenie aplikácie do Laravel 7 na Ubuntu a Nginx

Inštalácia MySQL

  • sudo apt install mysql-server
  • Spustenie skriptu automatickej ochrany sudo mysql_secure_installation

Odpovedzte na položené otázky. Ak neviete, čo odpovedať, tu je niekoľko navrhovaných možností:

  • Overenie doplnku hesla - N

  • Chcete odstrániť anonymných používateľov? — Y

  • Zakázať prihlásenie root na diaľku? — N

  • Odstrániť testovaciu databázu a získať k nej prístup? — N

  • Chcete teraz znova načítať tabuľky práv? — Y

  • Poďme na MySQL: sudo mysql

  • Pozrime sa na spôsoby prístupu: SELECT user,authentication_string,plugin,host FROM mysql.user;

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

  • Pozrime sa znova na spôsoby prístupu: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Použite zmeny a ukončite MySQL: FLUSH PRIVILEGES; и exit

  • Teraz, ak sa chcete prihlásiť do MySQL, musíte použiť mysql -u root -p a zadajte heslo

Inštalácia PHP

Použime úložisko tretej strany z 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

Teraz si vyberme. Pre Laravel 7 si môžete vybrať PHP 7.3 alebo 7.4. Rozdiel bude len v číslach 3 a 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) pracuje s požiadavkami PHP. mysql, samozrejme, pre prácu s MySQL.

Odteraz budem všetko robiť 7.4.

Nastavenie Nginx

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

Namiesto „<Vaša doména>“ zadajte doménu (napr. mysite.ru), ktorý chcete použiť v budúcnosti. Ak ešte žiadnu nemáte, napíšte nejaké a potom pri výbere zopakujte kroky v tejto kapitole pre vašu doménu.

Zadaj nasledujúce:

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

Ak ste namiesto toho vybrali verziu 7.3 php7.4-fpm.sock vpísať php7.4-fpm.sock.

Počúvajte port 80 zapnutý server_namekeď sa dostaneme ku koreňovej požiadavke /var/www/html vziať indexový súbor. Ak po server_name Niečo je, hľadáme taký súbor. Ak to nenájdeme, vyhodíme 404. Ak to skončí .php, prebehnúť fpm... Ak existuje .ht, zakázať (403).

  • Vytvorenie odkazu z sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Odstraňuje sa odkaz na default: sudo unlink /etc/nginx/sites-enabled/default
  • Kontrola chýb: sudo nginx -t
  • Reštartovať: sudo systemctl reload nginx

Kontrola práce:

  • sudo vim /var/www/html/info.php
  • Píšeme: <?php phpinfo();
  • Prejdeme k <Ваш IP>/info.php

Mali by ste vidieť niečo takéto:

Nasadenie aplikácie do Laravel 7 na Ubuntu a Nginx

Teraz je možné tento súbor odstrániť: sudo rm /var/www/html/info.php

Nainštalujte 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

  • Poďme na MySQL: mysql -u root -p

  • Vytvorte databázu s názvom laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Vytvorte priečinok pre projekt: sudo mkdir -p <Имя проекта>

  • Poskytujeme užívateľovi laravel práva na projekt: sudo chown laravel:laravel <Имя проекта>

Ďalej musíte preniesť projekt. Napríklad klonovanie z Githubu.

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

Stojí za zváženie, že ak ste neuložili statické súbory (napríklad z /public) na Github, potom ich prirodzene nebudete mať. Na vyriešenie tohto problému som napríklad vytvoril samostatné vlákno deploy, z ktorého som už naklonoval: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Inštalácia závislostí: composer install
  • Vytvoriť .env: vim .env

Jeho základná verzia vyzerá takto:

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>

Ak skopírujete súbor .env, nahraďte APP_ENV produkčným, APP_DEBUG false a zadajte správne nastavenia pre MySQL.

  • Migrácia databázy: php artisan migrate
  • Generovanie kódu: php artisan key:generate

Zmena povolení:

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

Posledná vec, ktorá zostáva, je prekonfigurovať Nginx pre 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;
    }
}

Ako minule, ak ste namiesto toho zvolili verziu 7.3 php7.4-fpm.sock vpísať php7.4-fpm.sock.

Nastavenie domény na DigitalOcean

Všetko je vlastne veľmi jednoduché. Kúpite si doménu (kdekoľvek), prejdete na DigitalOcean na vytvoriť->Domény/DNS... V poli Pridajte doménu zadáte túto doménu a kliknete na pridať. Potom prejdite do nastavení domény a do poľa MENO HOSŤA vstúpiť @. Vyberte projekt a kliknite Vytvorte záznam.
Teraz prejdite na stránku, kde ste si kúpili doménu, nájdite tam „Servery DNS“ (alebo niečo podobné) a zadajte servery DigitalOcean (konkrétne ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Teraz musíte chvíľu (alebo veľa) počkať, kým budú tieto nastavenia akceptované. Pripravený!
Jediným problémom je, že vaša stránka sa otvorí iba ako HTTP. Ak chcete mať HTTPS, prejdite na ďalšiu časť.

Nastavenie HTTPS

Nainštalujte certbot a odovzdajte mu názov domény (formát mysite.ru) a názov domény 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.<Ваш домен>

Teraz musíte prekonfigurovať Nginx (nezabudnite nahradiť svoje hodnoty):

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

Myslím, že už chápete, čo je potrebné zmeniť pre PHP 7.3.

Tu je v skutočnosti všetko jednoduché. Všetky požiadavky jednoducho presmerujeme z HTTP (port 80) na HTTPS (port 443). A tam robíme všetko rovnako ako predtým, ale so šifrovaním.

Zostáva len nastaviť povolenia vo firewalle:

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

Teraz by malo všetko fungovať ako má.

[Pokročilé] Inštalácia Node.js

Ak náhle potrebujete spustiť príkazy npm priamo na serveri, musíte si nainštalovať Node.js.

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

To je všetko, v tejto fáze som sa zastavil. V zásade som s výsledkom spokojný. Možno prejdem z DigitalOcean niekam bližšie k Rusku a lacnejšie. Ale keďže som už prešiel všetkými overovacími kolami na stránke a urobil som všetko tam, ukázal som ich na príklade. Navyše ich štartovacích 100 dolárov je výborným odrazovým mostíkom na tréning.

PS Osobitné poďakovanie autorovi táto podstata, ktorý slúžil ako podklad pre všetky vyššie uvedené úkony. V niektorých prípadoch to nefunguje pre Laravel 7, opravil som to.

PPS Ak ste náhodou špičkový inžinier, ktorý premýšľa v bash príkazoch, prosím, nesúďte tvrdo. Možno sa vám bude zdať tento článok nízkej úrovne, ale bol by som rád, keby som ho našiel, keď by som ho potreboval. Ak existujú návrhy na zlepšenie, som za všetko.

Zdroj: hab.com

Pridať komentár