Nasazení aplikace na Laravel 7 na Ubuntu & Nginx

Nasazení aplikace na Laravel 7 na Ubuntu & Nginx

Rozhodl jsem se vytvořit své portfolio na Laravel 7. Hlavní stránka by měla být landing page, kde lze všechny informace měnit pomocí administrace. Není to podstatné. Dospěl jsem k nasazení. Našel jsem několik dobrých tutoriálů, jak to udělat na plnohodnotném serveru se všemi komplikacemi. V oblasti nasazení nemám moc zkušeností, více se orientuji ve front-endu než v fullstacku. A zatímco psát a testovat v PHP ještě zvládnu, s řízením serveru a podobně jsem se ještě nedostal. Ale musel jsem se do toho pustit.

Teď projdeme všemi kroky, od spuštění přes SSH až po funkční web. Pokusíme se obejít všechny nástrahy.

Možná najdete podobné instrukce na internetu. Koneckonců, já jsem je nakonec našel. A to ne na jednom místě, nebylo to bez pomoci StackOverflow a pravděpodobně ne v ruštině. Potrápil jsem se. Proto jsem se rozhodl vám usnadnit život.

Vše budeme dělat s dropletem na DigitalOcean. To samozřejmě není nutné, vyberte si jakýkoli hosting. Až se dostanete k funkčnímu serveru na Ubuntu, vraťte se. Pro ty, kteří se přece jen rozhodli pro DigitalOcean, budou další rady ohledně nastavení domény. A také referral link na 100$.

Všechny specifické kroky pro DigitalOcean budou uvedeny v podobných poznámkách.

Začněme.

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

Vytváříme uživatele

  • ssh root@[IP-adresa vašeho dropletu]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Přidáváme mu SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Vkládáme 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 '';
  • 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 ;

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

    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:ECDHE-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 '';

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

  • 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ý SSH klíč

Upřímně věřím, že si s registrací na DigitalOcean poradíte sami. Není to snadné, je tam spousta ověřování a dalších nesnází. Pokud máte při ověřování pomocí dokumentů neustále chybu s připojením, zkuste to udělat přes VPN, mělo by to pomoci.

V horním menu klikněte na Vytvořit->Droplety. Vyberte Ubuntu.

Jakmile se zaregistrujete, dostanete 100$ na účet. Ale nenechte se mýlit. Máte pouze 60 dní na jejich utracení. To je velmi málo. Můžete, stejně jako já, chtít použít dražší plán, abyste se později, když už přijdou skutečné peníze, přepli na levnější. Hned říkám, to nepůjde. Můžete pouze zvyšovat, snižovat nelze. Tak to je. Volím Standard->$5.

Vyberám region nejblíže k nám Frankfurt. VPC Network->default-fra1

Autentizaci provedeme ihned přes SSH. Klikneme na Nový SSH klíč. Pokud nemáte SSH, napravo je velmi jednoduchý návod. Otevřete bash terminál, vložte ssh-keygen. Poté přejdeme do souboru s veřejným klíčem /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (nebo jednoduše cat ~/.ssh/id_rsa.pub), zkopírujeme obsah a vložíme do okna vlevo. Jméno může být libovolné.

Vymýšlíme pro droplet hostname.

Klikneme Vytvořit Droplet

Vytváříme nového uživatele

  • ssh root@[IP-adresa vašeho dropletu]
  • Jste si jistí, že chcete pokračovat v připojení (ano/ne/[otisk])? ano
  • Zadejte své SSH heslo
  • Vytváříme uživatele laravel: adduser laravel
  • Zadejte heslo a další informace (já zadávám pouze celé jméno)
  • Přidáváme uživatele do skupiny sudo: usermod -aG sudo laravel

SSH pro nového uživatele

  • Přepínáme na nového uživatele: su laravel

Všechny akce dále, až do konce článku, provádíme jménem uživatele laravel. Proto, pokud jste se náhodou přerušili, znovu se přihlaste a zadejte su laravel

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

Otevřeli jsme soubor ve Vimu. Pokud ho vůbec neznáte, můžete pracovat v Naně, je to vaše právo.

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

Abyste mohli v průběhu článku používat editor Vim, stačí znát následující.

  • Vimu existují různé režimy: normální (Normal mode), ve kterém zadáváte příkazy a vybíráte režimy a další.
  • Abyste se dostali z jakéhokoli režimu do normálního režimu, stačí stisknout Esc
  • Pohyb: můžete jednoduše použít šipky
  • Vyjít bez uložení <Normal mode>: :q!
  • Vyjít a uložit <Normal mode>: :wq
  • Přejít do režimu vložení textu <Normal mode>: i (z angličtiny vložit)
  • Vkládáme náš veřejný klíč (který jsme dělali výše)
  • Chceme se chránit před změnami: chmod 600 ~/.ssh/authorized_keys

Nastavujeme firewall

  • Podíváme se na všechna dostupná nastavení: sudo ufw app list
  • Povolujeme OpenSSH (jinak nás zablokuje): sudo ufw allow OpenSSH
  • Spouštíme firewall: sudo ufw enable, y
  • Kontrolujeme: sudo ufw status

Status: aktivní

Do                         Akce      Z    
--                         ------      ----
OpenSSH                    POVOLIT    Kdekoli
OpenSSH (v6)               POVOLIT    Kdekoli (v6)

Všechno v pořádku.

Instalujeme Nginx

Při instalaci se vás někdy bude ptát "Jste si jisti?". Odpovězte y (no jen pokud jste si jisti).

  • sudo apt update
  • sudo apt install nginx

Přidáváme Nginx do nastavení firewallu

  • sudo ufw app list
  • sudo ufw allow 'Nginx HTTP'
  • sudo ufw status

Stav: aktivní

K                          Akce      Z       
--                         ------     ----
OpenSSH                    DOVOLIT    Kdekoli
Nginx HTTP                 DOVOLIT    Kdekoli
OpenSSH (v6)               DOVOLIT    Kdekoli (v6)
Nginx HTTP (v6)            DOVOLIT    Kdekoli (v6)

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

Nasazení aplikace na Laravel 7 na Ubuntu & Nginx

Instalujeme MySQL

  • sudo apt install mysql-server
  • Spouštíme automatický skript na ochranu sudo mysql_secure_installation

Odpovězte na kladené otázky. Pokud nevíte, co odpovědět, zde jsou doporučené varianty:

  • Plugin pro ověření hesla — N

  • Odstranit anonymní uživatele? — Y

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

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

  • Načíst privilegované tabulky nyní? — Y

  • Přihlašujeme se do MySQL: sudo mysql

  • Podíváme se na metody přístupu: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Nastavujeme heslo pro roota: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Podíváme se na metody přístupu znovu: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Použijeme změny a odhlásíme se z MySQL: FLUSH PRIVILEGES; a exit

  • Nyní, abychom se dostali do MySQL, musíme použít mysql -u root -p a zadat heslo

Instalujeme PHP

Využijeme externí repozitář od Ondřej 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í vybíráme. Pro Laravel 7 můžeme zvolit PHP 7.3 nebo 7.4. Rozdíl bude pouze 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 PHP dotazy. MySQL, samozřejmě, pro práci s MySQL.

Dál budu všechno dělat na 7.4.

Nastavujeme Nginx

  • sudo vim /etc/nginx/sites-available/

Místo "<Váš domén>" vložte doménu (například, mysite.ru), kterou chcete používat v budoucnu. Pokud takovou zatím nemáte, napište jakoukoli, pak prostě opakujte krok v této kapitole pro svou doménu, když si ji vyberete.

Zapíšeme následující:

server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name ;

        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 zvolili verzi 7.3 místo php7.4-fpm.sock napište php7.4-fpm.sock.

Posloucháme port 80 na server_name, když přijde dotaz v kořenovém adresáři /var/www/html vezmeme indexový soubor. Pokud po server_name něčem zbývá, hledáme takový soubor. Pokud nenajdeme, vracíme 404. Pokud končí na .php, zbíháme přes fpm. Pokud je .ht, zakážeme (403).

  • Vytváříme odkaz z sites-available v sites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • Odstraňujeme odkaz na default: sudo unlink /etc/nginx/sites-enabled/default
  • Kontrolujeme na chyby: sudo nginx -t
  • Restartujeme: sudo systemctl reload nginx

Kontrolujeme funkčnost:

  • sudo vim /var/www/html/info.php
  • Píšeme: <?php phpinfo();
  • Přejdeme na <Vaše IP>/info.php

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

Nasazení aplikace na Laravel 7 na Ubuntu & Nginx

Nyní je možné tento soubor smazat: sudo rm /var/www/html/info.php

Instalujeme 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

  • Přihlašujeme se do MySQL: mysql -u root -p

  • Vytváříme 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 '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Vytváříme složku pro projekt: sudo mkdir -p

  • Poskytujeme uživateli laravel práva na projekt: sudo chown laravel:laravel

Dále je třeba přenést projekt. Například klonováním z Githubu.

  • cd ./
  • git clone .

Je třeba mít na paměti, že pokud jste nesložili statické soubory (například z /public) na Github, tak je samozřejmě mít nebudete. Já jsem například pro to vytvořil samostatnou větev deploy, ze které jsem už klonoval: git clone -b --single-branch ..

  • Instalujeme závislosti: composer install
  • Vytváříme .env: vim .env

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=

Pokud kopírujete svůj .env, změňte APP_ENV na production, APP_DEBUG na false a zadejte správná nastavení pro MySQL.

  • Migrujeme DB: php artisan migrate
  • Generujeme kód: php artisan key:generate

Měníme 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řenastavit 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 ;

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

Jak už víte, pokud jste zvolili verzi 7.3 místo php7.4-fpm.sock napište php7.4-fpm.sock.

Nastavení domény na DigitalOcean

Všechno je ve skutečnosti velmi jednoduché. Koupíte doménu (kdekoli), přejdete na DigitalOcean do Vytvořit->Domains/DNS. Do pole Přidat doménu zadáte tuto doménu, kliknete na přidat. Poté přejdete do nastavení domény a do pole HOSTNAME zadáte @. Vyberete projekt a kliknete na Vytvořit záznam.
Nyní přejděte na web, kde jste koupili doménu, najděte "DNS servery" (nebo něco podobného) a zadejte servery DigitalOcean (a to konkrétně ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nyní je třeba chvíli (nebo déle) čekat, dokud budou tato nastavení přijata. Hotovo!
Jediný problém je, že se váš web otevře pouze jako HTTP. Aby byl HTTPS, přejdeme k další části.

Nastavujeme HTTPS

Instalujeme certbot a předáváme mu název domény (formátu mysite.ru) a název domény s www (www.mysite.cz).

  • 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í je třeba znovu nastavit Nginx (nezapomeňte použít 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:ECDHE-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ž jste pochopili, co je třeba změnit pro PHP 7.3.

Tady je to vlastně jednoduché. Jen přesměrováváme všechny požadavky z HTTP (port 80) na HTTPS (port 443). A tam děláme vše stejné jako dříve, ale už s šifrováním.

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

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

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

[Дополнительно] Установка Node.js

Pokud byste potřebovali 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

Tak, tady jsem na tomto kroku skončil. V zásadě jsem spokojen s výsledkem. Možná se přestěhuji z DigitalOcean někam blíže k Česku a levněji. Ale protože jsem už prošel celým ověřovacím procesem na webu a vše tam dělal, ukázal jsem to na jejich příkladu. Kromě toho jejich startovacích 100 dolarů je skvělá platforma pro trénink.

P.S. Děkuji zvlášť autorovi tohoto gistu, který posloužil jako základ pro všechny výše uvedené kroky. V některých ohledech nefunguje pro Laravel 7, to jsem opravil.

P.P.S. Pokud jste náhodou špičkový inženýr, který myslí v bashi, prosím, nebuďte příliš přísní. Možná se vám úroveň tohoto článku bude zdát nízká, ale byl bych rád, kdybych takový našel, když jsem ho potřeboval. Pokud máte návrhy na zlepšení, jsem pro.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster