Implementering af en applikation til Laravel 7 på Ubuntu og Nginx

Implementering af en applikation til Laravel 7 på Ubuntu og Nginx

Jeg besluttede at lave min portefølje ved hjælp af Laravel 7. Så hovedsiden ville være en landingsside, og alle oplysningerne på den kunne ændres ved hjælp af admin panelet. Ikke meningen. Det kom til indsættelse. Jeg fandt et par gode tutorials om, hvordan man gør dette på en fuldgyldig server med alle problemerne. Jeg er ikke særlig stærk i implementeringen; jeg er generelt mere foran end fuld stack. Og hvis jeg stadig kan skrive og teste i PHP, før jeg administrerer serveren osv. Jeg er ikke blevet voksen endnu. Men jeg var nødt til at finde ud af det.

Nu vil vi gennemgå alle trinene, startende med lancering via SSH og slutter med arbejdsstedet. Vi vil forsøge at undgå alle faldgruberne.

Du kan muligvis finde lignende instruktioner online. Jeg fandt det jo endelig. Sandt nok, ikke på ét sted, ikke uden hjælp fra StackOverflow, og næppe på russisk. jeg led. Det er derfor, jeg besluttede at forenkle dit liv.

Vi vil gøre alt med en dråbe på DigitalOcean. Dette er selvfølgelig ikke nødvendigt; vælg hvilken som helst hosting. Når du når en fungerende server på Ubuntu, så kom tilbage. For dem, der stadig beslutter sig for at gøre det på DigitalOcean, vil der være flere tips om opsætning af et domæne. Og $100 henvisningslink.

Alle DigitalOcean-specifikke trin vil blive givet i fodnoter som disse.

Lad os begynde.

TL;DR (kun grundlæggende kommandoer)

Opret en bruger

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

Tilføj SSH til det

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Indsæt den offentlige nøgle
  • 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/<Ваш домен>

Grundlæggende opsætning:

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

Kun HTTP-opsætning til 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;
    }
}

HTTPS-indstilling for 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

Opret en dråbe på DigitalOcean og registrer en ny SSH-nøgle

Jeg tror virkelig, at du selv vil finde ud af, hvordan du registrerer dig hos DigitalOcean. Det er ikke nemt, med en masse verifikationer og andre ting. Hvis du konstant får en netværksfejl, når du verificerer ved hjælp af dokumenter, så prøv at gøre alt via en VPN, det burde hjælpe.

Klik på i menuen øverst Opret->dråber. Vælge Ubuntu.

Så snart du tilmelder dig, vil du modtage $100 til din konto. Men lad dig ikke narre. Du har kun 60 dage til at bruge det. Og det er meget lidt. Du vil måske ligesom mig bruge en dyrere plan, så du senere, når de rigtige penge begynder at flyde, kan skifte til en billigere. Jeg fortæller dig med det samme, at det ikke virker. Du kan øge det, men du kan ikke mindske det. Sådan går det. jeg vælger standard->$5.

Jeg vælger den region, der er tættest på os Frankfurt. VPC netværk->default-fra1

Vi vil straks udføre godkendelse via SSH. Klik Ny SSH nøgle. Hvis du ikke har SSH, er der meget enkle instruktioner til højre. Åbn en bash-terminal og indsæt ssh-keygen. Så går vi til filen med den offentlige nøgle /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (eller simpelthen cat ~/.ssh/id_rsa.pub), kopier indholdet og indsæt det i vinduet til venstre. Ethvert navn.

Vi finder på et værtsnavn til dråben.

Klik Opret dråbe

Opret en ny bruger

  • ssh root@[IP-адрес вашего дроплета]
  • Er du sikker på, at du vil fortsætte med at oprette forbindelse (ja/nej/[fingeraftryk])? yes
  • Indtast din SSH-adgangskode
  • Opret en bruger laravel: adduser laravel
  • Indtast din adgangskode og andre oplysninger (jeg indtaster kun fulde navn)
  • Tilføj brugeren til sudo-gruppen: usermod -aG sudo laravel

SSH for ny bruger

  • Skift til den nye bruger: su laravel

Vi udfører alle handlinger videre, indtil slutningen af ​​artiklen, på vegne af laravel-brugeren. Derfor, hvis du pludselig bliver afbrudt, skal du logge ind igen og gå ind su laravel

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

Vi åbnede filen i Vim. Hvis du slet ikke er bekendt med det, kan du arbejde i Nano, din ret.

De mest grundlæggende Vim-kommandoer

For at bruge Vim-editoren i hele artiklen skal du blot vide følgende.

  • Vim har forskellige tilstande: Normal tilstand, hvor du indtaster kommandoer og vælger tilstande og andre.
  • For at forlade en hvilken som helst tilstand og vende tilbage til normal tilstand, skal du blot trykke på Esc
  • Flyt rundt: du kan bare bruge pile
  • Forlad uden at gemme <Normal mode>: :q!
  • Afslut og gem <Normal mode>: :wq
  • Skift til tekstindtastningstilstand <Normal mode>: i (fra engelsk. INSERT)
  • Vi indsætter vores offentlige nøgle (hvilket vi gjorde ovenfor)
  • Vi beskytter mod ændringer: chmod 600 ~/.ssh/authorized_keys

Installation af en firewall

  • Lad os se på alle de tilgængelige indstillinger: sudo ufw app list
  • Tillad OpenSSH (ellers låser det os): sudo ufw allow OpenSSH
  • Lad os starte firewallen: sudo ufw enable, y
  • Vi tjekker: sudo ufw status

Status: active

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

Alt er fint.

Installerer Nginx

Under installationen vil du nogle gange blive spurgt "Er du sikker?" Svar y (nå, kun hvis du er sikker).

  • sudo apt update
  • sudo apt install nginx

Tilføjelse af Nginx til firewall-indstillingerne

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

Gå til din IP. Hvis alt går godt, skal du se følgende.

Implementering af en applikation til Laravel 7 på Ubuntu og Nginx

Installation af MySQL

  • sudo apt install mysql-server
  • Lancering af et automatisk beskyttelsesscript sudo mysql_secure_installation

Besvar de stillede spørgsmål. Hvis du ikke ved, hvad du skal svare, er her nogle foreslåede muligheder:

  • Valider password plugin - N

  • Vil du fjerne anonyme brugere? — Y

  • Vil du ikke tillade root-login eksternt? — N

  • Vil du fjerne testdatabasen og få adgang til den? — N

  • Genindlæse privilegietabeller nu? — Y

  • Lad os gå til MySQL: sudo mysql

  • Lad os se på adgangsmetoderne: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Indstil en adgangskode til root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Lad os se på adgangsmetoderne igen: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Anvend ændringerne og afslut MySQL: FLUSH PRIVILEGES; и exit

  • Nu skal du bruge for at logge på MySQL mysql -u root -p og indtast adgangskoden

Installation af PHP

Lad os bruge et tredjeparts lager fra Ondrej Sury

  • 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

Lad os nu vælge. Til Laravel 7 kan du vælge PHP 7.3 eller 7.4. Den eneste forskel vil være i tallene 3 og 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) fungerer med PHP-anmodninger. mysql, selvfølgelig, for at arbejde med MySQL.

Fra nu af vil jeg gøre alt den 7.4.

Opsætning af Nginx

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

I stedet for "<Dit domæne>" skal du indtaste domænet (f.eks. mysite.ru), som du vil bruge i fremtiden. Hvis du ikke har en endnu, skriv nogen, og gentag bare trinene i dette kapitel for dit domæne, når du vælger det.

Indtaste følgende:

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

Hvis du i stedet valgte version 7.3 php7.4-fpm.sock Skriv ind php7.4-fpm.sock.

Lyt til port 80 på server_namenår vi kommer til root-anmodningen /var/www/html tag indeksfilen. Hvis efter server_name Der er noget, vi leder efter sådan en fil. Hvis vi ikke finder det, smider vi 404. Hvis det ender med .php, løbe igennem fpm... Hvis der er .ht, forbyde (403).

  • At lave et link fra sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Fjerner linket til default: sudo unlink /etc/nginx/sites-enabled/default
  • Kontrollerer for fejl: sudo nginx -t
  • Genstart: sudo systemctl reload nginx

Kontrol af arbejdet:

  • sudo vim /var/www/html/info.php
  • Vi skriver: <?php phpinfo();
  • Lad os gå til <Ваш IP>/info.php

Du burde se noget som dette:

Implementering af en applikation til Laravel 7 på Ubuntu og Nginx

Nu kan denne fil slettes: sudo rm /var/www/html/info.php

Installer 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

  • Lad os gå til MySQL: mysql -u root -p

  • Opret en database med navnet laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Vi giver root-adgang til laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Opret en mappe til projektet: sudo mkdir -p <Имя проекта>

  • Vi giver brugeren laravel rettigheder til projektet: sudo chown laravel:laravel <Имя проекта>

Dernæst skal du overføre projektet. For eksempel kloning fra Github.

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

Det er værd at overveje, at hvis du ikke har gemt statiske filer (for eksempel fra /public) på Github, så vil du naturligvis ikke have dem. For eksempel oprettede jeg en separat tråd for at løse dette deploy, hvorfra jeg allerede har klonet: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Installation af afhængigheder: composer install
  • Opret .env: vim .env

Den grundlæggende version af den ser sådan ud:

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>

Hvis du kopierer din .env, skal du erstatte APP_ENV med produktion, APP_DEBUG med falsk og indtaste de korrekte indstillinger for MySQL.

  • Migrering af databasen: php artisan migrate
  • Generering af koden: php artisan key:generate

Ændring af tilladelser:

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

Den sidste ting tilbage er at omkonfigurere Nginx til 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;
    }
}

Ligesom sidste gang, hvis du i stedet valgte version 7.3 php7.4-fpm.sock Skriv ind php7.4-fpm.sock.

Opsætning af et domæne på DigitalOcean

Alt er faktisk meget enkelt. Du køber et domæne (hvor som helst), skifter til DigitalOcean kl Opret->Domæner/DNS... I marken Tilføj et domæne du indtaster dette domæne og klikker på tilføje. Gå derefter til domæneindstillingerne og til feltet VÆRTSNAVN gå ind @. Vælg et projekt og klik Opret registrering.
Gå nu til siden, hvor du købte domænet, find "DNS Servers" der (eller noget lignende) og indtast DigitalOcean-serverne (nemlig ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nu skal du vente lidt (eller meget), indtil disse indstillinger er accepteret. Parat!
Det eneste problem er, at dit websted kun åbner som HTTP. For at have HTTPS, gå videre til næste del.

Opsætning af HTTPS

Installer certbot og giv den domænenavnet (format mysite.ru) og domænenavn med 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.<Ваш домен>

Nu skal du omkonfigurere Nginx (glem ikke at erstatte dine værdier):

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

Jeg tror, ​​du allerede forstår, hvad der skal ændres for PHP 7.3.

Her er alt faktisk simpelt. Vi omdirigerer simpelthen alle anmodninger fra HTTP (port 80) til HTTPS (port 443). Og der gør vi alt det samme som før, men med kryptering.

Det eneste, der er tilbage, er at indstille tilladelserne i firewallen:

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

Nu skulle alt fungere som det skal.

[Avanceret] Installation af Node.js

Hvis du pludselig skal køre npm-kommandoer direkte på serveren, skal du installere Node.js.

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

Det var det, jeg stoppede på dette tidspunkt. I princippet er jeg tilfreds med resultatet. Måske vil jeg skifte fra DigitalOcean et sted tættere på Rusland og billigere. Men da jeg allerede havde gennemgået alle verifikationsrunderne på siden og gjort alt der, viste jeg dem ved eksempel. Derudover er deres start $100 et glimrende springbræt til træning.

PS Særlig tak til forfatteren denne kerne, som tjente som grundlag for alle ovenstående handlinger. I nogle tilfælde virker det ikke for Laravel 7, jeg fiksede det.

PPS Hvis du tilfældigvis er en topingeniør, der tænker i bash-kommandoer, skal du ikke dømme hårdt. Du synes måske, at denne artikel er på et lavt niveau, men jeg ville have været glad for at finde en, når jeg havde brug for den. Hvis der er forslag til forbedringer, er jeg helt for det.

Kilde: www.habr.com

Tilføj en kommentar