Distribuera en applikation till Laravel 7 på Ubuntu och Nginx

Distribuera en applikation till Laravel 7 på Ubuntu och Nginx

Jag bestämde mig för att göra min portfölj med Laravel 7. Så att huvudsidan skulle vara en målsida och all information på den kunde ändras med hjälp av adminpanelen. Inte poängen. Det kom till utplacering. Jag hittade ett par bra tutorials om hur man gör detta på en fullfjädrad server med alla problem. Jag är inte särskilt stark i utbyggnaden; jag är generellt sett mer framme än full stack. Och om jag fortfarande kan skriva och testa i PHP, innan jag hanterar servern osv. Jag har inte vuxit upp än. Men jag var tvungen att ta reda på det.

Nu ska vi gå igenom alla steg, börjar med lansering via SSH och slutar med arbetsplatsen. Vi ska försöka undvika alla fallgropar.

Du kanske kan hitta liknande instruktioner online. Trots allt hittade jag den till slut. Det är sant, inte på ett ställe, inte utan hjälp av StackOverflow, och knappast på ryska. Jag led. Det är därför jag bestämde mig för att förenkla ditt liv.

Vi kommer att göra allt med en droppe på DigitalOcean. Detta är naturligtvis inte nödvändigt, välj vilken värd som helst. När du når en fungerande server på Ubuntu, kom tillbaka. För de som ändå bestämmer sig för att göra det på DigitalOcean kommer det att finnas fler tips om hur man skapar en domän. Och 100 $ hänvisningslänk.

Alla DigitalOcean-specifika steg kommer att ges i fotnoter som dessa.

Låt oss börja.

TL;DR (endast grundläggande kommandon)

Skapa en användare

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

Lägg till SSH till den

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Sätt i den publika nyckeln
  • chmod 600 ~/.ssh/authorized_keys

Brandvägg

  • 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äggande inställning:

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

Endast HTTP-inställning fö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 <Ваш домен или 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-inställning fö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: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

Skapa en droppe på DigitalOcean och registrera en ny SSH-nyckel

Jag tror verkligen att du själv kommer att ta reda på hur du registrerar dig hos DigitalOcean. Det är inte lätt, med mycket verifieringar och annat. Om du ständigt får ett nätverksfel när du verifierar med dokument, försök att göra allt via en VPN, det borde hjälpa.

Klicka på i menyn högst upp Skapa->droppar. Välja ubuntu.

Så fort du registrerar dig får du $100 till ditt konto. Men låt dig inte luras. Du har bara 60 dagar på dig att spendera det. Och det här är väldigt lite. Du kanske, som jag, vill använda en dyrare plan, så att du senare, när de riktiga pengarna börjar flöda, kan byta till en billigare. Jag ska berätta direkt att det inte kommer att fungera. Du kan öka den, men du kan inte minska den. Så går det. jag väljer Standard->$5.

Jag väljer den region som ligger närmast oss Frankfurt. VPC nätverk->default-fra1

Vi kommer omedelbart att utföra autentisering via SSH. Klick Ny SSH-nyckel. Om du inte har SSH finns det väldigt enkla instruktioner till höger. Öppna en bash-terminal och klistra in ssh-keygen. Sedan går vi till filen med den publika nyckeln /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (eller bara cat ~/.ssh/id_rsa.pub), kopiera innehållet och klistra in det i fönstret till vänster. Något namn.

Vi kommer på ett värdnamn för droppen.

Klick Skapa droppe

Skapa en ny användare

  • ssh root@[IP-адрес вашего дроплета]
  • Är du säker på att du vill fortsätta ansluta (ja/nej/[fingeravtryck])? yes
  • Ange ditt SSH-lösenord
  • Skapa en användare laravel: adduser laravel
  • Ange ditt lösenord och annan information (jag anger bara Fullständigt namn)
  • Lägg till användaren i sudo-gruppen: usermod -aG sudo laravel

SSH för ny användare

  • Byt till den nya användaren: su laravel

Vi utför alla åtgärder vidare, fram till slutet av artikeln, på uppdrag av laravelanvändaren. Därför, om du plötsligt blir avbruten, logga in igen och gå in su laravel

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

Vi öppnade filen i Vim. Om du inte är bekant med det alls kan du arbeta i Nano, din rätt.

De mest grundläggande Vim-kommandona

För att kunna använda Vim-redigeraren genom hela artikeln behöver du bara veta följande.

  • Vim har olika lägen: Normalläge, där du anger kommandon och väljer lägen och annat.
  • För att lämna valfritt läge och återgå till normalt läge, tryck bara på Esc
  • Flytta runt: du kan bara använda pilar
  • Avsluta utan att spara <Normal mode>: :q!
  • Avsluta och spara <Normal mode>: :wq
  • Växla till textinmatningsläge <Normal mode>: i (från engelska infoga)
  • Vi sätter in vår publika nyckel (vilket vi gjorde ovan)
  • Vi skyddar mot förändringar: chmod 600 ~/.ssh/authorized_keys

Installera en brandvägg

  • Låt oss titta på alla tillgängliga inställningar: sudo ufw app list
  • Tillåt OpenSSH (annars låser det oss): sudo ufw allow OpenSSH
  • Låt oss starta brandväggen: sudo ufw enable, y
  • Vi kontrollerar: sudo ufw status

Status: active

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

Allt är bra.

Installerar Nginx

Under installationen kommer du ibland att få frågan "Är du säker?" Svar y (ja, bara om du är säker).

  • sudo apt update
  • sudo apt install nginx

Lägger till Nginx i brandväggsinställningarna

  • 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å till din IP. Om allt går bra bör du se följande.

Distribuera en applikation till Laravel 7 på Ubuntu och Nginx

Installerar MySQL

  • sudo apt install mysql-server
  • Startar ett automatiskt skyddsskript sudo mysql_secure_installation

Svara på frågorna. Om du inte vet vad du ska svara, här är några förslag på alternativ:

  • Validera lösenord plugin - N

  • Ta bort anonyma användare? — Y

  • Vill du inte tillåta root-inloggning på distans? — N

  • Ta bort testdatabasen och få tillgång till den? — N

  • Ladda om privilegietabeller nu? — Y

  • Låt oss gå till MySQL: sudo mysql

  • Låt oss titta på åtkomstmetoderna: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Ange ett lösenord för root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Låt oss titta på åtkomstmetoderna igen: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Tillämpa ändringarna och avsluta MySQL: FLUSH PRIVILEGES; и exit

  • Nu, för att logga in på MySQL måste du använda mysql -u root -p och ange ditt lösenord

Installerar PHP

Låt oss använda ett tredjepartsförråd från 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

Låt oss nu välja. För Laravel 7 kan du välja PHP 7.3 eller 7.4. Den enda skillnaden är siffrorna 3 och 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) fungerar med PHP-förfrågningar. mysql, naturligtvis, för att arbeta med MySQL.

Från och med nu kommer jag att göra allt den 7.4.

Konfigurera Nginx

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

Istället för "<Din domän>" anger du domänen (t.ex. mysite.ru) som du vill använda i framtiden. Om du inte har en ännu, skriv någon, och upprepa sedan stegen i det här kapitlet för din domän när du väljer den.

Skriv följande:

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

Om du istället väljer version 7.3 php7.4-fpm.sock Skriv in php7.4-fpm.sock.

Lyssna på port 80 på server_namenär vi kommer fram till root-förfrågan /var/www/html ta indexfilen. Om efter server_name Det är något, vi letar efter en sådan fil. Hittar vi det inte kastar vi ut 404. Om det slutar med .php, springa igenom fpm... Om det är .ht, förbjuda (403).

  • Att göra en länk från sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Tar bort länken till default: sudo unlink /etc/nginx/sites-enabled/default
  • Söker efter fel: sudo nginx -t
  • Starta om: sudo systemctl reload nginx

Kontrollera arbetet:

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

Du borde se något sånt här:

Distribuera en applikation till Laravel 7 på Ubuntu och Nginx

Nu kan denna fil raderas: sudo rm /var/www/html/info.php

Installera 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

  • Låt oss gå till MySQL: mysql -u root -p

  • Skapa en databas med namnet laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Skapa en mapp för projektet: sudo mkdir -p <Имя проекта>

  • Vi tillhandahåller användaren laravel rättigheter till projektet: sudo chown laravel:laravel <Имя проекта>

Därefter måste du överföra projektet. Till exempel kloning från Github.

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

Det är värt att tänka på att om du inte sparade statiska filer (till exempel från /public) på Github, då kommer du naturligtvis inte att ha dem. Jag skapade till exempel en separat tråd för att lösa detta deploy, som jag redan klonat från: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Installera beroenden: composer install
  • Skapa .env: vim .env

Grundversionen av den ser ut så här:

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>

Om du kopierar din .env, ersätt APP_ENV med produktion, APP_DEBUG med false och ange rätt inställningar för MySQL.

  • Migrera databasen: php artisan migrate
  • Generera koden: php artisan key:generate

Ändra behörigheter:

  • 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 sista som återstår är att konfigurera om Nginx fö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 <Ваш домен или 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 förra gången, om du istället valde version 7.3 php7.4-fpm.sock Skriv in php7.4-fpm.sock.

Konfigurera en domän på DigitalOcean

Allt är faktiskt väldigt enkelt. Du köper en domän (var som helst), byter till DigitalOcean på Skapa->Domäner/DNS... I fält Lägg till en domän du anger denna domän och klickar på lägg till. Gå sedan till domäninställningarna och till fältet HOSTNAME stiga på @. Välj ett projekt och klicka Skapa post.
Gå nu till sidan där du köpte domänen, hitta "DNS-servrar" där (eller något liknande) och ange DigitalOcean-servrarna (dvs. ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nu måste du vänta lite (eller mycket) tills dessa inställningar accepteras. Redo!
Det enda problemet är att din webbplats endast öppnas som HTTP. För att ha HTTPS, gå vidare till nästa del.

Konfigurera HTTPS

Installera certbot och ge den domännamnet (format mysite.ru) och domännamn 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 måste du konfigurera om Nginx (glöm inte att ersätta dina värden):

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

Jag tror att du redan förstår vad som behöver ändras för PHP 7.3.

Här är faktiskt allt enkelt. Vi omdirigerar helt enkelt alla förfrågningar från HTTP (port 80) till HTTPS (port 443). Och där gör vi allt på samma sätt som tidigare, men med kryptering.

Allt som återstår är att ställa in behörigheterna i brandväggen:

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

Nu ska allt fungera som det ska.

[Avancerat] Installera Node.js

Om du plötsligt behöver köra npm-kommandon direkt på servern måste du installera Node.js.

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

Det var det, jag slutade i det här skedet. Jag är i princip nöjd med resultatet. Jag kanske byter från DigitalOcean någonstans närmare Ryssland och billigare. Men eftersom jag redan hade gått igenom alla verifieringsrundor på sajten och gjort allt där, visade jag dem med exempel. Dessutom är deras start $100 en utmärkt språngbräda för träning.

PS Särskilt tack till författaren denna kärna, som låg till grund för alla ovanstående åtgärder. I vissa fall fungerar det inte för Laravel 7, jag fixade det.

PPS Om du råkar vara en toppingenjör som tänker i bash-kommandon, snälla döm inte hårt. Du kanske tycker att den här artikeln är på en låg nivå, men jag skulle ha varit glad att hitta en när jag behövde den. Om det finns förslag på förbättringar så är jag helt för det.

Källa: will.com

Lägg en kommentar