Distribution av applikationen pÄ Laravel 7 pÄ Ubuntu & Nginx

Distribution av applikation pÄ Laravel 7 pÄ Ubuntu & Nginx

Jag bestÀmde mig för att skapa min portfolio pÄ Laravel 7. SÄ att startsidan skulle vara en landningssida, och all information pÄ den skulle kunna Àndras via adminpanelen. Det Àr inte det viktigaste. Nu handlar det om distributionen. Jag hittade nÄgra bra handledningar om hur man gör det pÄ en riktig server med alla finesser. Jag Àr inte sÄ stark pÄ distribution, jag Àr egentligen mer frontend Àn fullstack. Om jag kan skriva och testa i PHP, sÄ har jag fortfarande en bit kvar till att hantera en server och liknande. Men jag var tvungen att sÀtta mig in i det.

Nu gÄr vi igenom alla steg, frÄn att starta via SSH till en fungerande webbplats. Vi ska försöka undvika alla fallgropar.

Du kanske kan hitta liknande instruktioner pÄ internet. För i slutÀndan hittade jag dem. Visserligen inte pÄ ett stÀlle, inte utan hjÀlp av StackOverflow, och knappast pÄ ryska. Jag kÀmpade med det. SÄ jag bestÀmde mig för att förenkla livet för dig.

Allt vi gör kommer att utföras med en droplet pÄ DigitalOcean. Det Àr sjÀlvklart inte nödvÀndigt, vÀlj vilken webbhotell som helst. NÀr du Àr framme vid en fungerande server pÄ Ubuntu, kom tillbaka. För dem som ÀndÄ har beslutat sig för att anvÀnda DigitalOcean, kommer det Àven att finnas fler tips för domÀninstÀllningar. Och ocksÄ en referralslÀnk pÄ 100$.

Alla specifika steg för DigitalOcean kommer att ges i liknande fotnoter.

LÄt oss börja.

TL;DR (bara de viktigaste kommandona)

Skapa en anvÀndare

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

LĂ€gg till SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Klistra in den offentliga 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 '';
  • 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 ;

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

Bara HTTP-instÀllningen 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 ;

    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-konfiguration 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:ECDHE-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;

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

  • 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 droplet pÄ DigitalOcean och registrera en ny SSH-nyckel

Jag litar verkligen pÄ att ni sjÀlva kommer att förstÄ registreringen pÄ DigitalOcean. Det Àr inte enkelt, med mÄnga verifieringar och annan krÄngel. Om ni fÄr nÀtverksfel vid verifieringen med dokument, försök att göra allt via VPN, det borde hjÀlpa.

I menyn högst upp klickar vi pÄ Skapa->Droplets. VÀlj Ubuntu.

SÄ snart du har registrerat dig fÄr du 100 $ pÄ kontot. Men kom ihÄg att du har bara 60 dagar pÄ dig att anvÀnda dem, vilket Àr ganska kort. Du kan, precis som jag, vilja vÀlja en dyrare plan för att sedan byta till en billigare nÀr de riktiga pengarna börjar komma in. Jag sÀger direkt att det inte gÄr. Du kan öka, men inte minska. SÄ Àr lÀget. Jag vÀljer Standard->$5.

Regionen jag vÀljer Àr den nÀrmaste oss Frankfurt. VPC NÀtverk->default-fra1

Vi kommer att göra autentiseringen via SSH direkt. Klicka pĂ„ Ny SSH Nyckel. Om du inte har SSH, finns det en vĂ€ldigt enkl instruktion till höger. Öppna bash-terminalen, klistra in ssh-keygen. GĂ„ sedan till filen med den offentliga 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. Namnet kan vara vad som helst.

Vi vÀljer ett vÀrdnamn för droplet.

Klicka pÄ Skapa Droplet

Skapa en ny anvÀndare

  • ssh root@[IP-adressen till din droplet]
  • Är du sĂ€ker pĂ„ att du vill fortsĂ€tta ansluta (ja/nej/[fingeravtryck])? ja
  • Ange ditt SSH-lösenord
  • Skapa en anvĂ€ndare laravel: adduser laravel
  • Ange lösenordet och annan information (jag anger bara FullstĂ€ndigt namn)
  • LĂ€gg till anvĂ€ndaren i sudo-gruppen: usermod -aG sudo laravel

SSH för den nya anvÀndaren

  • Byt till den nya anvĂ€ndaren: su laravel

Alla ÄtgÀrder frÄn och med nu, fram till slutet av artikeln, görs under anvÀndarnamnet laravel. SÄ om du skulle bli avbruten, logga in igen och ange su laravel

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

Vi har öppnat filen i Vim. Om du inte Àr bekant med det kan du arbeta i Nano, det Àr upp till dig.

De mest grundlÀggande kommandona i Vim

För att anvÀnda redigeraren Vim genom artikeln behöver du veta följande.

  • I Vim finns det olika lĂ€gen: normalt (Normal mode), dĂ€r du anger kommandon och vĂ€ljer lĂ€gen samt andra.
  • För att gĂ„ ur vilket lĂ€ge som helst och komma till normalt lĂ€ge, tryck pĂ„ Esc
  • Navigera: du kan anvĂ€nda piltangenterna
  • Avsluta utan att spara <Normal mode>: :q!
  • Avsluta och spara <Normal mode>: :wq
  • GĂ„ till textinmatningslĂ€ge <Normal mode>: i (frĂ„n eng. insĂ€ttning)
  • Klistra in vĂ„r offentliga nyckel (som vi har skapat ovan)
  • Skydda mot Ă€ndringar: chmod 600 ~/.ssh/authorized_keys

Installera brandvÀggen

  • Se alla tillgĂ€ngliga instĂ€llningar: sudo ufw app list
  • TillĂ„t OpenSSH (annars blir vi blockerade): sudo ufw allow OpenSSH
  • Starta brandvĂ€ggen: sudo ufw enable, y
  • Kontrollerar: sudo ufw status

Status: aktiv

Till                         ÅtgĂ€rd      FrĂ„n
--                         ------      ----
OpenSSH                    TILLÅT       Överallt
OpenSSH (v6)               TILLÅT       Överallt (v6)

Allt ser bra ut.

Installera Nginx

Vid installation frĂ„gar de ibland "Är du sĂ€ker?". Svara y (bara om du Ă€r sĂ€ker).

  • sudo apt update
  • sudo apt install nginx

LÀgg till Nginx i brandvÀggens instÀllningar

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

Status: aktiv

Till                         ÅtgĂ€rd      FrĂ„n
--                         ------      ----
OpenSSH                    TILLÅT      Överallt
Nginx HTTP                 TILLÅT      Överallt
OpenSSH (v6)               TILLÅT      Överallt (v6)
Nginx HTTP (v6)            TILLÅT      Överallt (v6)

GÄ till din IP. Om allt gÄr bra bör du se följande.

Distribution av applikation pÄ Laravel 7 pÄ Ubuntu & Nginx

Installerar MySQL

  • sudo apt install mysql-server
  • Kör automatiskt skydds-skript sudo mysql_secure_installation

Svara pÄ de stÀllda frÄgorna. Om du inte vet vad du ska svara, hÀr Àr rekommenderade alternativ:

  • Validate password plugin — N

  • Ta bort anonyma anvĂ€ndare? — Y

  • Förhindra root-inloggning pĂ„ distans? — N

  • Ta bort testdatabas och Ă„tkomst till den? — N

  • Ladda om privilegietabellerna nu? — Y

  • Loggar in i MySQL: sudo mysql

  • Ser Ă„tkomstmetoder: SELECT user, authentication_string, plugin, host FROM mysql.user;

  • SĂ€tter lösenord för root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Ser Ă„tkomstmetoder igen: SELECT user, authentication_string, plugin, host FROM mysql.user;

  • TillĂ€mpa Ă€ndringar och logga ut frĂ„n MySQL: FLUSH PRIVILEGES; och exit

  • Nu, för att logga in i MySQL mĂ„ste du anvĂ€nda mysql -u root -p och ange lösenordet

Installerar PHP

Vi anvĂ€nder ett tredjepartsrepository frĂ„n 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Àljer vi. För Laravel 7 kan du vÀlja PHP 7.3 eller 7.4. Skillnaden kommer endast vara 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) hanterar PHP-förfrÄgningar. mysql, naturligtvis, för att arbeta med MySQL.

DÀrefter kommer jag att anvÀnda 7.4.

Konfigurerar Nginx

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

IstÀllet för "<Ditt domÀnnamn>" skriv in domÀnen (till exempel, mysite.ru), som du vill anvÀnda i framtiden. Om du inte har en sÄdan Ànnu, skriv vilken som helst, upprepa bara stegen i detta avsnitt för din domÀn nÀr du har valt den.

Skriv följande:

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

Om du valde version 7.3 istÀllet för php7.4-fpm.sock skriv in php7.4-fpm.sock.

Lyssnar pÄ port 80 pÄ server_name, nÀr en förfrÄgan kommer in i roten /var/www/html tar vi index-filen. Om det finns nÄgot efter server_name letar vi efter en sÄdan fil. Om vi inte hittar den, fÄr vi 404. Om det slutar pÄ .php, kör vi genom fpm. Om det finns .ht, förbjuda (403).

  • Vi gör en lĂ€nk frĂ„n sites-available pĂ„ 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
  • Kontrollerar för fel: sudo nginx -t
  • Startar om: sudo systemctl reload nginx

Kontrollerar funktionalitet:

  • sudo vim /var/www/html/info.php
  • Skriv: <?php phpinfo();
  • GĂ„ till <Din IP>/info.php

Du bör se nÄgot liknande:

Distribution av applikation pÄ Laravel 7 pÄ Ubuntu & Nginx

Nu kan den hÀr filen tas bort: sudo rm /var/www/html/info.php

Installerar 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

  • Loggar in i MySQL: mysql -u root -p

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

  • Ger root-Ă„tkomst till laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Skapar en mapp för projektet: sudo mkdir -p

  • Ger anvĂ€ndaren laravel behörigheter pĂ„ projektet: sudo chown laravel:laravel

DÀrefter mÄste projektet flyttas. Till exempel, genom kloning frÄn Github.

  • cd ./
  • git clone .

Det Àr vÀrt att tÀnka pÄ att om du inte har sparat statiska filer (till exempel frÄn /public) pÄ Github, sÄ kommer du givetvis inte att ha dem. Jag, till exempel, skapade en separat gren deploy, frÄn vilken jag sedan klonade: git clone -b --single-branch ..

  • Installerar beroenden: composer install
  • Skapar .env: vim .env

Basversionen 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=

Om du kopierar din .env, ersÀtt APP_ENV med production, APP_DEBUG med false och skriv in rÀtt instÀllningar för MySQL.

  • Migrerar databasen: php artisan migrate
  • Genererar kod: php artisan key:generate

Ändrar 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 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 ;

    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 tidigare, om du valde version 7.3 istÀllet för php7.4-fpm.sock skriv in php7.4-fpm.sock.

InstÀllning av domÀn pÄ DigitalOcean

Allt Àr faktiskt vÀldigt enkelt. Du köper en domÀn (var som helst), gÄr till DigitalOcean i Skapa->Domains/DNS. I fÀltet LÀgg till en domÀn anger du denna domÀn, klickar pÄ lÀgg till. Sedan gÄr du till domÀninstÀllningarna och i fÀltet HOSTNAME anger du @. VÀlj projekt och klicka pÄ Skapa post.
Nu gÄr du till webbplatsen dÀr du köpte domÀnen, hittar 'DNS-servrar' (eller nÄgot liknande) och skriver in DigitalOcean-servrarna (precis som ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nu mÄste du vÀnta lite (eller lÀnge) medan dessa instÀllningar accepteras. Klart!
Det enda problemet Àr att din webbplats kommer att öppnas endast som HTTP. För att fÄ HTTPS, gÄ till nÀsta del.

Konfigurerar HTTPS

Installerar certbot och ger den domÀnnamnet (formatet mysite.ru) och domÀnnamnet 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 omkonfigurera Nginx (glöm inte att sÀtta in 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:ECDHE-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 har förstÄtt vad som behöver Àndras för PHP 7.3.

HÀr Àr allt faktiskt ganska enkelt. Vi omdirigerar alla förfrÄgningar frÄn HTTP (port 80) till HTTPS (port 443). Och dÀr gör vi allt som tidigare, men redan med kryptering.

KvarstÄr att sÀtta behörigheter i brandvÀggen:

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

Nu bör allt fungera som det ska.

[Đ”ĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐŸ] ĐŁŃŃ‚Đ°ĐœĐŸĐČĐșа Node.js

Om du plötsligt behöver köra npm-kommandon direkt pÄ servern, behöver du installera Node.js.

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

Det Àr allt, jag stannade vid det hÀr steget. I princip Àr jag nöjd med resultatet. Kanske kommer jag att flytta frÄn DigitalOcean till nÄgot nÀrmare Ryssland och billigare. Men eftersom jag redan har genomgÄtt alla verifieringssteg pÄ sidan och gjort allt dÀr, anvÀnder jag deras exempel. Dessutom Àr deras start pÄ 100 dollar en utmÀrkt plattform för trÀning.

P.S. Stort tack till författaren av denna gist, som var grunden för alla ovanstÄende ÄtgÀrder. Den fungerar inte i vissa avseenden för Laravel 7, det har jag fixat.

P.P.S. Om du rÄkar vara en toppingenjör som tÀnker i bash-kommandon, var snÀll och döm inte för hÄrt. Det kan hÀnda att nivÄn pÄ den hÀr artikeln kÀnns lÄg för dig, men jag skulle verkligen ha uppskattat att hitta nÄgot sÄdant nÀr jag behövde det. Om du har förslag pÄ förbÀttringar, Àr jag helt öppen för det.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster