Nasazení aplikace do Laravel 7 na Ubuntu a Nginx

Nasazení aplikace do Laravel 7 na Ubuntu a Nginx

Rozhodl jsem se vytvořit své portfolio pomocí Laravel 7. Aby hlavní stránka byla vstupní stránkou a všechny informace na ní bylo možné měnit pomocí admin panelu. Nejde o to. Došlo k nasazení. Našel jsem pár dobrých návodů, jak to udělat na plnohodnotném serveru se všemi problémy. Nejsem příliš silný v nasazení; obecně jsem více vepředu než full stack. A pokud stále mohu psát a testovat v PHP, pak před správou serveru atd. Ještě jsem nevyrostl. Ale musel jsem na to přijít.

Nyní projdeme všemi kroky, počínaje spuštěním přes SSH a konče pracovním webem. Pokusíme se vyhnout všem nástrahám.

Podobné pokyny můžete najít na internetu. Nakonec jsem to nakonec našel. Pravda, ne na jednom místě, ne bez pomoci StackOverflow a sotva v ruštině. Trpěl jsem. Proto jsem se rozhodl zjednodušit vám život.

Vše uděláme kapkou na DigitalOcean. To samozřejmě není nutné, vyberte si jakýkoli hosting. Až se dostanete na fungující server na Ubuntu, vraťte se. Pro ty, kteří se stále rozhodnou to udělat na DigitalOcean, budou další tipy na nastavení domény. A Odkaz na doporučení 100 USD.

Všechny kroky specifické pro DigitalOcean budou uvedeny v poznámkách pod čarou, jako jsou tyto.

Začněme.

TL;DR (pouze základní příkazy)

Vytvořte uživatele

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

Přidejte k tomu SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Vložte veřejný klíč
  • 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/<Ваш домен>

Základní nastavení:

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

Pouze nastavení HTTP pro 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;
    }
}

Nastavení HTTPS pro 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

Vytvořte droplet na DigitalOcean a zaregistrujte nový klíč SSH

Opravdu věřím, že sami přijdete na to, jak se zaregistrovat u DigitalOcean. Není to jednoduché, se spoustou ověřování a dalších věcí. Pokud se při ověřování pomocí dokumentů neustále zobrazuje chyba sítě, zkuste vše udělat přes VPN, mělo by to pomoci.

V nabídce nahoře klikněte na Vytvořit->Kapky. Vyberte si ubuntu.

Jakmile se zaregistrujete, dostanete na svůj účet 100 $. Ale nenechte se zmást. Máte na to jen 60 dní. A to je velmi málo. Možná budete chtít, stejně jako já, použít dražší plán, abyste později, až začnou proudit skutečné peníze, mohli přejít na levnější. Rovnou vám řeknu, že to nepůjde. Můžete ji zvýšit, ale nemůžete ji snížit. Tak to jde. vybírám si Standard->$5.

Vybírám kraj, který je nám nejblíže Frankfurt. Síť VPC->default-fra1

Okamžitě provedeme autentizaci přes SSH. Klikněte Nový klíč SSH. Pokud nemáte SSH, napravo je velmi jednoduchý návod. Otevřete bash terminál a vložte ssh-keygen. Poté přejdeme k souboru s veřejným klíčem /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (nebo jednoduše cat ~/.ssh/id_rsa.pub), zkopírujte obsah a vložte jej do okna vlevo. Jakékoliv jméno.

Vymyslíme název hostitele pro droplet.

Klikněte zde Vytvořte kapku

Vytvořte nového uživatele

  • ssh root@[IP-адрес вашего дроплета]
  • Opravdu chcete pokračovat v připojení (ano/ne/[otisk prstu])? yes
  • Zadejte své SSH heslo
  • Vytvořte uživatele laravel: adduser laravel
  • Zadejte své heslo a další informace (zadávám pouze celé jméno)
  • Přidejte uživatele do skupiny sudo: usermod -aG sudo laravel

SSH pro nového uživatele

  • Přepnout na nového uživatele: su laravel

Veškeré akce dále, až do konce článku, provádíme jménem uživatele laravel. Proto, pokud budete náhle vyrušeni, znovu se přihlaste a vstupte su laravel

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

Soubor jsme otevřeli ve Vimu. Pokud se v tom vůbec nevyznáte, můžete pracovat v Nano, máte právo.

Nejzákladnější příkazy Vim

Abyste mohli používat editor Vim v celém článku, stačí znát následující.

  • Vim má různé režimy: Normální režim, ve kterém zadáváte příkazy a vybíráte režimy a další.
  • Chcete-li opustit jakýkoli režim a vrátit se do normálního režimu, stačí stisknout Esc
  • Pohybujte se: můžete použít pouze šipky
  • Odejít bez uložení <Normal mode>: :q!
  • Odejít a uložit <Normal mode>: :wq
  • Přepněte do režimu zadávání textu <Normal mode>: i (z angličtiny. INSERT)
  • Vložíme náš veřejný klíč (což jsme udělali výše)
  • Chráníme před změnami: chmod 600 ~/.ssh/authorized_keys

Instalace firewallu

  • Podívejme se na všechna dostupná nastavení: sudo ufw app list
  • Povolit OpenSSH (jinak nás zamkne): sudo ufw allow OpenSSH
  • Spustíme firewall: sudo ufw enable, y
  • Zkontrolujeme: sudo ufw status

Status: active

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

Vše je v pořádku.

Instalace Nginx

Během instalace budete někdy dotázáni "Jste si jisti?" Odpovědět y (no, jen pokud jste si jisti).

  • sudo apt update
  • sudo apt install nginx

Přidání 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)

Přejděte na svou IP. Pokud vše půjde dobře, měli byste vidět následující.

Nasazení aplikace do Laravel 7 na Ubuntu a Nginx

Instalace MySQL

  • sudo apt install mysql-server
  • Spuštění skriptu automatické ochrany sudo mysql_secure_installation

Odpovězte na položené otázky. Pokud nevíte, co odpovědět, zde je několik navrhovaných možností:

  • Plugin pro ověření hesla - N

  • Odebrat anonymní uživatele? — Y

  • Zakázat vzdálené přihlášení root? — N

  • Odebrat testovací databázi a přístup k ní? — N

  • Znovu načíst tabulky oprávnění? — Y

  • Pojďme k MySQL: sudo mysql

  • Podívejme se na přístupové metody: SELECT user,authentication_string,plugin,host FROM mysql.user;

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

  • Podívejme se znovu na přístupové metody: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Použijte změny a ukončete MySQL: FLUSH PRIVILEGES; и exit

  • Nyní, abyste se mohli přihlásit do MySQL, musíte použít mysql -u root -p a zadejte heslo

Instalace PHP

Použijme úložiště třetí 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

Nyní si vyberme. Pro Laravel 7 si můžete vybrat PHP 7.3 nebo 7.4. Jediný rozdíl bude v číslech 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žadavky PHP. mysql, samozřejmě pro práci s MySQL.

Odteď budu vše dělat 7.4.

Nastavení Nginx

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

Místo „<Vaše doména>“ zadejte doménu (např. mysite.ru), který chcete v budoucnu použít. Pokud ještě žádnou nemáte, napište si nějakou a poté při výběru zopakujte kroky v této kapitole pro vaši doménu.

Zadejte následující:

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

Pokud jste místo toho zvolili verzi 7.3 php7.4-fpm.sock Vepište php7.4-fpm.sock.

Poslouchejte port 80 zapnutý server_namekdyž se dostaneme k požadavku root /var/www/html vzít indexový soubor. Pokud po server_name Něco je, hledáme takový soubor. Pokud to nenajdeme, vyhodíme 404. Pokud to skončí .php, proběhnout fpm... Pokud existuje .ht, zakázat (403).

  • Vytvoření odkazu z sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Odstranění odkazu na default: sudo unlink /etc/nginx/sites-enabled/default
  • Kontrola chyb: sudo nginx -t
  • Restartovat: sudo systemctl reload nginx

Kontrola práce:

  • sudo vim /var/www/html/info.php
  • Píšeme: <?php phpinfo();
  • Pojď dál <Ваш IP>/info.php

Měli byste vidět něco takového:

Nasazení aplikace do Laravel 7 na Ubuntu a Nginx

Nyní lze tento soubor smazat: sudo rm /var/www/html/info.php

Nainstalujte 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

  • Pojďme k MySQL: mysql -u root -p

  • Vytvořte databázi s názvem laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Vytvořte složku pro projekt: sudo mkdir -p <Имя проекта>

  • Poskytujeme uživateli laravel práva k projektu: sudo chown laravel:laravel <Имя проекта>

Dále musíte projekt přenést. Například klonování z Githubu.

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

Stojí za zvážení, že pokud jste neuložili statické soubory (například z /public) na Github, pak je přirozeně mít nebudete. Například jsem vytvořil samostatné vlákno, abych to vyřešil deploy, ze kterého jsem již naklonoval: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instalace závislostí: composer install
  • Vytvořit .env: vim .env

Jeho základní verze vypadá 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>

Pokud zkopírujete soubor .env, nahraďte APP_ENV produkčním, APP_DEBUG false a zadejte správná nastavení pro MySQL.

  • Migrace databáze: php artisan migrate
  • Generování kódu: php artisan key:generate

Změna oprávnění:

  • 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í, co zbývá, je překonfigurovat Nginx pro 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;
    }
}

Jako minule, pokud jste místo toho zvolili verzi 7.3 php7.4-fpm.sock Vepište php7.4-fpm.sock.

Nastavení domény na DigitalOcean

Všechno je vlastně velmi jednoduché. Koupíte si doménu (kdekoli), přepnete na DigitalOcean na Vytvořit->Domény/DNS... V poli Přidejte doménu zadáte tuto doménu a kliknete na přidat. Poté přejděte do nastavení domény a do pole NÁZEV HOSTITELE vstoupit @. Vyberte projekt a klikněte Vytvořte záznam.
Nyní přejděte na stránku, kde jste zakoupili doménu, najděte tam „DNS Servers“ (nebo něco podobného) a zadejte servery DigitalOcean (jmenovitě ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nyní musíte chvíli (nebo hodně) počkat, než budou tato nastavení přijata. Připraveno!
Jediný problém je, že se váš web otevře pouze jako HTTP. Chcete-li mít HTTPS, přejděte k další části.

Nastavení HTTPS

Nainstalujte certbot a předejte mu název domény (formát mysite.ru) a název 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.<Ваш домен>

Nyní musíte překonfigurovat Nginx (nezapomeňte nahradit své 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, co je potřeba změnit pro PHP 7.3.

Zde je ve skutečnosti vše jednoduché. Jednoduše přesměrujeme všechny požadavky z HTTP (port 80) na HTTPS (port 443). A tam vše děláme stejně jako předtím, ale s šifrováním.

Zbývá pouze nastavit oprávnění ve firewallu:

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

Nyní by mělo vše fungovat jak má.

[Pokročilé] Instalace Node.js

Pokud náhle potřebujete spouštět příkazy npm přímo na serveru, musíte nainstalovat Node.js.

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

To je vše, v této fázi jsem přestal. V zásadě jsem s výsledkem spokojen. Snad přejdu z DigitalOcean někam blíž k Rusku a levněji. Ale protože už jsem prošel všemi ověřovacími koly na webu a vše jsem tam udělal, ukázal jsem je na příkladu. Navíc jejich startovních 100 dolarů je výborným odrazovým můstkem pro trénink.

PS Zvláštní poděkování autorovi tato podstata, který sloužil jako podklad pro všechny výše uvedené úkony. V některých případech to nefunguje pro Laravel 7, opravil jsem to.

PPS Pokud jste náhodou špičkový inženýr, který přemýšlí v bashových příkazech, nesuďte prosím přísně. Možná se vám bude zdát tento článek na nízké úrovni, ale když bych ho potřeboval, rád bych ho našel. Pokud existují návrhy na zlepšení, jsem pro.

Zdroj: www.habr.com

Přidat komentář