Anwendung Deployment auf Laravel 7 unter Ubuntu & Nginx

Deployen einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

Ich habe mir hier ein Portfolio auf Laravel 7 erstellt. Damit die Hauptseite eine Landingpage ist und alle Informationen darauf über das Admin-Panel geändert werden können. Darum geht es nicht. Nun kam es zum Deployment. Ich habe ein paar gute Tutorials gefunden, wie man es auf einem vollwertigen Server mit allen Komplikationen macht. Mit Deployment kenne ich mich nicht so gut aus, ich bin mehr Frontend als Fullstack. Und während ich noch in der Lage bin, in PHP zu programmieren und zu testen, habe ich mich noch nicht mit der Serververwaltung usw. beschäftigt. Aber ich musste mich damit auseinandersetzen.

Jetzt gehen wir alle Schritte durch, beginnend mit dem Start über SSH und endend mit der funktionierenden Website. Wir werden versuchen, alle Fallstricke zu umgehen.

Möglicherweise finden Sie ähnliche Anleitungen im Internet. Schließlich habe ich sie ja auch irgendwann gefunden. Allerdings nicht an einem Ort, nicht ohne die Hilfe von StackOverflow und wahrscheinlich nicht auf Russisch. Ich habe mich damit herumgequält. Deshalb wollte ich Ihnen das Leben erleichtern.

Wir werden alles mit einem Droplet auf DigitalOcean machen. Das ist natürlich nicht zwingend erforderlich, wählen Sie jeden Hosting-Anbieter. Wenn Sie zu einem funktionierenden Server auf Ubuntu gelangen, kommen Sie zurück. Für diejenigen, die sich dennoch entschieden haben, es auf DigitalOcean zu machen, wird es auch Tipps zur Domainkonfiguration geben. Und außerdem ein Empfehlungslink für 100$.

Alle spezifischen Schritte für DigitalOcean werden in solchen Fußnoten angegeben.

Lassen Sie uns anfangen.

TL;DR (nur die Hauptbefehle)

Wir erstellen einen Benutzer

  • ssh root@[IP-Adresse Ihres Droplets]
  • adduser laravel
  • usermod -aG sudo laravel
  • su laravel

Wir fügen ihm SSH hinzu

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Fügen Sie den öffentlichen Schlüssel ein
  • 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/

Basis-Konfiguration:

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

Nur die HTTP-Konfiguration 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

Ein Droplet bei DigitalOcean erstellen und einen neuen SSH-Schlüssel registrieren

Ich glaube fest daran, dass Sie sich mit der Registrierung bei DigitalOcean selbst zurechtfinden werden. Es ist nicht einfach, mit vielen Verifizierungen und ähnlichem. Wenn es bei der Verifizierung mit Dokumenten ständig zu Netzwerkfehlern kommt, versuchen Sie es über ein VPN, das sollte helfen.

Im oberen Menü klicken wir auf Erstellen->Droplets. Wir wählen aus Ubuntu.

Sobald Sie sich registriert haben, erhalten Sie 100 $ auf Ihr Konto. Aber lassen Sie sich nicht täuschen. Sie haben nur 60 Tage Zeit, um das Geld auszugeben. Das ist sehr wenig. Möglicherweise möchten Sie, wie ich, einen teureren Plan nutzen, um dann, wenn echtes Geld fließt, auf einen günstigeren umzusteigen. Ich sage es gleich, das wird nicht funktionieren. Man kann erhöhen, aber nicht verringern. So ist es. Ich wähle Standard->$5.

Die Region wähle ich am nächsten zu uns Frankfurt. VPC-Netzwerk->default-fra1

Die Authentifizierung erfolgt sofort über SSH. Klicken Sie auf Neuer SSH-Schlüssel. Wenn Sie kein SSH haben, gibt es rechts eine sehr einfache Anleitung. Öffnen Sie das Bash-Terminal, fügen Sie ein ssh-keygen. Dann gehen wir zur Datei mit dem öffentlichen Schlüssel /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (oder einfach cat ~/.ssh/id_rsa.pub), kopieren Sie den Inhalt und fügen Sie ihn in das Fenster links ein. Der Name kann beliebig sein.

Wir geben dem Droplet einen Hostnamen.

Klicken Sie auf Droplet erstellen

Wir erstellen einen neuen Benutzer

  • ssh root@[IP-Adresse Ihres Droplets]
  • Sind Sie sicher, dass Sie mit der Verbindung fortfahren möchten (ja/nein/[Fingerabdruck])? yes
  • Geben Sie Ihr SSH-Passwort ein
  • Wir erstellen einen Benutzer laravel: adduser laravel
  • Geben Sie das Passwort und weitere Informationen ein (ich gebe nur den vollständigen Namen ein)
  • Fügen Sie den Benutzer zur Sudo-Gruppe hinzu: usermod -aG sudo laravel

SSH für den neuen Benutzer

  • Wechseln Sie zu dem neuen Benutzer: su laravel

Alle weiteren Schritte bis zum Ende des Artikels führen wir im Namen des Benutzers laravel durch. Wenn Sie also unterbrochen haben, loggen Sie sich erneut ein und geben Sie ein su laravel

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

Wir haben die Datei in Vim geöffnet. Wenn Sie damit nicht vertraut sind, können Sie in Nano arbeiten, wie Sie möchten.

Die grundlegendsten Vim-Befehle

Um während des Artikels den Vim-Editor zu verwenden, müssen Sie nur Folgendes wissen.

  • In Vim gibt es verschiedene Modi: den normalen Modus, in dem Sie Befehle eingeben und Modi auswählen, und andere.
  • Um aus jedem Modus in den normalen Modus zu gelangen, drücken Sie einfach Esc
  • Bewegen: Sie können einfach die Pfeiltasten verwenden
  • Beenden ohne Speichern <Normal mode>: :q!
  • Beenden und Speichern <Normal mode>: :wq
  • In den Textbearbeitungsmodus wechseln <Normal mode>: i (von engl. Einfügung)
  • Fügen Sie unseren öffentlichen Schlüssel ein (den wir oben erstellt haben)
  • Schützen Sie vor Änderungen: chmod 600 ~/.ssh/authorized_keys

Firewall einrichten

  • Sehen Sie sich alle verfügbaren Einstellungen an: sudo ufw app list
  • Erlauben Sie OpenSSH (sonst werden Sie gesperrt): sudo ufw allow OpenSSH
  • Firewall starten: sudo ufw enable, y
  • Überprüfen: sudo ufw status

Status: aktiv

An                         Aktion      Von
--                         ------      ----
OpenSSH                    ERLAUBT       Überall
OpenSSH (v6)               ERLAUBT       Überall (v6)

Alles in Ordnung.

Nginx installieren

Bei der Installation werden Sie manchmal gefragt: "Sind Sie sicher?". Antworten Sie y (nur wenn Sie sicher sind).

  • sudo apt update
  • sudo apt install nginx

Fügen Sie Nginx zu den Firewalleinstellungen hinzu

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

Status: aktiv

Zu                         Aktion      Von
--                         ------      ----
OpenSSH                    ERLAUBEN       Überall
Nginx HTTP                 ERLAUBEN       Überall
OpenSSH (v6)               ERLAUBEN       Überall (v6)
Nginx HTTP (v6)            ERLAUBEN       Überall (v6)

Gehen Sie zu Ihrer IP. Wenn alles gut geht, sollten Sie Folgendes sehen.

Deployen einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

MySQL installieren

  • sudo apt install mysql-server
  • Einen automatischen Schutz-Skript ausführen sudo mysql_secure_installation

Beantworten Sie die gestellten Fragen. Wenn Sie nicht wissen, was Sie antworten sollen, hier sind empfohlene Optionen:

  • Passwort-Plugin validieren — N

  • Anonymen Benutzern entfernen? — Y

  • Root-Login aus der Ferne verbieten? — N

  • Testdatenbank und Zugang dazu entfernen? — N

  • Rechte-Tabellen jetzt neu laden? — Y

  • In MySQL einloggen: sudo mysql

  • Zugriffsmethoden ansehen: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Passwort für root setzen: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

  • Zugriffsmethoden erneut ansehen: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Änderungen anwenden und aus MySQL aussteigen: FLUSH PRIVILEGES; und exit

  • Jetzt müssen Sie für den Zugriff auf MySQL verwenden mysql -u root -p und das Passwort eingeben

PHP installieren

Wir nutzen ein Drittanbieter-Repository von 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

Jetzt wählen wir aus. Für Laravel 7 können Sie PHP 7.3 oder 7.4 wählen. Der Unterschied liegt nur in den Zahlen 3 und 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) arbeitet mit PHP-Anfragen. mysql natürlich für die Arbeit mit MySQL.

Danach werde ich alles auf 7.4 machen.

Nginx konfigurieren

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

Anstelle von "" tragen Sie die Domain ein (zum Beispiel, mysite.de), die Sie in Zukunft verwenden möchten. Wenn Sie derzeit keine haben, geben Sie irgendetwas ein, und wiederholen Sie dann einfach die Schritte in diesem Kapitel für Ihre Domain, wenn Sie sie wählen.

Tragen Sie Folgendes ein:

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

Wenn Sie die Version 7.3 anstelle von php7.4-fpm.sock eingetragen haben, tragen Sie ein php7.4-fpm.sock.

Hören Sie auf Port 80 auf server_name, wenn eine Anfrage im Stammverzeichnis kommt /var/www/html nehmen wir die index-Datei. Wenn danach server_name etwas vorhanden ist, suchen wir nach dieser Datei. Wenn wir sie nicht finden, geben wir 404 zurück. Wenn es mit .phpendet, leiten wir durch fpm. Wenn es eine gibt .ht, verbieten wir (403).

  • Wir erstellen einen Link von sites-available in sites-enabled: sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
  • Wir entfernen den Link von default: sudo unlink /etc/nginx/sites-enabled/default
  • Überprüfen auf Fehler: sudo nginx -t
  • Neuladen: sudo systemctl reload nginx

Überprüfen der Funktion:

  • sudo vim /var/www/html/info.php
  • Wir schreiben: <?php phpinfo();
  • Gehen Sie zu /info.php

Sie sollten etwas Ähnliches sehen:

Deployen einer Anwendung auf Laravel 7 unter Ubuntu & Nginx

Jetzt kann diese Datei gelöscht werden: sudo rm /var/www/html/info.php

Laravel installieren

  • 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

  • In MySQL einloggen: mysql -u root -p

  • Eine Datenbank mit dem Namen erstellen laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Root-Zugriff auf gewähren laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Ein Verzeichnis für das Projekt erstellen: sudo mkdir -p

  • Dem Benutzer laravel Rechte auf das Projekt gewähren: sudo chown laravel:laravel

Als nächstes muss das Projekt übertragen werden. Zum Beispiel durch Klonen von Github.

  • cd ./
  • git clone .

Es ist zu beachten, dass, wenn Sie keine statischen Dateien gespeichert haben (z. B. von /public) auf Github, Sie diese natürlich nicht haben werden. Ich habe zum Beispiel dafür einen separaten Branch erstellt, deployvon dem ich dann geklont habe: git clone -b --single-branch ..

  • Abhängigkeiten installieren: composer install
  • Erstellen Sie .env: vim .env

Die Basisversion sieht so aus:

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=

Wenn Sie Ihre .env kopieren, ersetzen Sie APP_ENV durch production, APP_DEBUG durch false und geben Sie die richtigen MySQL-Einstellungen ein.

  • Datenbank migrieren: php artisan migrate
  • Code generieren: php artisan key:generate

Berechtigungen ändern:

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

Das letzte, was bleibt, ist, Nginx auf Laravel umzustellen:

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

Wie beim letzten Mal, wenn Sie die Version 7.3 anstelle von php7.4-fpm.sock eingetragen haben, tragen Sie ein php7.4-fpm.sock.

Domain-Setup bei DigitalOcean

Es ist eigentlich ganz einfach. Sie kaufen eine Domain (überall), gehen zu DigitalOcean in Erstellen->Domains/DNS. Im Feld Eine Domain hinzufügen geben Sie diese Domain ein, klicken Sie auf hinzufügen. Dann gehen Sie zu den Domain-Einstellungen und geben im Feld HOSTNAME ein: @. Wählen Sie das Projekt aus und klicken Sie auf Datensatz erstellen.
Jetzt gehen Sie zur Website, wo Sie die Domain gekauft haben, suchen dort nach den "DNS-Servern" (oder etwas Ähnlichem) und geben die DigitalOcean-Server ein (nämlich ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Jetzt müssen Sie ein wenig (oder viel) warten, bis diese Einstellungen übernommen wurden. Fertig!
Das einzige Problem – Ihre Website wird nur über HTTP erreichbar sein. Um HTTPS zu aktivieren, kommen wir zum nächsten Schritt.

HTTPS einrichten

Installieren Sie certbot und übergeben Sie ihm den Domainnamen (im Format mysite.de) und den Domainnamen mit 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.

Jetzt müssen Sie Nginx erneut konfigurieren (vergessen Sie nicht, Ihre Werte einzufügen):

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

Ich denke, Sie haben bereits verstanden, was für PHP 7.3 geändert werden muss.

Hier ist es eigentlich ganz einfach. Wir leiten einfach alle Anfragen von HTTP (Port 80) auf HTTPS (Port 443) um. Und dort machen wir alles genau wie vorher, aber mit Verschlüsselung.

Es bleibt, die Berechtigungen in der Firewall festzulegen:

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

Jetzt sollte alles wie gewünscht funktionieren.

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

Falls Sie npm-Befehle direkt auf dem Server ausführen müssen, müssen Sie Node.js installieren.

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

Ich habe an diesem Punkt abgeschlossen. Im Grunde genommen bin ich mit dem Ergebnis zufrieden. Vielleicht wechsle ich von DigitalOcean zu etwas näher an Russland und günstiger. Aber da ich bereits alle Verifizierungsrunden auf der Website durchlaufen habe und alles dort gemacht habe, habe ich sie als Beispiel verwendet. Zudem sind die 100 Dollar, die sie als Startguthaben anbieten, eine hervorragende Plattform für Training.

P.S. Ein besonderer Dank geht an den Autor dieses Gists, das die Grundlage für alle oben genannten Schritte bildete. In einigen Punkten funktioniert es nicht für Laravel 7, das habe ich korrigiert.

P.P.S. Wenn Sie zufällig ein erstklassiger Ingenieur sind, der in Bash denkt, bitte urteilen Sie nicht zu streng. Möglicherweise erscheint Ihnen das Niveau dieses Artikels zu niedrig, aber ich wäre froh, so etwas gefunden zu haben, als ich es brauchte. Wenn Sie Verbesserungsvorschläge haben, wäre ich Ihnen sehr dankbar.

Quelle: habr.com

60GB SSD 8Gb DDR4