Distribuere en applikasjon til Laravel 7 på Ubuntu og Nginx

Distribuere en applikasjon til Laravel 7 på Ubuntu og Nginx

Jeg bestemte meg for å lage porteføljen min ved å bruke Laravel 7. Slik at hovedsiden skulle være en landingsside, og all informasjon på den kunne endres ved hjelp av admin-panelet. Ikke poenget. Det kom til utplassering. Jeg fant et par gode veiledninger om hvordan du gjør dette på en fullverdig server med alle problemene. Jeg er ikke veldig sterk i utplasseringen; jeg er generelt mer foran enn full stack. Og hvis jeg fortsatt kan skrive og teste i PHP, så før jeg administrerer serveren osv. Jeg har ikke blitt voksen ennå. Men jeg måtte finne ut av det.

Nå skal vi gå gjennom alle trinnene, starter med lansering via SSH og slutter med arbeidssiden. Vi vil prøve å unngå alle fallgruvene.

Du kan kanskje finne lignende instruksjoner på nettet. Tross alt fant jeg den til slutt. Riktignok ikke på ett sted, ikke uten hjelp fra StackOverflow, og knapt på russisk. Jeg led. Det er derfor jeg bestemte meg for å forenkle livet ditt.

Vi vil gjøre alt med en dråpe på DigitalOcean. Dette er selvfølgelig ikke nødvendig; velg hvilken som helst hosting. Når du kommer til en fungerende server på Ubuntu, kom tilbake. For de som fortsatt bestemmer seg for å gjøre det på DigitalOcean, vil det være flere tips om å sette opp et domene. Og $100 henvisningslenke.

Все специфические для DigitalOcean шаги будут даны в подобных сносках.

La oss komme i gang.

TL;DR (kun grunnleggende kommandoer)

Opprett en bruker

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

Legg til SSH til den

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Sett inn den offentlige nøkkelen
  • chmod 600 ~/.ssh/authorized_keys

Brannmur

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

Grunnleggende oppsett:

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

Bare HTTP-oppsett for 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-innstilling 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

Opprett en dråpe på DigitalOcean og registrer en ny SSH-nøkkel

Jeg tror virkelig at du vil finne ut hvordan du registrerer deg hos DigitalOcean selv. Det er ikke lett, med mye verifikasjoner og andre ting. Hvis du stadig får en nettverksfeil når du verifiserer ved bruk av dokumenter, prøv å gjøre alt gjennom en VPN, det burde hjelpe.

Klikk på i menyen øverst Opprett->dråper. Velge Ubuntu.

Så snart du registrerer deg, vil du motta $100 til kontoen din. Men ikke la deg lure. Du har bare 60 dager på deg. Og dette er veldig lite. Du vil kanskje, som meg, bruke en dyrere plan, slik at du senere, når de ekte pengene begynner å strømme, kan bytte til en billigere. Jeg skal fortelle deg med en gang at det ikke vil fungere. Du kan øke den, men du kan ikke redusere den. Så det går. jeg velger standard->$5.

Jeg velger regionen nærmest oss Frankfurt. VPC-nettverk->default-fra1

Vi vil umiddelbart utføre autentisering via SSH. Klikk Ny SSH-nøkkel. Hvis du ikke har SSH, er det veldig enkle instruksjoner til høyre. Åpne en bash-terminal og lim inn ssh-keygen. Så går vi til filen med den offentlige nøkkelen /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (eller rett og slett cat ~/.ssh/id_rsa.pub), kopier innholdet og lim det inn i vinduet til venstre. Hvilket som helst navn.

Vi kommer opp med et vertsnavn for dråpen.

Klikk her Lag dråpe

Opprett en ny bruker

  • ssh root@[IP-адрес вашего дроплета]
  • Er du sikker på at du vil fortsette å koble til (ja/nei/[fingeravtrykk])? yes
  • Skriv inn SSH-passordet ditt
  • Opprett en bruker laravel: adduser laravel
  • Skriv inn passordet ditt og annen informasjon (jeg skriver bare inn fullt navn)
  • Legg brukeren til sudo-gruppen: usermod -aG sudo laravel

SSH for ny bruker

  • Bytt til den nye brukeren: su laravel

Vi utfører alle handlinger videre, til slutten av artikkelen, på vegne av laravel-brukeren. Derfor, hvis du plutselig blir avbrutt, logg inn på nytt og gå inn su laravel

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

Vi åpnet filen i Vim. Hvis du ikke er kjent med det i det hele tatt, kan du jobbe i Nano, din rett.

De mest grunnleggende Vim-kommandoene

For å bruke Vim-editoren gjennom hele artikkelen, trenger du bare å vite følgende.

  • Vim har forskjellige moduser: Normal modus, der du legger inn kommandoer og velger moduser og andre.
  • For å gå ut av en hvilken som helst modus og gå tilbake til normal modus, trykk bare på Esc
  • Beveg deg rundt: du kan bare bruke piler
  • Avslutt uten å lagre <Normal mode>: :q!
  • Avslutt og lagre <Normal mode>: :wq
  • Bytt til tekstinntastingsmodus <Normal mode>: i (fra engelsk. Sett)
  • Vi setter inn vår offentlige nøkkel (som vi gjorde ovenfor)
  • Vi beskytter mot endringer: chmod 600 ~/.ssh/authorized_keys

Installere en brannmur

  • La oss se på alle tilgjengelige innstillinger: sudo ufw app list
  • Tillat OpenSSH (ellers låser den oss): sudo ufw allow OpenSSH
  • La oss starte brannmuren: sudo ufw enable, y
  • Vi sjekker: sudo ufw status

Status: active

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

Alt er bra.

Installerer Nginx

Under installasjonen vil du noen ganger bli spurt "Er du sikker?" Svar y (vel, bare hvis du er sikker).

  • sudo apt update
  • sudo apt install nginx

Legger til Nginx i brannmurinnstillingene

  • 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 IP-en din. Hvis alt går bra, bør du se følgende.

Distribuere en applikasjon til Laravel 7 på Ubuntu og Nginx

Installerer MySQL

  • sudo apt install mysql-server
  • Lansering av et automatisk beskyttelsesskript sudo mysql_secure_installation

Svar på spørsmålene som stilles. Hvis du ikke vet hva du skal svare, her er noen foreslåtte alternativer:

  • Valider passord-plugin - N

  • Vil du fjerne anonyme brukere? — Y

  • Vil du ikke tillate root-pålogging eksternt? — N

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

  • Laste inn rettighetstabeller på nytt nå? — Y

  • La oss gå til MySQL: sudo mysql

  • La oss se på tilgangsmetodene: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Устанавливаем пароль для root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • La oss se på tilgangsmetodene igjen: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Bruk endringene og avslutt MySQL: FLUSH PRIVILEGES; и exit

  • Nå, for å logge på MySQL må du bruke mysql -u root -p и вводить пароль

Installerer PHP

La oss bruke et tredjepartsdepot 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

La oss nå velge. For Laravel 7 kan du velge PHP 7.3 eller 7.4. Den eneste forskjellen 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-forespørsler. mysql, selvfølgelig, for å jobbe med MySQL.

Fra nå av vil jeg gjøre alt på 7.4.

Sette opp Nginx

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

Вместо "<Ваш домен>" впишите домен (например, mysite.ru) som du vil bruke i fremtiden. Hvis du ikke har en ennå, skriv noen, så bare gjenta trinnene i dette kapittelet for ditt domene når du velger det.

Skriv inn 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 velger versjon 7.3 i stedet php7.4-fpm.sock skrive inn php7.4-fpm.sock.

Lytt til port 80 på server_namenår vi kommer til rotforespørselen /var/www/html берем index-файл. Если после server_name Det er noe, vi ser etter en slik fil. Hvis vi ikke finner det, kaster vi ut 404. Hvis det ender med .php, kjøre gjennom fpm... Hvis det er det .ht, forby (403).

  • Lage en lenke fra sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Fjerner lenken til default: sudo unlink /etc/nginx/sites-enabled/default
  • Se etter feil: sudo nginx -t
  • Start på nytt: sudo systemctl reload nginx

Sjekker arbeidet:

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

Du bør se noe slikt:

Distribuere en applikasjon til Laravel 7 på Ubuntu og Nginx

Nå kan denne filen 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

  • La oss gå til MySQL: mysql -u root -p

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

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Opprett en mappe for prosjektet: sudo mkdir -p <Имя проекта>

  • Vi gir brukeren laravel rettigheter til prosjektet: sudo chown laravel:laravel <Имя проекта>

Deretter må du overføre prosjektet. For eksempel kloning fra Github.

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

Det er verdt å vurdere at hvis du ikke lagret statiske filer (for eksempel fra /public) на Github, то их у вас, естественно, не будет. Я, например, для решения этого создал отдельную ветку deploy, som jeg allerede klonet fra: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Installere avhengigheter: composer install
  • Opprett .env: vim .env

Grunnversjonen av den ser slik ut:

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 .env, erstatt APP_ENV med produksjon, APP_DEBUG med false og angi de riktige innstillingene for MySQL.

  • Migrering av databasen: php artisan migrate
  • Generer koden: php artisan key:generate

Endre tillatelser:

  • 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 siste som gjenstår er å rekonfigurere Nginx for 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;
    }
}

Som forrige gang, hvis du valgte versjon 7.3 i stedet php7.4-fpm.sock skrive inn php7.4-fpm.sock.

Sette opp et domene på DigitalOcean

Alt er faktisk veldig enkelt. Du kjøper et domene (hvor som helst), bytter til DigitalOcean på Opprett->Domener/DNS... I feltet Legg til et domene du går inn på dette domenet og klikker på legg til. Gå deretter til domeneinnstillingene og til feltet VERTNAMN Tast inn @. Velg et prosjekt og klikk Opprett post.
Gå nå til siden der du kjøpte domenet, finn "DNS Servers" der (eller noe lignende) og skriv inn DigitalOcean-serverne (nemlig ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nå må du vente litt (eller mye) til disse innstillingene er akseptert. Klar!
Единственная проблема – у вас сайт будет открываться только как HTTP. Чтобы был HTTPS, переходим к следующей части.

Sette opp HTTPS

Installer certbot og gi den domenenavnet (format mysite.ru) og domenenavn 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.<Ваш домен>

Теперь надо перенастроить Nginx (не забудьте подставить свои значения):

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 hva som må endres for PHP 7.3.

Her er faktisk alt enkelt. Vi omdirigerer ganske enkelt alle forespørsler fra HTTP (port 80) til HTTPS (port 443). Og der gjør vi alt det samme som før, men med kryptering.

Alt som gjenstår er å angi tillatelsene i brannmuren:

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

Nå skal alt fungere som det skal.

[Avansert] Installere Node.js

Если вдруг вам понадобилось запускать npm-команды прямо на сервере, вам нужно установить Node.js.

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

Det var det, jeg stoppet på dette stadiet. I prinsippet er jeg fornøyd med resultatet. Kanskje jeg vil bytte fra DigitalOcean et sted nærmere Russland og billigere. Men siden jeg allerede hadde gått gjennom alle verifikasjonsrundene på siden og gjort alt der, viste jeg dem ved eksempel. I tillegg er start $100 et utmerket springbrett for trening.

PS Spesiell takk til forfatteren denne kjernen, som fungerte som grunnlag for alle handlingene ovenfor. I noen tilfeller fungerer det ikke for Laravel 7, jeg fikset det.

PPS Hvis du tilfeldigvis er en toppingeniør som tenker i bash-kommandoer, vennligst ikke døm hardt. Du synes kanskje denne artikkelen er på et lavt nivå, men jeg ville ha vært glad for å finne en når jeg trengte den. Hvis det er forslag til forbedringer, er jeg helt for det.

Kilde: www.habr.com

Legg til en kommentar