Implementando unha aplicación en Laravel 7 en Ubuntu e Nginx

Implementando unha aplicación en Laravel 7 en Ubuntu e Nginx

Decidín facer a miña carteira usando Laravel 7. Para que a páxina principal fose unha páxina de destino, e toda a información sobre ela podería cambiarse mediante o panel de administración. Non o punto. Chegou ao despregamento. Atopei un par de bos tutoriais sobre como facelo nun servidor completo con todos os problemas. Non son moi forte na implementación; xeralmente estou máis á fronte que a pila completa. E, se aínda podo escribir e probar en PHP, entón antes de xestionar o servidor, etc. Aínda non medrei. Pero tiven que descifralo.

Agora imos pasar por todos os pasos, comezando polo lanzamento a través de SSH e rematando co sitio de traballo. Tentaremos evitar todas as trampas.

Podes atopar instrucións similares en liña. Despois de todo, por fin atopeino. É certo, non nun só lugar, non sen a axuda de StackOverflow e case en ruso. sufrín. Por iso decidín simplificarlle a vida.

Farémolo todo cunha gota en DigitalOcean. Isto, por suposto, non é necesario; elixe calquera hospedaxe. Cando chegue a un servidor que funcione en Ubuntu, volve. Para aqueles que aínda decidan facelo en DigitalOcean, haberá máis consellos para configurar un dominio. E Ligazón de referencia de $100.

Todos os pasos específicos de DigitalOcean daranse en notas ao pé como estas.

Comecemos.

TL;DR (só comandos básicos)

Crear un usuario

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

Engade SSH a el

  • mkdir ~/.ssh
  • chmod 700 ~/.ssh
  • vim ~/.ssh/authorized_keys
  • Insira a chave pública
  • 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 '<Ваш пароль для 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ón 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;
        }
}

Só configuración HTTP para 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ón HTTPS para 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

Crea unha pinga en DigitalOcean e rexistra unha nova clave SSH

Realmente creo que descubrirás como rexistrarte en DigitalOcean ti mesmo. Non é doado, con moitas verificacións e outras cousas. Se constantemente recibe un erro de rede ao verificar o uso de documentos, tenta facer todo a través dunha VPN, debería axudar.

No menú da parte superior, fai clic crear->Microgotas. Escolle Ubuntu.

En canto te rexistres, recibirás 100 dólares na túa conta. Pero non se deixe enganar. Só tes 60 días para gastalo. E isto é moi pouco. Podes, coma min, querer usar un plan máis caro, para que despois, cando o diñeiro real comece a fluír, poidas cambiar a outro máis barato. Dígoche de inmediato que non vai funcionar. Podes aumentalo, pero non podes diminuílo. Así vai. elixo patrón->$5.

Escollo a rexión máis próxima a nós Frankfurt. Rede VPC->default-fra1

Realizaremos inmediatamente a autenticación a través de SSH. Fai clic Nova clave SSH. Se non tes SSH, hai instrucións moi sinxelas á dereita. Abre un terminal bash e pega ssh-keygen. Despois imos ao ficheiro coa chave pública /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (ou simplemente cat ~/.ssh/id_rsa.pub), copie o contido e pégueo na xanela da esquerda. Calquera nome.

Creamos un nome de host para a gota.

Faga clic aquí Crear Droplet

Crear un novo usuario

  • ssh root@[IP-адрес вашего дроплета]
  • Estás seguro de que queres continuar conectándote (si/non/[pegada dixital])? yes
  • Introduce o teu contrasinal SSH
  • Crear un usuario laravel: adduser laravel
  • Introduce o teu contrasinal e outra información (eu só introduzo o nome completo)
  • Engade o usuario ao grupo sudo: usermod -aG sudo laravel

SSH para novos usuarios

  • Cambia ao novo usuario: su laravel

Realizamos todas as accións máis adiante, ata o final do artigo, en nome do usuario de laravel. Polo tanto, se se interrompe de súpeto, reinicie sesión e ingrese su laravel

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

Abrimos o ficheiro en Vim. Se non estás familiarizado con el, podes traballar en Nano, o teu dereito.

Os comandos máis básicos de Vim

Para usar o editor de Vim ao longo do artigo, só precisa saber o seguinte.

  • Vim ten diferentes modos: Modo normal, no que introduces comandos e seleccionas modos e outros.
  • Para saír de calquera modo e volver ao modo normal, só tes que premer Esc
  • Moverse: só podes usar frechas
  • Saír sen gardar <Normal mode>: :q!
  • Saír e gardar <Normal mode>: :wq
  • Cambia ao modo de entrada de texto <Normal mode>: i (do inglés. inserir)
  • Inserimos a nosa clave pública (o que fixemos anteriormente)
  • Protexemos contra cambios: chmod 600 ~/.ssh/authorized_keys

Instalación dun cortalumes

  • Vexamos todas as opcións dispoñibles: sudo ufw app list
  • Permitir OpenSSH (se non, bloquearanos): sudo ufw allow OpenSSH
  • Imos lanzar o firewall: sudo ufw enable, y
  • Comprobamos: sudo ufw status

Status: active

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

Todo está ben.

Instalación de Nginx

Durante a instalación, ás veces preguntaráselle "Estás seguro?" Resposta y (ben, só se estás seguro).

  • sudo apt update
  • sudo apt install nginx

Engadindo Nginx á configuración do firewall

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

Vai á túa IP. Se todo vai ben, deberías ver o seguinte.

Implementando unha aplicación en Laravel 7 en Ubuntu e Nginx

Instalación de MySQL

  • sudo apt install mysql-server
  • Lanzamento dun script de protección automático sudo mysql_secure_installation

Responde as preguntas feitas. Se non sabes que responder, aquí tes algunhas opcións suxeridas:

  • Validar o complemento de contrasinal - N

  • Queres eliminar usuarios anónimos? — Y

  • Non permitir o inicio de sesión de root de forma remota? — N

  • Queres eliminar a base de datos de proba e acceder a ela? — N

  • Volver cargar as táboas de privilexios agora? — Y

  • Imos a MySQL: sudo mysql

  • Vexamos os métodos de acceso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Establece un contrasinal para root: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<Ваш пароль для MySQL>';

  • Vexamos de novo os métodos de acceso: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Aplique os cambios e saia de MySQL: FLUSH PRIVILEGES; и exit

  • Agora, para iniciar sesión en MySQL, cómpre usar mysql -u root -p e introduza o contrasinal

Instalando PHP

Usemos un repositorio de terceiros 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

Agora imos escoller. Para Laravel 7, podes escoller PHP 7.3 ou 7.4. A única diferenza estará nos números 3 e 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 con solicitudes PHP. mysql, por suposto, para traballar con MySQL.

A partir de agora fareino todo en 7.4.

Configurando Nginx

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

En lugar de "<O teu dominio>" introduce o dominio (por exemplo, mysite.ru) que quere utilizar no futuro. Se aínda non tes un, escribe calquera e repite os pasos deste capítulo para o teu dominio cando o selecciones.

Introduza o seguinte:

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

Se escolleu a versión 7.3 php7.4-fpm.sock escribir en php7.4-fpm.sock.

Escoita o porto 80 activado server_namecando chegamos á solicitude raíz /var/www/html colle o ficheiro índice. Se despois server_name Hai algo, estamos a buscar un ficheiro deste tipo. Se non o atopamos, botamos o 404. Se remata con .php, atravesar fpm... Se hai .ht, prohibir (403).

  • Facendo unha ligazón desde sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Eliminando a ligazón a default: sudo unlink /etc/nginx/sites-enabled/default
  • Comprobando erros: sudo nginx -t
  • Reiniciar: sudo systemctl reload nginx

Comprobación do traballo:

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

Deberías ver algo así:

Implementando unha aplicación en Laravel 7 en Ubuntu e Nginx

Agora pódese eliminar este ficheiro: sudo rm /var/www/html/info.php

Instalar 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

  • Imos a MySQL: mysql -u root -p

  • Crea unha base de datos co nome laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Crea un cartafol para o proxecto: sudo mkdir -p <Имя проекта>

  • Proporcionamos ao usuario laravel dereitos sobre o proxecto: sudo chown laravel:laravel <Имя проекта>

A continuación, cómpre transferir o proxecto. Por exemplo, a clonación desde Github.

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

Paga a pena ter en conta que se non gardou ficheiros estáticos (por exemplo, de /public) en Github, entón naturalmente non os terás. Por exemplo, creei un fío separado para resolver isto deploy, do que xa clonei: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instalación de dependencias: composer install
  • Crear .env: vim .env

A súa versión básica é así:

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>

Se copias o teu .env, substitúe APP_ENV por produción, APP_DEBUG por false e introduce a configuración correcta para MySQL.

  • Migrando a base de datos: php artisan migrate
  • Xerando o código: php artisan key:generate

Cambio 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

O último que queda é reconfigurar Nginx para 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;
    }
}

Como a última vez, se escolleches a versión 7.3 php7.4-fpm.sock escribir en php7.4-fpm.sock.

Configurando un dominio en DigitalOcean

En realidade, todo é moi sinxelo. Compras un dominio (en calquera lugar), cambia a DigitalOcean en crear->Dominios/DNS... En campo Engade un dominio introduces este dominio e fai clic en engadir. A continuación, vai á configuración do dominio e ao campo HOMENOME entrar @. Seleccione un proxecto e prema Crear rexistro.
Agora vai ao sitio onde compraches o dominio, busca alí "Servidores DNS" (ou algo similar) e introduce os servidores de DigitalOcean (é dicir ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Agora cómpre esperar un pouco (ou moito) ata que se acepten estas opcións. Listo!
O único problema é que o teu sitio abrirase só como HTTP. Para ter HTTPS, pasa á seguinte parte.

Configurando HTTPS

Instale certbot e páselle o nome de dominio (formato mysite.ru) e nome de dominio con 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.<Ваш домен>

Agora tes que reconfigurar Nginx (non esquezas substituír os teus valores):

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

Creo que xa entendes o que hai que cambiar para PHP 7.3.

Aquí, de feito, todo é sinxelo. Simplemente rediriximos todas as solicitudes de HTTP (porto 80) a HTTPS (porto 443). E alí facemos todo igual que antes, pero con cifrado.

Todo o que queda é establecer os permisos no firewall:

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

Agora todo debería funcionar como debería.

[Avanzado] Instalación de Node.js

Se de súpeto precisa executar comandos npm directamente no servidor, debe instalar Node.js.

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

Xa está, parei nesta fase. En principio, estou satisfeito co resultado. Quizais cambie de DigitalOcean a algún lugar máis próximo a Rusia e máis barato. Pero como xa pasara por todas as roldas de verificación do sitio e fixen todo alí, mostreinos co exemplo. Ademais, os seus 100 dólares de partida son un excelente trampolín para adestrar.

PD Agradecemento especial ao autor esta esencia, que serviu de base para todas as actuacións anteriores. Nalgúns casos non funciona para Laravel 7, arranxeino.

PPS Se es un enxeñeiro superior que pensa en comandos bash, non xulgues con dureza. Podes considerar que este artigo é de baixo nivel, pero estaría encantado de atopar un cando o necesitase. Se hai suxestións de mellora, estou a favor.

Fonte: www.habr.com

Engadir un comentario