Deploy i aplikacionit në Laravel 7 në Ubuntu & Nginx

Deploy i aplikacionit në Laravel 7 në Ubuntu & Nginx

Kam vendos për të krijuar portofolin tim në Laravel 7. Të bëj që faqja kryesore të jetë si një landing page, dhe të kem mundësi të ndryshoj të gjithë informacionin përmes panelit të adminit. Nuk është e rëndësishme. Më erdhi në mendje të bëj diamik e zhvillimi. Gjeta disa tutoriale të mira se si ta bëj këtë në një server real me të gjitha detajet e nevojshme. Nuk kam shumë përvojë në implementim, jam më shumë në frontend sesa në full stack. Edhe nëse mund të shkruaj dhe të testoj në PHP, akoma nuk kam arritur të arrij në menaxhimin e serverit. Por duhet të mësoj.

Tani do të kalojmë nëpër të gjithë hapat, duke filluar nga çaktivizimi përmes SSH deri te krijimi i një faqe funksionale. Do përpiqemi të shmangim të gjitha pengesat.

Ndoshta do të mund të gjeni udhëzime të ngjashme në internet. Pas gjitha, edhe unë i kam gjetur. Megjithatë, jo në një vend të vetëm, pa ndihmën e StackOverflow dhe fare duke mos qenë në gjuhën ruse. Kam kaluar një kohe të vështirë. Prandaj vendosa t'ju lehtësoj jetën.

Të gjitha veprimet do t'i bëjmë me një droplet në DigitalOcean. Këtu, sigurisht, nuk është e detyrueshme, mund të zgjidhni çdo host. Kur të arrini në një server funksional në Ubuntu, kthehuni. Për ata që kanë vendosur ta bëjnë këtë në DigitalOcean, do të ketë disa këshilla për konfigurimin e domain-it. Po ashtu, një link referues për 100$.

Të gjitha hapat specifik për DigitalOcean do të jepen në këto nota.

Le të fillojmë.

TL;DR (vetëm komandat kryesore)

Krijoni një përdorues

  • ssh root@[IP-adi i droplet-it tuaj]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Shtojmë SSH për të

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Ngjisim çelësin publik
  • 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/

Konfigurimi bazë:

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

Vetëm konfigurimi HTTP për 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;
    }
}

Konfigurimi HTTPS për 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

Krijoni një droplet në DigitalOcean dhe regjistroni një çelës të ri SSH

Unë sinqerisht besoj se do të arrini të regjistroheni në DigitalOcean. Nuk është e lehtë, me shumë verifikime dhe gjëra të tjera. Nëse keni probleme me verifikimin përmes dokumenteve që shkaktojnë gabime në rrjet, provoni ta bëni gjithçka përmes VPN, duhet të ndihmojë.

Në menunë e sipërme klikoni Create->Droplets. Zgjidhni Ubuntu.

Sak të regjistroheni, do të merrni 100$ në llogari. Por mos u gënjeni. Keni vetëm 60 ditë për t’i shpenzuar. Dhe kjo është shumë pak. Mund të dëshironi të përdorni një plan më të shtrenjtë, që më vonë, kur të filloni të fitoni para reale, të kaloni në një më të lirë. E them menjëherë, nuk do të funksionojë. Mund ta rrisni, por ta ulni nuk mundeni. Këto janë çështjet. Unë zgjedh Standard->$5.

Zgjidh rajonin më të afërt me ne Frankfurt. VPC Network->default-fra1

Do ta bëjmë autentifikimin përmes SSH menjëherë. Klikojmë New SSH Key. Nëse nuk keni SSH, ka një udhëzim shumë të thjeshtë në të djathtën. Hapni terminalin bash, ngjisni ssh-keygen. Më pas hyni në skedarin me çelësin publik /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (ose thjesht cat ~/ .ssh/id_rsa.pub), kopjoni përmbajtjen dhe ngjisni në dritaren përkatëse. Emri është çfarëdo.

Krijoni një emër për droplet-in.

Klikoni Create Droplet

Krijojmë një përdorues të ri

  • ssh root@[IP-adi i droplet-it tuaj]
  • A jeni të sigurt që dëshironi të vazhdoni? (po/jo/[ç'kodo])? yes
  • Shkruani fjalëkalimin tuaj për SSH
  • Krijoni një përdorues laravel: adduser laravel
  • Shkruani fjalëkalimin dhe informacione të tjera (unë shkruaj vetëm Emrin e Plotë)
  • Shtoni përdoruesin në grupin sudo: usermod -aG sudo laravel

SSH për përdoruesin e ri

  • Kaloni te përdoruesi i ri: su laravel

Të gjitha veprimet e tjera, deri në fund të artikullit, do t’i bëjmë nga emri i përdoruesit laravel. Prandaj, nëse keni ndërprerë ndonjëherë, ri-hyni dhe shkruani su laravel

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

Hapëm skedarin në Vim. Nëse nuk jeni njohur me të, mund të punoni në Nano, është vendosja juaj.

Komandat më bazike të Vim

Për t’i përdorur redaktori Vim gjatë artikullit, ju mjafton të dini të paktën sa vijon.

  • Në Vim ka mënyra të ndryshme: moda normale (Normal mode), në të cilën futni komanda dhe zgjidhni mënyrat dhe të tjerat.
  • Për të dalë nga çdo modë dhe për të kaluar në modën normale, mjafton të shtypni Esc
  • Të lëvizni: mund ta bëni thjesht me shigjeta
  • Dilni pa ruajtur <Normal mode>: :q!
  • Dilni dhe ruani <Normal mode>: :wq
  • Kaloni në mënyrën e futjes së tekstit <Normal mode>: i (nga anglishtja insert)
  • Ngjisni çelësin tonë publik (atë që bëjmë më sipër)
  • Mbrojeni nga ndryshimet: chmod 600 ~/.ssh/authorized_keys

Vendosni firewall-in

  • Shikoni të gjitha konfigurimet e disponueshme: sudo ufw app list
  • Lejoni OpenSSH (ndryshe do të na bllokojë): sudo ufw allow OpenSSH
  • Nisni firewall-in: sudo ufw enable, y
  • Po kontrollojmë: sudo ufw status

Status: aktiv

Për                         Veprimi      Nga
--                         ------      ----
OpenSSH                    LEJOHET       Nga Çdo Vend
OpenSSH (v6)               LEJOHET       Nga Çdo Vend (v6)

Të gjitha në rregull.

Vendosni Nginx

Gjatë instalimit, ndonjëherë do t'ju pyesin "Jeni të sigurt?". Pëgjigjuni y (natyrisht, vetëm nëse jeni të sigurt).

  • sudo apt update
  • sudo apt install nginx

Shtoni Nginx në konfigurimet e firewall-it

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

Status: aktiv

Për                         Veprimi      Nga
--                         ------      ----
OpenSSH                    LEJOHET       Nga Çdo Vend
Nginx HTTP                 LEJOHET       Nga Çdo Vend
OpenSSH (v6)               LEJOHET       Nga Çdo Vend (v6)
Nginx HTTP (v6)            LEJOHET       Nga Çdo Vend (v6)

Shkoni te IP juaj. Nëse gjithçka shkon mirë, duhet të shihni këto.

Deploy i aplikacionit në Laravel 7 në Ubuntu & Nginx

Vendosni MySQL

  • sudo apt install mysql-server
  • Nisni skenarin automatizues për mbrojtje sudo mysql_secure_installation

Përgjigjuni pyetjeve të parashtruara. Nëse nuk dini çfarë të përgjigjeni, ja disa versione të rekomanduara:

  • Plugin për verifikimin e fjalëkalimit — N

  • Të hiqni përdoruesit anonim? — Y

  • Të ndaloni hyrjen e root nga larg? — N

  • Të hiqni bazën e testit dhe aksesin në të? — N

  • Të rifreskoni tabelat e privilegjeve tani? — Y

  • Hyni në MySQL: sudo mysql

  • Shikoni metodat e aksesit: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Vendosni fjalëkalimin për root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Shikoni metodat e aksesit përsëri: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Zbatuani ndryshimet dhe dilni nga MySQL: FLUSH PRIVILEGES; dhe exit

  • Tani, për të hyrë në MySQL, duhet të përdorni mysql -u root -p dhe të futni fjalëkalimin

Vendosni PHP

Do të shfrytëzojmë një depo të jashtme nga 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

Tani zgjidhni. Për Laravel 7, mund të zgjidhni PHP 7.3 ose 7.4. Dallimi do të jetë vetëm në numrat 3 dhe 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) punon me kërkesat PHP. mysql, natyrisht, për të punuar me MySQL.

Më pas, unë do të bëj gjithçka në 7.4.

Konfiguro Nginx

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

Në vend të "<Domeni juaj>" shkruani domenin (p.sh., mysite.ru), të cilin dëshironi ta përdorni në të ardhmen. Nëse nuk e keni ende, shkruani çfarëdo, pastaj thjesht përsëritni veprimet në këtë kapitull për domenin tuaj kur ta zgjidhni atë.

Shkruani sa vijon:

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

Nëse keni zgjedhur versionin 7.3 në vend të php7.4-fpm.sock shkruani php7.4-fpm.sock.

Dëgjojmë portin 80 në server_name, kur marrim kërkesë në rrënjë /var/www/html marrim index-failin. Nëse pas server_name shtë ndonjë, kërkojmë një skedar të tillë. Nëse nuk e gjeni, i japim 404. Nëse përfundon me .php, e zgjedhim përmes fpm. Nëse ka .ht, ndalojmë (403).

  • Krijojmë një lidhje nga sites-availablesites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • Heqim lidhjen nga default: sudo unlink /etc/nginx/sites-enabled/default
  • Kontrollojmë për gabime: sudo nginx -t
  • Rifillojmë: sudo systemctl reload nginx

Kontrolloni funksionimin:

  • sudo vim /var/www/html/info.php
  • Shkruani: <?php phpinfo();
  • Shkoni në <IP juaj>/info.php

Duhet të shihni diçka të ngjashme:

Deploy i aplikacionit në Laravel 7 në Ubuntu & Nginx

Tani ky skedar mund të fshihet: sudo rm /var/www/html/info.php

Instaloni 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

  • Hyni në MySQL: mysql -u root -p

  • Krijoni DB me emrin laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Dhuroni aksesin root te laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Krijoni një katalog për projektin: sudo mkdir -p

  • Dhuroni përdoruesit laravel të drejtat mbi projektin: sudo chown laravel:laravel

Më pas duhet të transferoni projektin. Për shembull, me klonimin nga Github.

  • cd ./
  • git clone .

Duhet të merret parasysh se, nëse nuk keni ruajtur skedarët statikë (p.sh., nga /public) në Github, atëherë nuk do t’i keni. Unë, për shembull, për zgjidhjen e kësaj krijova një degë të veçantë deploy, nga e cila e kam klonuar: git clone -b --single-branch ..

  • Instalojmë varësitë: composer install
  • Krijoni .env: vim .env

Versioni bazë i tij duket kështu:

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=

Nëse kopjoni .env tuaj, zëvendësoni APP_ENV me production, APP_DEBUG me false dhe shkruani konfigurimet e sakta për MySQL.

  • Migrimi i DB: php artisan migrate
  • Generimi i kodit: php artisan key:generate

Ndryshimi i lejeve:

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

E fundit që mbetet, është të konfiguroni Nginx për 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;
    }
}

Si herën e kaluar, nëse zgjodhët versionin 7.3 në vend të php7.4-fpm.sock shkruani php7.4-fpm.sock.

Konfigurimi i domain-it në DigitalOcean

Gjithçka është në të vërtetë shumë e thjeshtë. Blini një domain (në çdo vend), kaloni në DigitalOcean në Create->Domains/DNS. Në fushën Shto një domain shkruani këtë domain, klikoni shto. Pastaj kaloni në cilësimet e domain-it dhe në fushën HOSTNAME shkruani @. Zgjidhni projektin dhe klikoni Krijo regjistrimin.
Tani kaloni në faqen ku blinit domain-in, gjeni "Serverat DNS" (ose diçka të ngjashme) dhe shkruani serverat e DigitalOcean (saktësisht ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Tani duhet të prisni pak (ose shumë) derisa këto konfigurime të pranohen. E përfunduar!
Problemi i vetëm është se faqja juaj do të hapet vetëm si HTTP. Për të pasur HTTPS, kaloni në pjesën tjetër.

Konfigurimi i HTTPS

Instaloni certbot dhe jepni atij emrin e domain-it (formatit mysite.ru) dhe emrin e domain-it me 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.

Tani duhet të rikonfigurojmë Nginx (mos harroni të futni vlerat tuaja):

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

Mendoj se tashmë e kuptoni se çfarë duhet të ndryshoni për PHP 7.3.

Këtu, në të vërtetë, gjithçka është e thjeshtë. Thjesht tërë kërkesat nga HTTP (porta 80) i drejtojmë në HTTPS (porta 443). Dhe atje bëjmë gjithçka ashtu si më parë, por tashmë me enkriptim.

Mbështetet lejet në firewall:

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

Tani gjithçka duhet të funksionojë si duhet.

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

Nëse ndonjëherë keni nevojë të ekzekutoni komanda npm drejtpërdrejt në server, duhet të instaloni Node.js.

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

Të gjitha, unë u ndala në këtë hap. Në thelb, rezultati më kënaq. Ndoshta do të kaloj nga DigitalOcean diku më afër Rusisë dhe më të lira. Por pasi që kam kaluar të gjitha rrethinat e verifikimit në faqe dhe kam bërë gjithçka atje, e tregova si shembull. Për më tepër, 100 dollarët e tyre fillestarë janë një platformë e shkëlqyer për stërvitje.

P.S. Faleminderit të veçantë autorit këtu të këtij gisti, i cili shërbeu si baza për të gjitha veprimet e mësipërme. Në disa momente nuk funksionon për Laravel 7, e kam korrigjuar këtë.

P.P.S. Nëse ndonjëherë jeni një inxhinier i shkëlqyer, i cili mendon në grupe bash, ju lutem mos e gjykoni me ashpërsinë. Ndoshta niveli i këtij artikulli do t'ju duket i ulët, por do të isha i lumtur të gjeja një të tillë kur më nevojitej. Nëse ka propozime për përmirësim, jam pro me të dyja duar.

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster