Déployer une application sur Laravel 7 sur Ubuntu et Nginx

Déployer une application sur Laravel 7 sur Ubuntu et Nginx

J'ai décidé de créer mon portfolio en utilisant Laravel 7. Pour que la page principale soit une page de destination et que toutes les informations qu'elle contient puissent être modifiées à l'aide du panneau d'administration. Ce n’est pas la question. Il s’agissait du déploiement. J'ai trouvé quelques bons tutoriels sur la façon de procéder sur un serveur à part entière avec tous les problèmes. Je ne suis pas très fort en déploiement, je suis généralement plus front que full stack. Et, si je peux encore écrire et tester en PHP, alors avant de gérer le serveur, etc. Je n'ai pas encore grandi. Mais je devais le comprendre.

Nous allons maintenant parcourir toutes les étapes, en commençant par le lancement via SSH et en terminant par le site de travail. Nous essaierons d’éviter tous les pièges.

Vous pourrez peut-être trouver des instructions similaires en ligne. Après tout, je l'ai enfin trouvé. C'est vrai, pas au même endroit, pas sans l'aide de StackOverflow, et à peine en russe. J'ai souffert. C'est pourquoi j'ai décidé de vous simplifier la vie.

Nous ferons tout avec un droplet sur DigitalOcean. Ceci n’est bien sûr pas nécessaire ; choisissez n’importe quel hébergement. Lorsque vous atteignez un serveur fonctionnel sur Ubuntu, revenez. Pour ceux qui décident encore de le faire sur DigitalOcean, il y aura plus de conseils sur la création d'un domaine. Et Lien de parrainage de 100 $.

Toutes les étapes spécifiques à DigitalOcean seront indiquées dans des notes de bas de page comme celles-ci.

Commençons.

TL;DR (commandes de base uniquement)

Créer un utilisateur

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

Ajoutez-y SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Insérez la clé publique
  • chmod 600 ~/.ssh/authorized_keys

Pare-feu

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

Configuration de base:

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

Uniquement configuration HTTP pour 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;
    }
}

Paramètre HTTPS pour 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

Créez un droplet sur DigitalOcean et enregistrez une nouvelle clé SSH

Je crois sincèrement que vous découvrirez vous-même comment vous inscrire sur DigitalOcean. Ce n'est pas facile, avec beaucoup de vérifications et autres choses. Si vous obtenez constamment une erreur réseau lors de la vérification à l’aide de documents, essayez de tout faire via un VPN, cela devrait vous aider.

Dans le menu en haut, cliquez sur Création->Gouttelettes... Nous choisissons Ubuntu.

Dès votre inscription, vous recevrez 100 $ sur votre compte. Mais ne vous y trompez pas. Vous n'avez que 60 jours pour le dépenser. Et c'est très peu. Vous souhaiterez peut-être, comme moi, utiliser un forfait plus cher, de sorte que plus tard, lorsque l'argent réel commencera à affluer, vous pourrez passer à un forfait moins cher. Je vous le dis tout de suite, ça ne marchera pas. Vous pouvez l’augmenter, mais vous ne pouvez pas le diminuer. Ainsi va. je choisis Standard->$5.

Je choisis la région la plus proche de chez nous Francfort. Réseau VPC->par défaut-fra1

Nous effectuerons immédiatement l'authentification via SSH. Cliquez sur Nouvelle clé SSH. Si vous n'avez pas SSH, il y a des instructions très simples sur la droite. Ouvrez un terminal bash et collez ssh-keygen. Ensuite on va au fichier avec la clé publique /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (ou simplement cat ~/.ssh/id_rsa.pub), copiez le contenu et collez-le dans la fenêtre de gauche. N'importe quel nom.

Nous trouvons un nom d'hôte pour le droplet.

Cliquez ici Créer une gouttelette

Créer un nouvel utilisateur

  • ssh root@[IP-адрес вашего дроплета]
  • Êtes-vous sûr de vouloir continuer à vous connecter (oui/non/[empreinte digitale]) ? yes
  • Entrez votre mot de passe SSH
  • Créer un utilisateur Laravel: adduser laravel
  • Entrez votre mot de passe et d'autres informations (je ne saisis que le nom complet)
  • Ajoutez l'utilisateur au groupe sudo : usermod -aG sudo laravel

SSH pour le nouvel utilisateur

  • Basculez vers le nouvel utilisateur : su laravel

Nous effectuons toutes les actions ultérieures, jusqu'à la fin de l'article, au nom de l'utilisateur de Laravel. Par conséquent, si vous êtes soudainement interrompu, reconnectez-vous et entrez su laravel

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

Nous avons ouvert le fichier dans Vim. Si vous ne le connaissez pas du tout, vous pouvez travailler dans Nano, votre droit.

Les commandes Vim les plus basiques

Afin d'utiliser l'éditeur Vim tout au long de l'article, il vous suffit de connaître les éléments suivants.

  • Vim a différents modes : Le mode Normal, dans lequel vous entrez des commandes et sélectionnez des modes et autres.
  • Pour quitter n'importe quel mode et revenir au mode normal, appuyez simplement sur Esc
  • Déplacez-vous : vous pouvez simplement utiliser les flèches
  • Quitter sans sauvegarder <Normal mode>: :q!
  • Quitter et sauvegarder <Normal mode>: :wq
  • Passer en mode de saisie de texte <Normal mode>: i (de l'anglais. insérer)
  • Nous insérons notre clé publique (ce que nous avons fait ci-dessus)
  • Nous protégeons contre les changements : chmod 600 ~/.ssh/authorized_keys

Installer un pare-feu

  • Examinons tous les paramètres disponibles : sudo ufw app list
  • Autoriser OpenSSH (sinon cela nous verrouillera) : sudo ufw allow OpenSSH
  • Lançons le pare-feu : sudo ufw enable, y
  • vérifier: sudo ufw status

Status: active

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

Tout va bien.

Installation de Nginx

Lors de l'installation, il vous sera parfois demandé « Êtes-vous sûr ? » Répondre y (enfin, seulement si vous en êtes sûr).

  • sudo apt update
  • sudo apt install nginx

Ajout de Nginx aux paramètres du pare-feu

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

Accédez à votre IP. Si tout se passe bien, vous devriez voir ce qui suit.

Déployer une application sur Laravel 7 sur Ubuntu et Nginx

Installation de MySQL

  • sudo apt install mysql-server
  • Lancer un script de protection automatique sudo mysql_secure_installation

Répondez aux questions posées. Si vous ne savez pas quoi répondre, voici quelques options suggérées :

  • Valider le plugin de mot de passe - N

  • Supprimer les utilisateurs anonymes ? — Y

  • Interdire la connexion root à distance ? — N

  • Supprimer la base de données de test et y accéder ? — N

  • Recharger les tables de privilèges maintenant ? — Y

  • Passons à MySQL : sudo mysql

  • Regardons les méthodes d'accès : SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Définissez un mot de passe pour root : ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Regardons à nouveau les méthodes d'accès : SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Appliquez les modifications et quittez MySQL : FLUSH PRIVILEGES; и exit

  • Maintenant, pour vous connecter à MySQL, vous devez utiliser mysql -u root -p et entrez le mot de passe

Installation de PHP

Utilisons un référentiel tiers de Ondrej 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

Maintenant, choisissons. Pour Laravel 7, vous pouvez choisir PHP 7.3 ou 7.4. La seule différence résidera dans les chiffres 3 et 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) fonctionne avec les requêtes PHP. mysql, bien sûr, pour travailler avec MySQL.

A partir de maintenant, je ferai tout sur 7.4.

Configuration de Nginx

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

Au lieu de "<Votre domaine>", saisissez le domaine (par exemple, mysite.ru) que vous souhaitez utiliser à l'avenir. Si vous n'en avez pas encore, écrivez-en un, puis répétez simplement les étapes de ce chapitre pour votre domaine lorsque vous le sélectionnez.

Entrez ce qui suit :

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

Si vous avez plutôt choisi la version 7.3 php7.4-fpm.sock inscrire php7.4-fpm.sock.

Écoutez le port 80 sur server_namequand on arrive à la requête racine /var/www/html prenez le fichier d'index. Si après server_name Il y a quelque chose, nous recherchons un tel fichier. Si nous ne le trouvons pas, nous jetons 404. S'il se termine par .php, parcourir fpm. S'il y a .ht, interdire (403).

  • Faire un lien depuis sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Supprimer le lien vers default: sudo unlink /etc/nginx/sites-enabled/default
  • Vérification des erreurs : sudo nginx -t
  • Redémarrer : sudo systemctl reload nginx

Vérification du travail :

  • sudo vim /var/www/html/info.php
  • Nous écrivons: <?php phpinfo();
  • Aller à <Ваш IP>/info.php

Vous devriez voir quelque chose comme ceci :

Déployer une application sur Laravel 7 sur Ubuntu et Nginx

Maintenant, ce fichier peut être supprimé : 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

  • Passons à MySQL : mysql -u root -p

  • Créez une base de données avec le nom Laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Nous fournissons un accès root à Laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Créez un dossier pour le projet : sudo mkdir -p <Имя проекта>

  • Nous fournissons à l'utilisateur Laravel droits sur le projet : sudo chown laravel:laravel <Имя проекта>

Ensuite, vous devez transférer le projet. Par exemple, le clonage depuis Github.

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

Il convient de noter que si vous n'avez pas enregistré de fichiers statiques (par exemple, à partir de /public) sur Github, alors naturellement vous ne les aurez pas. Par exemple, j'ai créé un fil de discussion séparé pour résoudre ce problème deploy, à partir duquel j'ai déjà cloné : git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Installation des dépendances : composer install
  • Créez .env : vim .env

La version de base ressemble à ceci :

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>

Si vous copiez votre .env, remplacez APP_ENV par production, APP_DEBUG par false et entrez les paramètres corrects pour MySQL.

  • Migration de la base de données : php artisan migrate
  • Génération du code : php artisan key:generate

Modification des autorisations :

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

Il ne reste plus qu'à reconfigurer Nginx pour 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;
    }
}

Comme la dernière fois, si vous avez plutôt choisi la version 7.3 php7.4-fpm.sock inscrire php7.4-fpm.sock.

Créer un domaine sur DigitalOcean

Tout est en fait très simple. Vous achetez un domaine (n'importe où), passez à DigitalOcean à Création->Domaines/DNS. оле Ajouter un domaine vous entrez ce domaine et cliquez sur ajouter. Allez ensuite dans les paramètres du domaine et sur le terrain HOSTNAME entrer @. Sélectionnez un projet et cliquez sur Créer un enregistrement.
Allez maintenant sur le site où vous avez acheté le domaine, recherchez-y « Serveurs DNS » (ou quelque chose de similaire) et entrez les serveurs DigitalOcean (à savoir ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Vous devez maintenant attendre un peu (ou beaucoup) jusqu'à ce que ces paramètres soient acceptés. Prêt!
Le seul problème est que votre site s'ouvrira uniquement en HTTP. Pour avoir HTTPS, passez à la partie suivante.

Configuration de HTTPS

Installez certbot et transmettez-lui le nom de domaine (format mysite.ru) et nom de domaine avec 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.<Ваш домен>

Vous devez maintenant reconfigurer Nginx (n'oubliez pas de remplacer vos valeurs) :

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

Je pense que vous comprenez déjà ce qui doit être modifié pour PHP 7.3.

Ici en fait, tout est simple. Nous redirigeons simplement toutes les requêtes de HTTP (port 80) vers HTTPS (port 443). Et là, on fait tout comme avant, mais avec cryptage.

Il ne reste plus qu'à définir les autorisations dans le pare-feu :

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

Maintenant, tout devrait fonctionner comme il se doit.

[Avancé] Installation de Node.js

Si vous devez soudainement exécuter des commandes npm directement sur le serveur, vous devez installer Node.js.

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

Ça y est, je me suis arrêté à ce stade. En principe, je suis satisfait du résultat. Peut-être que je passerai de DigitalOcean à un endroit plus proche de la Russie et moins cher. Mais comme j'avais déjà effectué tous les tours de vérification sur le site et que j'y avais tout fait, je leur ai montré l'exemple. De plus, leur 100 $ de départ constitue un excellent tremplin pour la formation.

PS Un merci spécial à l'auteur cet essentiel, qui a servi de base à toutes les actions ci-dessus. Dans certains cas, cela ne fonctionne pas pour Laravel 7, je l'ai corrigé.

PPS Si vous êtes un ingénieur de haut niveau qui pense en commandes bash, ne jugez pas durement. Vous trouverez peut-être cet article de bas niveau, mais j'aurais été heureux d'en trouver un lorsque j'en avais besoin. S'il y a des suggestions d'amélioration, je suis tout à fait d'accord.

Source: habr.com

Ajouter un commentaire