Deployering af en Laravel 7-applikation på Ubuntu & Nginx

Deployering af applikation på Laravel 7 på Ubuntu & Nginx

Jeg besluttede at lave min portefølje på Laravel 7. Hjemmesiden skulle være en landingpage, hvor al information kunne ændres via et adminpanel. Det er ikke vigtigt. Det kom til deployment. Jeg fandt et par gode tutorials til, hvordan man gør det på en fuld server med alle besværlighederne. Jeg er ikke så stærk i deployment, jeg er mere frontend end fullstack. Og hvis jeg kan skrive og teste i PHP, så er jeg stadig ikke nået til serveradministration osv. Men jeg måtte finde ud af det.

Lad os tage et kig på alle trin, fra at starte via SSH til at have et fungerende websted. Vi vil forsøge at undgå alle faldgruber.

Du kan måske finde lignende instruktioner på internettet. For jeg fandt dem trods alt, selvom ikke ét sted, og ikke uden hjælp fra StackOverflow, og næppe på russisk. Jeg kæmpede for det. Derfor besluttede jeg at gøre livet lettere for jer.

Vi vil gøre alt med en droplet på DigitalOcean. Det er selvfølgelig ikke nødvendigt, så vælg hvilken som helst hosting. Når du kommer til en fungerende server på Ubuntu, så kom tilbage. For dem der har besluttet at bruge DigitalOcean, vil der også være råd til domæneopsætning. Derudover en henvisningslink til 100$.

Alle specifikke trin for DigitalOcean vil blive givet i sådan nogle fodnoter.

Lad os begynde.

TL;DR (bare de vigtigste kommandoer)

Opret en bruger

  • ssh root@[IP-adressen på din droplet]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Vi tilføjer hans SSH

  • 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 '';
  • SELECT user, authentication_string, plugin, host FROM mysql.user;
  • FLUSH PRIVILEGES;
  • sigreturn

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/

Basisopsætning:

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

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 ;

    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 opsætning til 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 '';

  • FLUSH PRIVILEGES;

  • sigreturn

  • 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

Opretter en droplet på DigitalOcean og registrerer en ny SSH-nøgle

Jeg tror oprigtigt, at du selv kan finde ud af registreringen på DigitalOcean. Det er ikke nemt, med mange verifikationer og diverse andre ting. Hvis du oplever netværksfejl ved dokumentverificeringen, så prøv at gøre det via VPN, det skulle hjælpe.

I menuen øverst klikker vi på Opret->Droplets. Vi vælger Ubuntu.

Når du er registreret, får du 100$ på kontoen. Men lad dig ikke narre. Du har kun 60 dage til at bruge dem. Det er meget lidt. Du kan, ligesom jeg, overveje at bruge en dyrere plan, så du senere kan skifte til en billigere, når pengene begynder at komme ind. Jeg siger det med det samme, det er ikke muligt. Du kan kun opgradere, ikke nedgradere. Sådan er det. Jeg vælger Standard->$5.

Jeg vælger den nærmeste region Frankfurt. VPC Network->default-fra1

Lad os straks gøre autentificeringen via SSH. Klik på New SSH Key. Hvis du ikke har SSH, er der en meget simpel vejledning til højre. Åbn bash-terminalen, indsæt ssh-keygen. Gå derefter ind i filen med den offentlige nøgle /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (eller blot cat ~\/ .ssh\/id_rsa.pub), kopier indholdet og indsæt det i vinduet til venstre. Navnet kan være hvad som helst.

Find på et værtsnavn til droplet'en.

Klik på Create Droplet

Opret en ny bruger

  • ssh root@[IP-adressen på din droplet]
  • Er du sikker på, at du vil fortsætte med at oprette forbindelse (yes/no/[fingerprint])? yes
  • Indtast dit SSH-password
  • Opret en bruger laravel: adduser laravel
  • Indtast password og andre oplysninger (jeg indtaster kun Fulde navn)
  • Tilføj brugeren til sudo-gruppen: usermod -aG sudo laravel

SSH til den nye bruger

  • Skift til den nye bruger: su laravel

Alle handlinger fra nu af, indtil slutningen af artiklen, udføres som brugeren laravel. Så hvis du pludselig blev afbrudt, skal du logge ind igen og indtaste su laravel

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

Vi har åbnet filen i Vim. Hvis du ikke kender det overhovedet, kan du arbejde i Nano, det er dit valg.

De mest grundlæggende Vim-kommandoer

For at kunne bruge Vim-editoren under artiklen, behøver du blot at vide følgende.

  • I Vim er der forskellige tilstande: normal (Normal mode), hvor du indtaster kommandoer og vælger andre tilstande.
  • For at gå ud af enhver tilstand og komme ind i normal tilstand skal du blot trykke Esc
  • Bevægelse: du kan blot bruge piletasterne
  • Gå ud uden at gemme <Normal mode>: :q!
  • Gå ud og gem <Normal mode>: :wq
  • Skift til tekstindgangstilstand <Normal mode>: i (fra engelsk. insert)
  • Indsæt vores offentlige nøgle (den vi lavede tidligere)
  • Beskyt mod ændringer: chmod 600 ~/.ssh/authorized_keys

Installer firewall

  • Se alle tilgængelige indstillinger: sudo ufw app list
  • Tillad OpenSSH (ellers bliver vi låst ude): sudo ufw allow OpenSSH
  • Start firewallen: sudo ufw enable, y
  • Vi tjekker: sudo ufw status

Status: aktiv

Til                         Handling     Fra
--                         ------      ----
OpenSSH                    TILLAD      Overalt
OpenSSH (v6)               TILLAD      Overalt (v6)

Alt er i orden.

Installer Nginx

Når du installerer, vil det nogle gange spørge 'Er du sikker?'. Svar y (kun hvis du er sikker).

  • sudo apt update
  • sudo apt install nginx

Tilføj Nginx til firewallindstillingerne

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

Status: aktiv

Til                         Handling      Fra
--                         ------      ----
OpenSSH                    TILLAD       Overalt
Nginx HTTP                 TILLAD       Overalt
OpenSSH (v6)               TILLAD       Overalt (v6)
Nginx HTTP (v6)            TILLAD       Overalt (v6)

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

Deployering af applikation på Laravel 7 på Ubuntu & Nginx

Installerer MySQL

  • sudo apt install mysql-server
  • Starter det automatiske beskyttelsesscript sudo mysql_secure_installation

Svar på de stillede spørgsmål. Hvis du ikke ved, hvad du skal svare, her er nogle anbefalede muligheder:

  • Validér password-plugin — N

  • Fjerne anonyme brugere? — Y

  • Forbyde root-login eksternt? — N

  • Fjerne testdatabase og adgang til den? — N

  • Genindlæse privilegietabeller nu? — Y

  • Log ind i MySQL: sudo mysql

  • Tjekker adgangsmetoder: SELECT user, authentication_string, plugin, host FROM mysql.user;

  • Sætter password for root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Tjekker adgangsmetoder igen: SELECT user, authentication_string, plugin, host FROM mysql.user;

  • Anvender ændringerne og logger ud af MySQL: FLUSH PRIVILEGES; og sigreturn

  • Nu skal du bruge mysql -u root -p og indtaste password

Installerer PHP

Vi bruger et eksternt repository fra 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

Nu vælger vi. For Laravel 7 kan du vælge PHP 7.3 eller 7.4. Forskellen vil kun 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) arbejder med PHP-anmodninger. mysql, naturligvis, til arbejde med MySQL.

Fremover vil jeg gøre alt på 7.4.

Konfigurerer Nginx

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

I stedet for "" skal du indtaste dit domæne (f.eks., mysite.ru), som du ønsker at bruge i fremtiden. Hvis du ikke har et endnu, så skriv et hvilket som helst, og gentag derefter handlingerne i dette kapitel for dit domæne, når du vælger det.

Indtast følgende:

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

Hvis du valgte version 7.3 i stedet for php7.4-fpm.sock indtast php7.4-fpm.sock.

Lytter på port 80 på server_name, når vi modtager anmodning i roden /var/www/html tager vi index-filen. Hvis der er noget efter server_name , søger vi efter en sådan fil. Finder vi ikke, smider vi 404. Hvis det ender på .php, sender vi det gennem fpm. Hvis der er .ht, forbyder (403).

  • Laver et link fra sites-available i sites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • Fjerner linket til default: sudo unlink /etc/nginx/sites-enabled/default
  • Tjekker for fejl: sudo nginx -t
  • Genstarter: sudo systemctl reload nginx

Tjekker funktionalitet:

  • sudo vim /var/www/html/info.php
  • Skriv: <?php phpinfo();
  • Gå til /info.php

Du skal se noget som dette:

Deployering af applikation på Laravel 7 på Ubuntu & Nginx

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

Installerer 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

  • Log ind i MySQL: mysql -u root -p

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

  • Giver root adgang til laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • sigreturn

  • cd /var/www/html

  • Opretter en mappe til projektet: sudo mkdir -p

  • Giver brugeren laravel rettigheder til projektet: sudo chown laravel:laravel

Derefter skal projektet overføres. For eksempel ved at klone fra Github.

  • cd ./
  • git clone .

Det er vigtigt at huske, at hvis du ikke har gemt statiske filer (f.eks. fra /public) på Github, så har du dem naturligvis ikke. Jeg, for eksempel, har oprettet en separat gren deploy, som jeg allerede har klonet fra: git clone -b --single-branch ..

  • Installer afhængigheder: composer install
  • Opret .env: vim .env

Den grundlæggende version 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=

Hvis du kopierer din .env, skal du ændre APP_ENV til production, APP_DEBUG til false og indtaste de korrekte indstillinger for MySQL.

  • Migrerer DB: php artisan migrate
  • Genererer kode: php artisan key:generate

Ændrer 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

Det sidste, der er 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 ;

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

Som sidst, hvis du valgte version 7.3 i stedet for php7.4-fpm.sock indtast php7.4-fpm.sock.

Domæneindstilling på DigitalOcean

Det er faktisk meget enkelt. Du køber et domæne (hvor som helst), går til DigitalOcean i Opret->Domains/DNS. I feltet Tilføj et domæne indtaster du dette domæne, trykker på tilføj. Gå derefter til domæneindstillingerne og i feltet HOSTNAME indtaster du @. Vælg projektet og klik på Opret post.
Gå nu til den hjemmeside, hvor du købte domænet, find "DNS-servere" (eller noget lignende) og indtast DigitalOcean-serverne (nemlig ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nu skal vi vente lidt (eller meget), indtil disse indstillinger bliver accepteret. Færdig!
Det eneste problem er, at din hjemmeside kun vil åbne som HTTP. For at få HTTPS skal vi gå til næste del.

Indstiller HTTPS

Installerer certbot og giver det domænenavnet (i formatet mysite.ru) og domænenavnet 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 Nginx omkonfigureres (glem ikke at indsætte 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 har forstået, hvad der skal ændres for PHP 7.3.

Her er faktisk alt meget simpelt. Vi omdirigerer bare 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 er nu tid til at sætte tilladelser i firewallen:

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

Nu skal alt fungere som det skal.

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

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

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

Det er det, jeg stopper ved dette trin. Grundlæggende er jeg tilfreds med resultatet. Måske vil jeg flytte fra DigitalOcean til et sted tættere på Rusland og billigere. Men da jeg allerede har gennemgået alle verificeringsprocesser på deres websted og har gjort alt der, viste jeg det som et eksempel. Deres startpakke på 100 dollars – er en fremragende platform til træning.

P.S. En særlig tak til forfatteren af denne gist, som var grundlaget for alle ovenstående handlinger. Den fungerer ikke i nogle tilfælde for Laravel 7, jeg har rettet det.

P.P.S. Hvis du tilfældigvis er en topingeniør, der tænker i bash-kommandoer, så døm venligst ikke for hårdt. Måske virker niveauet af denne artikel for lavt for dig, men jeg ville være glad for at finde noget sådant, når jeg havde brug for det. Hvis der er forslag til forbedringer, er jeg helt åben for det.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster