Uvajanje aplikacije v Laravel 7 na Ubuntu in Nginx

Uvajanje aplikacije v Laravel 7 na Ubuntu in Nginx

Odločil sem se, da bom svoj portfelj naredil z uporabo Laravel 7. Tako da bo glavna stran ciljna stran, vse informacije na njej pa bo mogoče spreminjati z uporabo skrbniške plošče. Ni bistvo. Prišlo je do uvajanja. Našel sem nekaj dobrih vadnic o tem, kako to narediti na polnopravnem strežniku z vsemi težavami. Nisem zelo močan pri uvajanju; na splošno sem bolj spredaj kot poln sklad. In, če še lahko pišem in testiram v PHP, potem pred upravljanjem strežnika itd. Nisem še odrasel. Ampak moral sem ugotoviti.

Zdaj bomo šli skozi vse korake, začenši z zagonom prek SSH in konča z delovnim mestom. Vsem pastem se bomo poskušali izogniti.

Morda boste lahko našli podobna navodila na spletu. Konec koncev sem ga končno našel. Res je, ne na enem mestu, ne brez pomoči StackOverflow in komaj v ruščini. trpel sem. Zato sem se odločil, da vam poenostavim življenje.

Na DigitalOceanu bomo naredili vse s kapljico. To seveda ni potrebno, izberite poljubno gostovanje. Ko dosežete delujoč strežnik na Ubuntuju, se vrnite. Za tiste, ki se vseeno odločite za to na DigitalOceanu, bo na voljo več nasvetov o vzpostavitvi domene. in $100 referenčna povezava.

Vsi koraki, specifični za DigitalOcean, bodo navedeni v opombah, kot je ta.

Začnimo.

TL;DR (samo osnovni ukazi)

Ustvarite uporabnika

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

Dodajte mu SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Vstavite javni ključ
  • chmod 600 ~/.ssh/authorized_keys

Požarni zid

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

Osnovna nastavitev:

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

Nastavitev HTTPS 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

Ustvarite kapljico na DigitalOcean in registrirajte nov ključ SSH

Resnično verjamem, da boste sami ugotovili, kako se registrirati pri DigitalOcean. Ni enostavno, z veliko preverjanji in drugimi stvarmi. Če se pri preverjanju z uporabo dokumentov nenehno pojavlja napaka omrežja, poskusite vse narediti prek VPN-ja, moralo bi pomagati.

V meniju na vrhu kliknite ustvarjanje->Kapljice. Izberite Ubuntu.

Takoj ko se registrirate, boste na svoj račun prejeli 100 $. Ampak ne pusti se zavesti. Za porabo imate samo 60 dni. In to je zelo malo. Morda boste, tako kot jaz, želeli uporabiti dražji načrt, da boste kasneje, ko začne pritekati pravi denar, prešli na cenejšega. Takoj vam povem, da ne bo šlo. Lahko ga povečate, ne morete pa ga zmanjšati. Tako gre. izberem Standardna->$5.

Izberem nam najbližjo regijo Frankfurt. Omrežje VPC->privzeto-fra1

Takoj bomo izvedli avtentikacijo preko SSH. Kliknite Nov ključ SSH. Če nimate SSH, so na desni zelo preprosta navodila. Odprite bash terminal in prilepite ssh-keygen. Nato gremo do datoteke z javnim ključem /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (ali preprosto cat ~/.ssh/id_rsa.pub), kopirajte vsebino in jo prilepite v okno na levi. Vsako ime.

Izmislimo ime gostitelja za kapljico.

Potisnite Ustvarite Droplet

Ustvarite novega uporabnika

  • ssh root@[IP-адрес вашего дроплета]
  • Ali ste prepričani, da želite nadaljevati povezovanje (da/ne/[prstni odtis])? yes
  • Vnesite svoje geslo za SSH
  • Ustvarite uporabnika laravel: adduser laravel
  • Vnesite svoje geslo in druge podatke (vnesem samo polno ime)
  • Dodajte uporabnika v skupino sudo: usermod -aG sudo laravel

SSH za novega uporabnika

  • Preklopite na novega uporabnika: su laravel

Vsa dejanja naprej, do konca članka, izvajamo v imenu uporabnika laravel. Če vas torej nenadoma prekinejo, se znova prijavite in vstopite su laravel

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

Datoteko smo odprli v Vimu. Če tega sploh ne poznate, lahko delate v Nanu, vaša pravica.

Najosnovnejši ukazi Vim

Če želite uporabljati urejevalnik Vim v celotnem članku, morate vedeti le naslednje.

  • Vim ima različne načine: običajni način, v katerem vnašate ukaze in izbirate načine ter druge.
  • Za izhod iz katerega koli načina in vrnitev v običajni način samo pritisnite Esc
  • Premikajte se: lahko uporabite samo puščice
  • Izhod brez shranjevanja <Normal mode>: :q!
  • Izhod in shranjevanje <Normal mode>: :wq
  • Preklopite v način vnosa besedila <Normal mode>: i (iz angleščine. vstavite)
  • Vstavimo svoj javni ključ (kar smo storili zgoraj)
  • Varujemo pred spremembami: chmod 600 ~/.ssh/authorized_keys

Namestitev požarnega zidu

  • Poglejmo vse nastavitve, ki so na voljo: sudo ufw app list
  • Dovoli OpenSSH (sicer nas bo zaklenil): sudo ufw allow OpenSSH
  • Zaženimo požarni zid: sudo ufw enable, y
  • Preverjamo: sudo ufw status

Status: active

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

Vse je vredu.

Namestitev Nginx

Med namestitvijo boste včasih vprašani "Ali ste prepričani?" Odgovori y (no, samo če ste prepričani).

  • sudo apt update
  • sudo apt install nginx

Dodajanje Nginxa v nastavitve požarnega zidu

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

Pojdite na svoj IP. Če gre vse v redu, bi morali videti naslednje.

Uvajanje aplikacije v Laravel 7 na Ubuntu in Nginx

Namestitev MySQL

  • sudo apt install mysql-server
  • Zagon samodejnega zaščitnega skripta sudo mysql_secure_installation

Odgovorite na zastavljena vprašanja. Če ne veste, kaj bi odgovorili, je tukaj nekaj predlaganih možnosti:

  • Vtičnik za preverjanje gesla - N

  • Ali želite odstraniti anonimne uporabnike? — Y

  • Onemogočiti root prijavo na daljavo? — N

  • Odstraniti preizkusno bazo podatkov in dostop do nje? — N

  • Zdaj znova naložiti tabele privilegijev? — Y

  • Pojdimo na MySQL: sudo mysql

  • Oglejmo si načine dostopa: SELECT user,authentication_string,plugin,host FROM mysql.user;

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

  • Ponovno si oglejmo metode dostopa: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Uporabite spremembe in zapustite MySQL: FLUSH PRIVILEGES; и exit

  • Za prijavo v MySQL morate uporabiti mysql -u root -p in vnesite geslo

Namestitev PHP

Uporabimo repozitorij tretje osebe 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

Zdaj pa izberimo. Za Laravel 7 lahko izberete PHP 7.3 ali 7.4. Edina razlika bo v številkah 3 in 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) deluje z zahtevami PHP. mysql seveda za delo z MySQL.

Od zdaj naprej bom vse delal 7.4.

Nastavitev Nginx

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

Namesto "<Vaša domena>" vnesite domeno (npr. mysite.ru), ki jih želite uporabiti v prihodnosti. Če je še nimate, napišite katero koli, nato pa preprosto ponovite korake v tem poglavju za svojo domeno, ko jo izberete.

Vnesite naslednje:

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

Če namesto tega izberete različico 7.3 php7.4-fpm.sock piši v php7.4-fpm.sock.

Poslušajte vrata 80 server_nameko pridemo do korenske zahteve /var/www/html vzemite indeksno datoteko. Če po server_name Nekaj ​​je, iščemo takšno datoteko. Če ga ne najdemo, zavržemo 404. Če se konča z .php, teče skozi fpm... Če obstaja .ht, prepovedati (403).

  • Ustvarjanje povezave iz sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Odstranjevanje povezave do default: sudo unlink /etc/nginx/sites-enabled/default
  • Preverjanje napak: sudo nginx -t
  • Ponovni zagon: sudo systemctl reload nginx

Preverjanje dela:

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

Videti bi morali nekaj takega:

Uvajanje aplikacije v Laravel 7 na Ubuntu in Nginx

Zdaj lahko to datoteko izbrišete: sudo rm /var/www/html/info.php

Namestite 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

  • Pojdimo na MySQL: mysql -u root -p

  • Ustvari bazo podatkov z imenom laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Ustvarite mapo za projekt: sudo mkdir -p <Имя проекта>

  • Uporabniku zagotavljamo laravel pravice do projekta: sudo chown laravel:laravel <Имя проекта>

Nato morate prenesti projekt. Na primer kloniranje iz Githuba.

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

Upoštevati je treba, da če niste shranili statičnih datotek (na primer iz /public) na Githubu, potem jih seveda ne boste imeli. Na primer, ustvaril sem ločeno nit za rešitev tega deploy, iz katerega sem že kloniral: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Namestitev odvisnosti: composer install
  • Ustvari .env: vim .env

Osnovna različica je videti takole:

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>

Če kopirate svoj .env, zamenjajte APP_ENV s production, APP_DEBUG z false in vnesite pravilne nastavitve za MySQL.

  • Selitev baze podatkov: php artisan migrate
  • Ustvarjanje kode: php artisan key:generate

Spreminjanje dovoljenj:

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

Zadnja stvar, ki preostane, je, da ponovno konfigurirate 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;
    }
}

Kot zadnjič, če bi namesto tega izbrali različico 7.3 php7.4-fpm.sock piši v php7.4-fpm.sock.

Nastavitev domene na DigitalOcean

Vse je pravzaprav zelo preprosto. Kupite domeno (kjerkoli), preklopite na DigitalOcean na ustvarjanje->Domene/DNS... Na terenu Dodajte domeno vnesete to domeno in kliknete dodaj. Nato pojdite na nastavitve domene in na polje IME gostitelja vstopiti @. Izberite projekt in kliknite Ustvari zapis.
Zdaj pojdite na spletno mesto, kjer ste kupili domeno, tam poiščite »DNS strežniki« (ali kaj podobnega) in vnesite strežnike DigitalOcean (in sicer ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Zdaj morate počakati malo (ali veliko), dokler te nastavitve niso sprejete. pripravljena!
Edina težava je, da se bo vaše spletno mesto odprlo samo kot HTTP. Če želite imeti HTTPS, pojdite na naslednji del.

Nastavitev HTTPS

Namestite certbot in mu posredujte ime domene (format mysite.ru) in ime domene z 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.<Ваш домен>

Zdaj morate znova konfigurirati Nginx (ne pozabite zamenjati svojih vrednosti):

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 že razumete, kaj je treba spremeniti za PHP 7.3.

Tukaj je pravzaprav vse preprosto. Vse zahteve preprosto preusmerimo s HTTP (vrata 80) na HTTPS (vrata 443). In tam naredimo vse enako kot prej, vendar s šifriranjem.

Vse kar ostane je, da nastavimo dovoljenja v požarnem zidu:

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

Zdaj bi moralo vse delovati kot mora.

[Napredno] Namestitev Node.js

Če morate nenadoma zagnati ukaze npm neposredno na strežniku, morate namestiti Node.js.

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

To je to, na tej stopnji sem se ustavil. Načeloma sem z rezultatom zadovoljen. Mogoče bom zamenjal DigitalOcean nekje bližje Rusiji in ceneje. Ker pa sem že šel skozi vse kroge preverjanja na spletnem mestu in naredil vse tam, sem jim pokazal s primerom. Poleg tega je njihovih začetnih 100 $ odlična odskočna deska za trening.

PS Posebna zahvala avtorju to bistvo, ki je služil kot osnova za vsa zgoraj navedena dejanja. V nekaterih primerih ne deluje za Laravel 7, to sem popravil.

PPS Če ste vrhunski inženir, ki razmišlja z ukazi bash, vas prosimo, da ne obsojate strogo. Morda se vam zdi ta članek na nizki ravni, vendar bi bil vesel, če bi ga našel, ko bi ga potreboval. Če obstajajo predlogi za izboljšave, sem za.

Vir: www.habr.com

Dodaj komentar