Implantando um aplicativo no Laravel 7 no Ubuntu e Nginx

Implantando um aplicativo no Laravel 7 no Ubuntu e Nginx

Resolvi fazer meu portfólio usando Laravel 7. Para que a página principal fosse uma landing page, e todas as informações nela contidas pudessem ser alteradas através do painel de administração. Não é esse o ponto. Chegou à implantação. Encontrei alguns bons tutoriais sobre como fazer isso em um servidor completo com todos os problemas. Não sou muito forte em implantação; geralmente sou mais front do que full stack. E, se ainda consigo escrever e testar em PHP, antes de gerenciar o servidor, etc. Eu ainda não cresci. Mas eu tive que descobrir.

Agora passaremos por todas as etapas, começando com o lançamento via SSH e terminando com o site de trabalho. Tentaremos evitar todas as armadilhas.

Você pode encontrar instruções semelhantes online. Afinal, finalmente encontrei. É verdade, não em um só lugar, não sem a ajuda do StackOverflow e dificilmente em russo. Eu sofri. Por isso decidi simplificar sua vida.

Faremos tudo com uma gota no DigitalOcean. Isso, claro, não é necessário, escolha qualquer hospedagem. Quando você chegar a um servidor em funcionamento no Ubuntu, volte. Para quem ainda decidir fazer na DigitalOcean, haverá mais dicas sobre como configurar um domínio. E Link de referência de $ 100.

Todas as etapas específicas da DigitalOcean serão fornecidas em notas de rodapé como estas.

Vamos começar.

TL;DR (somente comandos básicos)

Crie um usuário

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

Adicione SSH a ele

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

Configuração 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;
        }
}

Apenas configuração 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;
    }
}

Configuração 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

Crie um droplet na DigitalOcean e registre uma nova chave SSH

Eu realmente acredito que você mesmo descobrirá como se registrar na DigitalOcean. Não é fácil, com muitas verificações e outras coisas. Se você receber constantemente um erro de rede ao verificar documentos, tente fazer tudo por meio de uma VPN, isso deve ajudar.

No menu superior, clique em Crie->Gotitas. Escolher Ubuntu.

Assim que você se registrar, você receberá $ 100 em sua conta. Mas não se deixe enganar. Você só tem 60 dias para gastá-lo. E isso é muito pouco. Você pode, como eu, querer usar um plano mais caro, para que mais tarde, quando o dinheiro real começar a fluir, você possa mudar para um mais barato. Direi imediatamente que não vai funcionar. Você pode aumentá-lo, mas não pode diminuí-lo. Assim vai. eu escolho Padrão->$5.

Eu escolho a região mais próxima de nós Frankfurt. Rede VPC->padrão-fra1

Realizaremos imediatamente a autenticação via SSH. Clique Nova Chave SSH. Se você não possui SSH, há instruções muito simples à direita. Abra um terminal bash e cole ssh-keygen. Então vamos para o arquivo com a chave pública /Users/<Ваше имя пользователя>/.ssh/id_rsa.pub (ou simplesmente cat ~/.ssh/id_rsa.pub), copie o conteúdo e cole na janela à esquerda. Qualquer nome.

Criamos um nome de host para o droplet.

Clique aqui Criar gota

Criar um novo usuário

  • ssh root@[IP-адрес вашего дроплета]
  • Tem certeza de que deseja continuar se conectando (sim/não/[impressão digital])? yes
  • Digite sua senha SSH
  • Crie um usuário laravel: adduser laravel
  • Digite sua senha e outras informações (só insiro o nome completo)
  • Adicione o usuário ao grupo sudo: usermod -aG sudo laravel

SSH para novo usuário

  • Mude para o novo usuário: su laravel

Realizamos todas as ações posteriormente, até o final do artigo, em nome do usuário laravel. Portanto, se você for interrompido repentinamente, faça login novamente e digite su laravel

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

Abrimos o arquivo no Vim. Se você não está familiarizado com isso, você pode trabalhar no Nano, seu direito.

Os comandos mais básicos do Vim

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

  • O Vim possui diferentes modos: Modo normal, no qual você insere comandos e seleciona modos e outros.
  • Para sair de qualquer modo e retornar ao modo normal, basta pressionar Esc
  • Mova-se: você pode apenas usar as setas
  • Sair sem salvar <Normal mode>: :q!
  • Sair e salvar <Normal mode>: :wq
  • Mudar para o modo de entrada de texto <Normal mode>: i (do inglês. inserir)
  • Inserimos nossa chave pública (o que fizemos acima)
  • Protegemos contra mudanças: chmod 600 ~/.ssh/authorized_keys

Instalando um firewall

  • Vejamos todas as configurações disponíveis: sudo ufw app list
  • Permitir OpenSSH (caso contrário, ele nos bloqueará): sudo ufw allow OpenSSH
  • Vamos iniciar o firewall: sudo ufw enable, y
  • Verificamos: sudo ufw status

Status: active

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

Está tudo bem.

Instalando o Nginx

Durante a instalação, às vezes será perguntado "Tem certeza?" Responder y (bem, só se você tiver certeza).

  • sudo apt update
  • sudo apt install nginx

Adicionando Nginx às configurações 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)

Vá para o seu IP. Se tudo correr bem, você deverá ver o seguinte.

Implantando um aplicativo no Laravel 7 no Ubuntu e Nginx

Instalando MySQL

  • sudo apt install mysql-server
  • Iniciando um script de proteção automática sudo mysql_secure_installation

Responda às perguntas feitas. Se você não sabe o que responder, aqui estão algumas opções sugeridas:

  • Plug-in de validação de senha - N

  • Remover usuários anônimos? - Y

  • Proibir login root remotamente? - N

  • Remover banco de dados de teste e acesso a ele? - N

  • Recarregar tabelas de privilégios agora? - Y

  • Vamos para o MySQL: sudo mysql

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

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

  • Vejamos os métodos de acesso novamente: SELECT user,authentication_string,plugin,host FROM mysql.user;

  • Aplique as alterações e saia do MySQL: FLUSH PRIVILEGES; и exit

  • Agora, para entrar no MySQL você precisa usar mysql -u root -p e digite a senha

Instalando PHP

Vamos usar um repositório de terceiros de Ondrej Sury

  • 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 vamos escolher. Para Laravel 7, você pode escolher PHP 7.3 ou 7.4. A única diferença 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 com solicitações PHP. mysql, claro, para trabalhar com MySQL.

De agora em diante farei tudo no 7.4.

Configurando o Nginx

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

Em vez de "<Seu domínio>" insira o domínio (por exemplo, mysite.ru) que você deseja usar no futuro. Se você ainda não tem um, escreva um e repita as etapas deste capítulo para o seu domínio ao selecioná-lo.

Digite 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 você escolheu a versão 7.3 php7.4-fpm.sock escrever em php7.4-fpm.sock.

Ouça a porta 80 ligada server_namequando chegamos à solicitação root /var/www/html pegue o arquivo de índice. Se depois server_name Há algo, estamos procurando esse arquivo. Se não encontrarmos, jogamos fora 404. Se terminar com .php, percorrer fpm. Se houver .ht, proibir (403).

  • Fazendo um link de sites-available в sites-enabled: sudo ln -s /etc/nginx/sites-available/<Ваш домен> /etc/nginx/sites-enabled/
  • Removendo o link para default: sudo unlink /etc/nginx/sites-enabled/default
  • Verificando erros: sudo nginx -t
  • Reinício: sudo systemctl reload nginx

Verificando o trabalho:

  • sudo vim /var/www/html/info.php
  • Nós escrevemos: <?php phpinfo();
  • Seguir em frente <Ваш IP>/info.php

Você deverá ver algo assim:

Implantando um aplicativo no Laravel 7 no Ubuntu e Nginx

Agora este arquivo pode ser excluído: sudo rm /var/www/html/info.php

Instale o 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

  • Vamos para o MySQL: mysql -u root -p

  • Crie um banco de dados com o nome laravel: CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  • FLUSH PRIVILEGES;

  • exit

  • cd /var/www/html

  • Crie uma pasta para o projeto: sudo mkdir -p <Имя проекта>

  • Fornecemos ao usuário laravel direitos sobre o projeto: sudo chown laravel:laravel <Имя проекта>

Em seguida, você precisa transferir o projeto. Por exemplo, clonagem do Github.

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

Vale a pena considerar que se você não salvou arquivos estáticos (por exemplo, de /public) no Github, então naturalmente você não os terá. Por exemplo, criei um tópico separado para resolver isso deploy, do qual já clonei: git clone -b <имя ветки> --single-branch <ссылка на проект> ..

  • Instalando dependências: composer install
  • Crie .env: vim .env

A versão básica é assim:

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 você copiar seu .env, substitua APP_ENV por produção, APP_DEBUG por false e insira as configurações corretas para MySQL.

  • Migrando o banco de dados: php artisan migrate
  • Gerando o código: php artisan key:generate

Alterando permissões:

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

A última coisa que resta é reconfigurar o 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 da última vez, se você escolheu a versão 7.3 php7.4-fpm.sock escrever em php7.4-fpm.sock.

Configurando um domínio na DigitalOcean

Na verdade, tudo é muito simples. Você compra um domínio (em qualquer lugar), muda para DigitalOcean em Crie->Domínios/DNS... Em campo Adicione um domínio você insere este domínio e clica em adicionar. Em seguida, vá para as configurações do domínio e para o campo NOME DE ANFITRIÃO digitar @. Selecione um projeto e clique Criar registro.
Agora vá ao site onde comprou o domínio, encontre lá “Servidores DNS” (ou algo semelhante) e entre nos servidores DigitalOcean (nomeadamente ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com). Agora é preciso esperar um pouco (ou muito) até que essas configurações sejam aceitas. Preparar!
O único problema é que seu site abrirá apenas como HTTP. Para ter HTTPS, passe para a próxima parte.

Configurando HTTPS

Instale o certbot e passe o nome de domínio (formato mysite.ru) e nome de domínio com 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 você precisa reconfigurar o Nginx (não se esqueça de substituir seus 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;
    }
}

Acho que você já entendeu o que precisa ser mudado no PHP 7.3.

Aqui, na verdade, tudo é simples. Simplesmente redirecionamos todas as solicitações de HTTP (porta 80) para HTTPS (porta 443). E aí fazemos tudo igual a antes, mas com criptografia.

Resta definir as permissões no firewall:

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

Agora tudo deve funcionar como deveria.

[Avançado] Instalando Node.js

Se de repente você precisar executar comandos npm diretamente no servidor, será necessário instalar o Node.js.

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

É isso, parei nesta fase. Em princípio, estou satisfeito com o resultado. Talvez eu mude do DigitalOcean para algum lugar mais próximo da Rússia e mais barato. Mas como já passei por todas as rodadas de verificação do site e fiz tudo lá, mostrei pelo exemplo. Além disso, os US$ 100 iniciais são um excelente trampolim para o treinamento.

PS Agradecimento especial ao autor esta essência, que serviu de base para todas as ações acima. Em alguns casos não funciona no Laravel 7, eu consertei.

PPS Se acontecer de você ser um engenheiro de ponta que pensa em comandos bash, por favor, não julgue severamente. Você pode achar que este artigo é de baixo nível, mas eu ficaria feliz em encontrar um quando precisasse. Se houver sugestões de melhoria, sou totalmente a favor.

Fonte: habr.com

Adicionar um comentário