Desplegant una aplicació a Laravel 7 a Ubuntu i Nginx

Desplegant una aplicació a Laravel 7 a Ubuntu i Nginx

Vaig decidir fer la meva cartera amb Laravel 7. Per tal que la pàgina principal fos una pàgina de destinació, i tota la informació que s'hi podria canviar mitjançant el tauler d'administració. No és el punt. Va arribar al desplegament. Vaig trobar un parell de bons tutorials sobre com fer-ho en un servidor complet amb tots els problemes. No sóc molt fort en el desplegament; generalment sóc més al davant que al full stack. I, si encara puc escriure i provar en PHP, abans de gestionar el servidor, etc. Encara no he crescut. Però ho havia d'esbrinar.

Ara farem tots els passos, començant pel llançament mitjançant SSH i acabant amb el lloc de treball. Intentarem evitar totes les trampes.

És possible que pugueu trobar instruccions similars en línia. Després de tot, finalment el vaig trobar. És cert, no en un sol lloc, no sense l'ajuda de StackOverflow, i gairebé no en rus. Vaig patir. Per això vaig decidir simplificar-te la vida.

Ho farem tot amb una gota a DigitalOcean. Això, per descomptat, no és necessari; trieu qualsevol allotjament. Quan arribeu a un servidor que funcioni a Ubuntu, torneu. Per a aquells que encara decideixin fer-ho a DigitalOcean, hi haurà més consells per configurar un domini. I Enllaç de referència de 100 $.

Tots els passos específics de DigitalOcean es donaran en notes al peu com aquestes.

Comencem.

TL;DR (només ordres bàsiques)

Crear un usuari

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

Afegiu-hi SSH

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Introduïu la clau pública
  • chmod 600 ~/.ssh/authorized_keys

Tallafoc

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

Configuració bàsica:

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

Només configuració HTTP per a 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;
    }
}

Configuració HTTPS per a 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

Creeu una gota a DigitalOcean i registreu una nova clau SSH

Realment crec que descobriràs com registrar-te a DigitalOcean tu mateix. No és fàcil, amb moltes verificacions i altres coses. Si constantment obteniu un error de xarxa en verificar l'ús de documents, proveu de fer-ho tot mitjançant una VPN, hauria d'ajudar.

Al menú de la part superior, feu clic Create->Gotes. Tria Ubuntu.

Tan bon punt us registreu, rebreu 100 dòlars al vostre compte. Però no us deixeu enganyar. Només tens 60 dies per passar-ho. I això és ben poc. És possible que, com jo, vulgueu utilitzar un pla més car, de manera que més tard, quan els diners reals comencin a fluir, pugueu canviar a un de més barat. De seguida et diré que no funcionarà. Podeu augmentar-lo, però no podeu disminuir-lo. I així segueix. escullo Estàndard->$5.

Trio la regió més propera a nosaltres Frankfurt. Xarxa VPC->default-fra1

Immediatament realitzarem l'autenticació mitjançant SSH. Feu clic Nova clau SSH. Si no teniu SSH, hi ha instruccions molt senzilles a la dreta. Obriu un terminal bash i enganxeu-lo ssh-keygen. Després anem al fitxer amb la clau pública /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (o simplement cat ~/.ssh/id_rsa.pub), copieu el contingut i enganxeu-lo a la finestra de l'esquerra. Qualsevol nom.

Aconseguim un nom d'amfitrió per a la gota.

Empenta Crea una gota

Crea un usuari nou

  • ssh root@[IP-адрес вашего дроплета]
  • Esteu segur que voleu continuar connectant-vos (sí/no/[empremta digital])? yes
  • Introduïu la vostra contrasenya SSH
  • Crear un usuari laravel: adduser laravel
  • Introduïu la vostra contrasenya i altra informació (només introdueixo el nom complet)
  • Afegeix l'usuari al grup sudo: usermod -aG sudo laravel

SSH per a usuari nou

  • Canvia al nou usuari: su laravel

Totes les accions les fem més endavant, fins al final de l'article, en nom de l'usuari de laravel. Per tant, si us interrompen de sobte, torneu a iniciar sessió i entreu su laravel

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

Vam obrir el fitxer a Vim. Si no ho coneixeu gens, podeu treballar a Nano, el vostre dret.

Les ordres més bàsiques de Vim

Per utilitzar l'editor de Vim al llarg de l'article, només cal saber el següent.

  • Vim té diferents modes: Mode normal, en el qual introduïu ordres i seleccioneu modes i altres.
  • Per sortir de qualsevol mode i tornar al mode normal, només cal que premeu Esc
  • Moveu-vos: només podeu utilitzar les fletxes
  • Sortir sense desar <Normal mode>: :q!
  • Sortir i guardar <Normal mode>: :wq
  • Canvia al mode d'entrada de text <Normal mode>: i (de l'anglès. inserir)
  • Inserim la nostra clau pública (que vam fer més amunt)
  • Protegim contra els canvis: chmod 600 ~/.ssh/authorized_keys

Instal·lació d'un tallafoc

  • Vegem tots els paràmetres disponibles: sudo ufw app list
  • Permet OpenSSH (en cas contrari ens bloquejarà): sudo ufw allow OpenSSH
  • Llencem el tallafoc: sudo ufw enable, y
  • Comprovem: sudo ufw status

Status: active

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

Tot està bé.

Instal·lant Nginx

Durant la instal·lació, de vegades se us preguntarà "Esteu segur?" Respon y (bé, només si n'estàs segur).

  • sudo apt update
  • sudo apt install nginx

Afegint Nginx a la configuració del tallafoc

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

Aneu a la vostra IP. Si tot va bé, hauríeu de veure el següent.

Desplegant una aplicació a Laravel 7 a Ubuntu i Nginx

Instal·lant MySQL

  • sudo apt install mysql-server
  • Llançament d'un script de protecció automàtic sudo mysql_secure_installation

Respon les preguntes que es fan. Si no sabeu què respondre, aquí teniu algunes opcions suggerides:

  • Valida el connector de contrasenya - N

  • Vols suprimir usuaris anònims? — Y

  • No permeteu l'inici de sessió root de forma remota? — N

  • Eliminar la base de dades de prova i accedir-hi? — N

  • Torneu a carregar les taules de privilegis ara? — Y

  • Anem a MySQL: sudo mysql

  • Vegem els mètodes d'accés: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Establiu una contrasenya per a root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Vegem de nou els mètodes d'accés: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Apliqueu els canvis i sortiu de MySQL: FLUSH PRIVILEGES; и exit

  • Ara, per iniciar sessió a MySQL, cal utilitzar mysql -u root -p i introduïu la contrasenya

Instal·lant PHP

Utilitzem un repositori de tercers 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

Ara escollim. Per a Laravel 7, podeu triar PHP 7.3 o 7.4. L'única diferència estarà en els números 3 i 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) funciona amb sol·licituds PHP. mysql, per descomptat, per treballar amb MySQL.

A partir d'ara ho faré tot el 7.4.

Configuració de Nginx

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

En lloc de "<El vostre domini>", introduïu el domini (per exemple, mysite.ru) que voleu utilitzar en el futur. Si encara no en tens cap, escriu-ne cap i, després, repetiu els passos d'aquest capítol per al vostre domini quan el seleccioneu.

Introdueixi la següent:

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 trieu la versió 7.3 php7.4-fpm.sock Escriu en php7.4-fpm.sock.

Escolta el port 80 activat server_namequan arribem a la sol·licitud d'arrel /var/www/html agafa el fitxer índex. Si després server_name Hi ha alguna cosa, estem buscant un fitxer així. Si no el trobem, llencem 404. Si acaba amb .php, passar per fpm... Si hi ha .ht, prohibir (403).

  • Fent un enllaç des de sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Eliminació de l'enllaç a default: sudo unlink /etc/nginx/sites-enabled/default
  • Comprovació d'errors: sudo nginx -t
  • Reinicieu: sudo systemctl reload nginx

Comprovació de l'obra:

  • sudo vim /var/www/html/info.php
  • Nosaltres escrivim: <?php phpinfo();
  • Anem a <Ваш IP>/info.php

Hauríeu de veure alguna cosa com això:

Desplegant una aplicació a Laravel 7 a Ubuntu i Nginx

Ara es pot suprimir aquest fitxer: sudo rm /var/www/html/info.php

Instal·leu 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

  • Anem a MySQL: mysql -u root -p

  • Creeu una base de dades amb el nom laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  • Oferim accés root a laravel: GRANT ALL ON laravel.* TO 'root'@'localhost' IDENTIFIED BY '<Ваш пароль от MySQL>';

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Creeu una carpeta per al projecte: sudo mkdir -p <Имя проекта>

  • Proporcionem a l'usuari laravel drets sobre el projecte: sudo chown laravel:laravel <Имя проекта>

A continuació, heu de transferir el projecte. Per exemple, la clonació des de Github.

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

Val la pena tenir en compte que si no deseu fitxers estàtics (per exemple, de /public) a Github, llavors, naturalment, no els tindreu. Per exemple, vaig crear un fil separat per resoldre això deploy, del qual ja vaig clonar: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instal·lació de dependències: composer install
  • Crea .env: vim .env

La versió bàsica és així:

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 copieu el vostre .env, substituïu APP_ENV per producció, APP_DEBUG per false i introduïu la configuració correcta per a MySQL.

  • Migració de la base de dades: php artisan migrate
  • Generant el codi: php artisan key:generate

Canvi de permisos:

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

L'últim que queda és reconfigurar Nginx per a 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;
    }
}

Com la darrera vegada, si vau triar la versió 7.3 php7.4-fpm.sock Escriu en php7.4-fpm.sock.

Configuració d'un domini a DigitalOcean

En realitat, tot és molt senzill. Compreu un domini (a qualsevol lloc), canvieu a DigitalOcean a Create->Dominis/DNS... En camp Afegiu un domini entreu aquest domini i feu clic a afegir. A continuació, aneu a la configuració del domini i al camp NOM D'HOSTAL entrar @. Seleccioneu un projecte i feu clic Crear registre.
Ara aneu al lloc on heu comprat el domini, cerqueu "Servidors DNS" allà (o alguna cosa semblant) i introduïu els servidors de DigitalOcean (és a dir, ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Ara cal esperar una mica (o molt) fins que s'acceptin aquests paràmetres. A punt!
L'únic problema és que el vostre lloc només s'obrirà com a HTTP. Per tenir HTTPS, passeu a la part següent.

Configurant HTTPS

Instal·leu certbot i passeu-li el nom de domini (format mysite.ru) i el nom de domini amb 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.<Ваш домен>

Ara heu de reconfigurar Nginx (no us oblideu de substituir els vostres valors):

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

Crec que ja enteneu què cal canviar per PHP 7.3.

Aquí, de fet, tot és senzill. Simplement redirigim totes les sol·licituds d'HTTP (port 80) a HTTPS (port 443). I allà ho fem tot igual que abans, però amb xifrat.

Només queda establir els permisos al tallafoc:

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

Ara tot hauria de funcionar com cal.

[Avançat] Instal·lació de Node.js

Si de sobte necessiteu executar ordres npm directament al servidor, haureu d'instal·lar Node.js.

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

Això és tot, em vaig aturar en aquesta etapa. En principi, estic satisfet amb el resultat. Potser canviaré de DigitalOcean a un lloc més proper a Rússia i més barat. Però com que ja havia passat per totes les rondes de verificació del lloc i vaig fer-ho tot allà, les vaig mostrar amb l'exemple. A més, els seus 100 dòlars inicials són un excel·lent trampolí per entrenar.

PD Agraïment especial a l'autor aquesta essència, que va servir de base per a totes les actuacions anteriors. En alguns casos no funciona per a Laravel 7, ho vaig arreglar.

PPS Si sou un enginyer superior que pensa en ordres bash, si us plau, no jutgeu amb duresa. Potser trobareu que aquest article és de nivell baix, però m'hauria agradat trobar-ne un quan ho necessités. Si hi ha suggeriments per millorar, estic a favor.

Font: www.habr.com

Afegeix comentari