Implementatie van een Laravel 7-applicatie op Ubuntu & Nginx

Een applicatie implementeren op Laravel 7 op Ubuntu & Nginx

Ik besloot mijn portfolio te maken op Laravel 7. De homepage moest een landingspagina zijn, waarbij alle informatie via het beheerpaneel kon worden gewijzigd. Maar dat doet er niet toe. Het kwam aan op de implementatie. Ik vond een paar goede tutorials over hoe dit op een echte server te doen met alle ingewikkeldheden. Ik ben niet sterk in implementatie; ik ben meer een front-end ontwikkelaar dan een full-stack ontwikkelaar. Hoewel ik nog kan coderen en testen in PHP, ben ik nog niet op het punt gekomen om de serverbeheer enzovoorts aan te pakken. Maar ik moest me erin verdiepen.

Laten we alle stappen doorlopen, van het opstarten via SSH totdat de website werkt. We zullen proberen alle valkuilen te vermijden.

Misschien kunt u soortgelijke instructies op internet vinden. Uiteindelijk heb ik dat ook gedaan. Maar niet op één plek, niet zonder de hulp van StackOverflow en waarschijnlijk niet in het Nederlands. Ik heb me een tijdlang ingespannen. Daarom heb ik besloten om uw leven te vergemakkelijken.

We zullen alles doen met een droplet op DigitalOcean. Dit is echter niet verplicht; u kunt elke hostingprovider kiezen. Zodra u een werkende server op Ubuntu hebt, kunt u terugkomen. Voor degenen die toch voor DigitalOcean hebben gekozen, komen er nog tips voor het instellen van een domein. En ook een referral link voor $100.

Alle specifieke stappen voor DigitalOcean worden in vergelijkbare voetnoten gegeven.

Laten we beginnen.

TL;DR (alleen de belangrijkste commando's)

Maak een gebruiker aan

  • ssh root@[IP-adres van uw droplet]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

SSH toevoegen

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Plak de publieke sleutel
  • 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;
  • 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/

Basisinstelling:

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

Alleen de HTTP-instellingen voor 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 instelling voor 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;

  • 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

Creëer een droplet op DigitalOcean en registreer een nieuwe SSH-sleutel

Ik geloof er oprecht in dat je zelf de registratie op DigitalOcean zult begrijpen. Het is niet eenvoudig, met veel verificaties en andere rompslomp. Als er zich een netwerkfout voordoet tijdens de verificatie met documenten, probeer het dan met een VPN, dat zou moeten helpen.

Klik bovenaan op Create->Droplets. Kies Ubuntu.

Zodra je je registreert, ontvang je $100 op je account. Maar laat je niet misleiden. Je hebt maar 60 dagen om ze uit te geven. Dat is heel kort. Je zou, net als ik, misschien willen upgraden naar een duurder plan om later, wanneer het echte geld binnenkomt, naar een goedkoper plan over te stappen. Ik zeg het meteen, dat kan niet. Je kunt alleen upgraden, niet downgraden. Dat is de deal. Ik kies Standard->$5.

De regio kies ik het dichtst bij ons Frankfurt. VPC Netwerk->default-fra1

We doen de authenticatie meteen via SSH. Klik op Nieuwe SSH-sleutel. Als je geen SSH hebt, staat er rechts een heel eenvoudige instructie. Open de bash-terminal, plak ssh-keygen. Ga dan naar het bestand met de publieke sleutel /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (of gewoon cat ~\/\.ssh\/id_rsa.pub), kopieer de inhoud en plak deze in het venster aan de linkerzijde. Naam is vrij.

Bedenk een hostnaam voor de droplet.

Klik op Maak Droplet

Een nieuwe gebruiker aanmaken

  • ssh root@[IP-adres van uw droplet]
  • Weet je zeker dat je wilt doorgaan met verbinden (ja/nee/[vingerafdruk])? ja
  • Voer je SSH-wachtwoord in
  • Maak een gebruiker aan laravel: adduser laravel
  • Voer het wachtwoord en andere informatie in (ik voer alleen de volledige naam in)
  • Voeg de gebruiker toe aan de sudo-groep: usermod -aG sudo laravel

SSH voor de nieuwe gebruiker

  • Schakel over naar de nieuwe gebruiker: su laravel

Alle verdere acties, tot het einde van dit artikel, worden uitgevoerd namens de gebruiker laravel. Dus als je plotseling bent onderbroken, log dan opnieuw in en voer su laravel

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

We hebben het bestand in Vim geopend. Als je daar helemaal niet bekend mee bent, kun je ook in Nano werken, dat is jouw keuze..

De meest basale Vim-commando's

Om tijdens het artikel met de Vim-editor te werken, hoef je alleen het volgende te weten.

  • In Vim zijn er verschillende modi: de normale modus (Normal mode), waarin je commando's invoert en modi selecteert, en andere.
  • Om uit elke modus te gaan en naar de normale modus te gaan, hoef je alleen maar op Esc
  • Bewegen: je kunt gewoon de pijltjes gebruiken
  • Verlaat zonder op te slaan <Normal mode>: :q!
  • Verlaat en sla op <Normal mode>: :wq
  • Ga naar de invoermodus <Normal mode>: i (van het Engels: insert)
  • Plak onze publieke sleutel (die we eerder hebben gemaakt)
  • Bescherm tegen wijzigingen: chmod 600 ~/.ssh/authorized_keys

Stel de firewall in

  • Bekijk alle beschikbare instellingen: sudo ufw app list
  • Sta OpenSSH toe (anders wordt je buitengesloten): sudo ufw allow OpenSSH
  • Start de firewall: sudo ufw enable, y
  • We controleren: sudo ufw status

Status: actief

Naar                         Actie      Van
--                         ------      ----
OpenSSH                    TOESTAAN       Overal
OpenSSH (v6)               TOESTAAN       Overal (v6)

Alles is in orde.

Installeer Nginx

Bij de installatie zal je soms vragen krijgen "Ben je zeker?". Antwoord y (maar alleen als je zeker bent).

  • sudo apt update
  • sudo apt install nginx

Voeg Nginx toe aan de firewallinstellingen

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

Status: actief

Naar                         Actie      Van
--                         ------      ----
OpenSSH                    TOESTAAN       Overal
Nginx HTTP                 TOESTAAN       Overal
OpenSSH (v6)               TOESTAAN       Overal (v6)
Nginx HTTP (v6)            TOESTAAN       Overal (v6)

Ga naar uw IP. Als alles goed gaat, zou u het volgende moeten zien.

Een applicatie implementeren op Laravel 7 op Ubuntu & Nginx

We installeren MySQL

  • sudo apt install mysql-server
  • We starten het automatische script voor bescherming sudo mysql_secure_installation

Beantwoord de gestelde vragen. Als u niet weet wat te antwoorden, zijn hier enkele aanbevolen opties:

  • Validate password plugin — N

  • Verwijder anonieme gebruikers? — Y

  • Verbied root-login op afstand? — N

  • Verwijder testdatabase en toegang ertoe? — N

  • Herlaad privilege-tabellen nu? — Y

  • We loggen in op MySQL: sudo mysql

  • We bekijken de toegangsmethoden: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • We stellen een wachtwoord in voor root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • We bekijken de toegangsmethoden opnieuw: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • We passen de wijzigingen toe en loggen uit van MySQL: FLUSH PRIVILEGES; en exit

  • Nu, om in MySQL in te loggen, moet je gebruiken mysql -u root -p en het wachtwoord invoeren

We installeren PHP

We maken gebruik van een externe repository van 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 kiezen we. Voor Laravel 7 kan PHP 7.3 of 7.4 worden gekozen. Het enige verschil is de cijfers 3 en 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) werkt met PHP-aanvragen. mysql, uiteraard, voor de interactie met MySQL.

Verder zal ik alles op 7.4 doen.

We configureren Nginx

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

In plaats van "" typ het domein in (bijvoorbeeld, mysite.ru), dat je in de toekomst wilt gebruiken. Als je dat nog niet hebt, typ dan iets willekeurigs, herhaal gewoon de stappen in dit hoofdstuk voor jouw domein wanneer je het kiest.

Typ het volgende in:

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

Als u versie 7.3 heeft gekozen in plaats van php7.4-fpm.sock typ dan php7.4-fpm.sock.

We luisteren naar poort 80 op server_name, wanneer we een verzoek in de root ontvangen /var/www/html nemen we het indexbestand. Als er iets is na server_name zoeken we naar zo'n bestand. Als we het niet vinden, geven we een 404. Als het eindigt op .php, laten we het doorgaan via fpm. Als er een .ht, verbieden we (403).

  • We maken een koppeling vanuit sites-available in sites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • We verwijderen de koppeling naar default: sudo unlink /etc/nginx/sites-enabled/default
  • We controleren op fouten: sudo nginx -t
  • We herstarten: sudo systemctl reload nginx

We controleren de werking:

  • sudo vim /var/www/html/info.php
  • We schrijven: <?php phpinfo();
  • Ga naar /info.php

U zou iets dergelijks moeten zien:

Een applicatie implementeren op Laravel 7 op Ubuntu & Nginx

Nu kan dit bestand worden verwijderd: sudo rm /var/www/html/info.php

We installeren 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

  • We loggen in op MySQL: mysql -u root -p

  • We maken een database met de naam laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • We geven root toegang tot laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • We maken een map voor het project: sudo mkdir -p

  • We geven de gebruiker laravel de rechten op het project: sudo chown laravel:laravel

Je moet het project verplaatsen. Bijvoorbeeld door te klonen van Github.

  • cd ./
  • git clone .

Houd er rekening mee dat als je geen statische bestanden hebt opgeslagen (bijvoorbeeld van /public) naar Github, je ze natuurlijk niet hebt. Bijvoorbeeld, om dit op te lossen heb ik een aparte tak gemaakt deploy, waarvan ik al gekloond heb: git clone -b --single-branch ..

  • Afhankelijkheden installeren: composer install
  • Creëren van .env: vim .env

De basisversie ziet er zo uit:

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=

Als u uw .env kopieert, vervang dan APP_ENV door production, APP_DEBUG door false en vul de juiste instellingen voor MySQL in.

  • Migreren van de database: php artisan migrate
  • Code genereren: php artisan key:generate

Verander de permissies:

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

Het laatste dat overblijft, is om Nginx opnieuw in te stellen voor 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;
    }
}

Net als de vorige keer, als u versie 7.3 in plaats van php7.4-fpm.sock typ dan php7.4-fpm.sock.

Domein instellen op DigitalOcean

Eigenlijk is alles heel eenvoudig. U koopt een domein (waar dan ook), gaat naar DigitalOcean in Create->Domeinen/DNS. In het veld Domein toevoegen vult u dit domein in, drukt u op toevoegen. Vervolgens gaat u naar de domeininstellingen en in het veld HOSTNAME vult u in @. Kies een project en druk op Record aanmaken.
Ga nu naar de website waar u het domein hebt gekocht, vindt "DNS-servers" (of iets dergelijks) en vult de servers van DigitalOcean in (namelijk ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Nu moet u een beetje (of veel) wachten totdat deze instellingen zijn aanvaard. Klaar!
Het enige probleem is dat uw site alleen via HTTP toegankelijk zal zijn. Voor HTTPS gaan we naar het volgende deel.

HTTPS instellen

Installeer certbot en geef het de naam van het domein (formaat mysite.ru) en de naam van het domein met www (www.mysite.nl).

  • 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 moeten we Nginx opnieuw instellen (vergeet niet uw waarden in te vullen):

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

Ik denk dat u al hebt begrepen wat er moet worden veranderd voor PHP 7.3.

Dit is in feite heel eenvoudig. We leiden gewoon alle aanvragen van HTTP (poort 80) om naar HTTPS (poort 443). En daar doen we alles precies hetzelfde, maar dan met encryptie.

Het enige wat overblijft, is de permissies in de firewall instellen:

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

Nu zou alles moeten werken zoals het hoort.

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

Als u ooit npm-commando's rechtstreeks op de server moet uitvoeren, moet u Node.js installeren.

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

Dat is alles, ik ben op dit punt gestopt. In principe ben ik tevreden met het resultaat. Misschien ga ik naar een goedkopere hosting dichter bij Rusland. Maar omdat ik al alle verificatierondes op de site heb doorlopen en alles daar heb gedaan, heb ik het met hun voorbeeld laten zien. Bovendien is hun startbedrag van 100 dollar een uitstekende basis voor training.

P.S. Een speciale dank aan de auteur van deze gist, die de basis vormde voor al deze acties. Het werkt op sommige punten niet voor Laravel 7, dat heb ik aangepast.

P.P.S. Als je toevallig een topingenieur bent die denkt in bash-commando's, oordeel dan alsjeblieft niet te hard. Misschien lijkt deze artikeleniveau te laag voor jou, maar ik zou het geweldig hebben gevonden als ik zoiets had gevonden toen ik het nodig had. Als je suggesties voor verbetering hebt, dan sta ik daar volledig voor open.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster