Pesquisa de site

Como Instalar e Configurar o Laravel com Nginx no Ubuntu (Stack LEMP)


Introdução

Laravel é um framework PHP de código aberto que oferece um conjunto abrangente de ferramentas e recursos para construir aplicações PHP modernas. Com um ecossistema completo aproveitando seus recursos integrados, a popularidade do Laravel cresceu rapidamente, com muitos desenvolvedores adotando-o como seu framework de escolha para processos de desenvolvimento mais ágeis.

Em ambientes de produção em todo o mundo, Laravel na pilha LEMP processa milhões de solicitações diariamente com tempos de resposta em média de 50 a 200ms para conteúdo dinâmico. A combinação oferece desempenho significativamente superior: o Nginx lida com mais de 10.000 conexões simultâneas usando apenas 2,5 MB de RAM por conexão, enquanto o cache otimizado do Laravel pode reduzir consultas ao banco de dados em 80 a 95% em aplicações típicas.

Este guia abrangente ensina você a instalar e configurar uma aplicação Laravel no Ubuntu usando o stack LEMP (Linux, Nginx, MySQL, PHP). Você aprenderá a configurar um ambiente Laravel pronto para produção com configurações de segurança adequadas, certificados SSL e otimizações de desempenho que refletem implantações em larga escala do mundo real.

Compatibilidade com Ubuntu: Este tutorial funciona em todas as versões LTS e estáveis atuais do Ubuntu. Os comandos são independentes da versão. Instale o PHP 8.2 ou superior como mostrado no Passo 1, independentemente da versão padrão do PHP no seu Ubuntu. Todos os componentes (Nginx, MySQL, Laravel) funcionam de maneira consistente em todas as distribuições do Ubuntu.

O Que Você Vai Construir

  • Otimização de Performance: O tutorial aborda várias maneiras de melhorar a velocidade e a capacidade de resposta da sua aplicação Laravel. Você configurará o cache do Nginx para reduzir a carga no servidor, ajustará as configurações do PHP-FPM para melhorar a concorrência e o gerenciamento de recursos, e aplicará técnicas de otimização específicas do Laravel, como cache de rotas e de configuração, garantindo que sua implantação possa lidar com o crescimento e oferecer experiências rápidas aos usuários.

  • Guia de Solução de Problemas: Antecipando problemas potenciais, o guia oferece uma seção abrangente sobre como resolver erros comuns que podem surgir durante a instalação ou operação. Você encontrará conselhos práticos para depurar erros de configuração, problemas de permissões, erros de conectividade, assim como estratégias para ler e interpretar registros, permitindo que você mantenha um ambiente Laravel estável e confiável.

  • Melhores Práticas de Segurança: Medidas de segurança são integradas em todos os níveis da pilha. O guia enfatiza a segurança do banco de dados com controles de acesso, configura permissões de arquivos apropriadas para restringir o acesso não autorizado e implementa HTTPS usando certificados SSL. Através desses passos, você garantirá que sua aplicação Laravel esteja protegida contra vulnerabilidades comuns, mantendo tanto seu servidor quanto os dados dos usuários seguros.

Pré-requisitos

Para completar este guia, você precisará de um servidor Ubuntu com os seguintes componentes já configurados:

Requisitos do Sistema

  • Servidor Ubuntu (compatível com todas as versões LTS e estáveis atuais)
  • Memória RAM mínima de 1GB (2GB para produção; 4GB ou mais para sites de alto tráfego)
  • Espaço mínimo em disco de 10GB (Laravel ~300MB, dependências ~500MB, além dos dados do seu aplicativo. Use 20GB ou mais se estiver armazenando uploads de usuários ou logs)
  • Acesso root ou sudo

Guia de Dimensionamento: Para aplicações Laravel em produção, aloque recursos com base no tráfego:

  • Baixo tráfego (< 10.000 visualizações de página diárias): 1GB de RAM, 1 núcleo de CPU
  • Tráfego médio (10K-100K visualizações de página): 2-4GB de RAM, 2 núcleos de CPU
  • Alto tráfego (100 mil+ visualizações de página): 4GB+ de RAM, 4+ núcleos de CPU, considere balanceamento de carga

Pilha de Software Necessária

  • Stack LEMP: Nginx, MySQL 8.0+, PHP 8.2+ com PHP-FPM
  • Composer: gerenciador de dependências PHP
  • Certificado SSL: Para HTTPS (Let’s Encrypt recomendado)

Pré-requisitos para a instalação do Laravel

Antes de instalar o Laravel, configure os componentes básicos do LEMP:

  1. Configuração do Servidor: Crie um usuário sudo e configure o firewall usando a Configuração Inicial do Servidor com Ubuntu.

  2. Pilha LEMP: Instale Nginx, MySQL e PHP-FPM seguindo o guia Como Instalar Linux, Nginx, MySQL, PHP (pilha LEMP) no Ubuntu. Para uma implantação rápida, use a Instalação LEMP com 1 Clique no Linux-Console.net. Usuários do CentOS, vejam Instalando LEMP no CentOS 8.

  3. Composer: Instale o gerenciador de dependências PHP usando Como Instalar o Composer no Ubuntu.

Depois de concluir esses pré-requisitos, volte aqui para instalar as extensões PHP específicas do Laravel e configurar sua aplicação.

Por que escolher Nginx em vez de Apache para Laravel? O Nginx oferece benefícios mensuráveis: conectividade muito maior (mais de 10.000 conexões simultâneas contra cerca de 1.000 com Apache prefork), uso de memória significativamente menor (cerca de 2,5MB contra 6–8MB por conexão) e entrega mais rápida de arquivos estáticos (aproximadamente 15.000 req/s contra 5.000 req/s em hardware comparável). Para aplicações Laravel com muitos arquivos CSS, JS e imagens, seu modelo orientado a eventos escala de forma eficiente sem crescimento proporcional de memória, tornando-o a escolha comum em produção.

Observação: Estas métricas de desempenho são típicas para sistemas bem ajustados sob cargas de trabalho e configurações de hardware específicas. Os resultados reais podem variar dependendo do hardware do servidor, das versões do software, do ajuste da configuração e da natureza da carga de trabalho da sua aplicação.

Passo 1 — Instalando as Extensões PHP Necessárias

O Laravel requer várias extensões do PHP para funcionar corretamente. Essas extensões fornecem funcionalidades essenciais para codificação de caracteres, processamento de XML, operações matemáticas e conectividade com bancos de dados.

Verificação da Versão do PHP: Laravel 11 requer PHP 8.2 ou superior. Verifique sua versão atual com php -v. Se você vir PHP 7.4 ou 8.0/8.1, siga os passos de atualização abaixo. Este tutorial utiliza comandos do PHP 8.2—se você instalar o PHP 8.3, substitua php8.2 por php8.3 em todos os comandos.

Atualizando para Versões Modernas do PHP

Para compatibilidade e desempenho ideais com o Laravel 11, instale o PHP 8.2 ou superior:

sudo add-apt-repository ppa:ondrej/php

sudo apt update

sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-curl php8.2-zip php8.2-gd

Impacto da atualização do PHP: O PPA de Ondřej Surý fornece as versões estáveis mais recentes do PHP para Ubuntu. Após a atualização, atualize a configuração do Nginx para fazer referência ao novo caminho do soquete PHP-FPM (por exemplo, /var/run/php/php8.2-fpm.sock). Ganho de desempenho: PHP 8.2 oferece execução 15-20% mais rápida em comparação com PHP 8.0 e desempenho 40-50% melhor que PHP 7.4.

Extensões PHP Essenciais para Laravel

  • php-mbstring: Manipulação de strings multibyte para internacionalização
  • php-xml: Funcionalidades de análise e processamento de XML
  • php-bcmath: Matemática de precisão arbitrária para cálculos financeiros
  • php-curl: Funcionalidade de cliente HTTP para requisições de API
  • php-zip: Manipulação de arquivos para pacotes do Composer e Laravel
  • php-gd: Processamento de imagens para uploads de arquivos e manipulação

Atualize seu gerenciador de pacotes e instale as extensões necessárias:

sudo apt update

Instale as extensões essenciais do PHP:

sudo apt install php-mbstring php-xml php-bcmath php-curl php-zip php-gd

O Que Quebra Sem Essas Extensões

Se você pular essas extensões, o Laravel falhará durante a instalação ou execução:

  • php-mbstring ausente: Erro durante a instalação do Composer: extensão mbstring está ausente
  • php-xml ausente: Quebra o processamento XML do Laravel, testes do PHPUnit falham
  • php-curl ausente: Não é possível fazer requisições HTTP, atualizações de pacotes falham
  • php-zip ausente: O Composer não consegue extrair pacotes: ext-zip está ausente

Verifique se todas as extensões foram carregadas corretamente:

php -m | grep -E "(mbstring|xml|bcmath|curl|zip|gd)"

Você deve ver o nome de cada extensão listado. Se algum estiver faltando, repita o comando apt install.

Adição à Produção: Instale php-redis para cache e php-memcached para armazenamento de sessões. Esses não são obrigatórios, mas melhoram significativamente o desempenho: sudo apt install php-redis php-memcached.

Com as extensões PHP instaladas, você está pronto para configurar o banco de dados.

Passo 2 — Criando uma Configuração de Banco de Dados Segura

Vamos criar um aplicativo de lista de viagens como exemplo para demonstrar a integração do Laravel com o banco de dados. Este aplicativo armazenará destinos de viagem com status de visita, mostrando o Eloquent ORM do Laravel e a conectividade com o banco de dados.

Melhores Práticas de Segurança de Banco de Dados

Para ambientes de produção, siga sempre estes princípios de segurança:

  • Crie usuários de banco de dados dedicados com os privilégios mínimos necessários
  • Use senhas fortes e únicas
  • Ativar a compatibilidade do plugin de autenticação do MySQL
  • Configure regras de firewall adequadas para o acesso ao banco de dados

Nota de Segurança: O método caching_sha2_authentication (padrão do MySQL 8.0) requer PHP 7.4+ com configurações específicas. Para compatibilidade com versões mais antigas do PHP ou uma configuração mais simplificada, usaremos a autenticação mysql_native_password.

Criando o Banco de Dados e o Usuário

Conecte-se ao MySQL como o usuário root:

sudo mysql

Crie o banco de dados do aplicativo:

CREATE DATABASE travellist CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Conjunto de Caracteres: Usar utf8mb4 garante suporte completo ao Unicode, incluindo emojis e caracteres internacionais, o que é essencial para aplicações web modernas.

Crie um usuário de banco de dados dedicado com autenticação segura:

CREATE USER 'travellist_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password_here';

Melhoria de Segurança: O usuário travellist_user está restrito a conexões apenas de 'localhost'. Esta é uma melhoria de segurança intencional em comparação ao uso de '%', que permitiria conexões remotas de qualquer host. O acesso remoto agora está desativado por padrão. Se você precisar se conectar ao MySQL de outro servidor, deve configurar explicitamente o acesso remoto criando o usuário com um host diferente (por exemplo, 'travellist_user'@'%') e atualizando o endereço de ligação do MySQL e as configurações de firewall.

Segurança de Senha: Substitua your_secure_password_here por uma senha forte contendo letras maiúsculas, minúsculas, números e caracteres especiais. Considere usar um gerenciador de senhas para gerar e armazenar senhas seguras.

Conceda os privilégios apropriados ao usuário:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON travellist.* TO 'travellist_user'@'localhost';

FLUSH PRIVILEGES;

Princípio do Menor Privilégio: Concedemos apenas as permissões específicas necessárias para o aplicativo, não privilégios globais. Isso limita os danos potenciais caso o aplicativo seja comprometido.

Saia do console do MySQL:

exit

Testando Conexão com o Banco de Dados

Teste as permissões do usuário do banco de dados:

mysql -u travellist_user -p

Teste de Conexão: A flag -p solicita a senha. Isso verifica se o seu usuário do banco de dados pode autenticar e acessar o banco de dados.

Verificar acesso ao banco de dados:

SHOW DATABASES;

Saída esperada:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| travellist        |
+--------------------+
2 rows in set (0.01 sec)

Criando a Tabela de Aplicativos

Crie a tabela places com indexação e restrições adequadas:

USE travellist;



CREATE TABLE places (

    id INT AUTO_INCREMENT PRIMARY KEY,

    name VARCHAR(255) NOT NULL,

    visited BOOLEAN DEFAULT FALSE,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    INDEX idx_visited (visited),

    INDEX idx_name (name)

);

Design de Banco de Dados: Adicionamos os timestamps created_at e updated_at para trilhas de auditoria, e índices nas colunas mais consultadas para melhor desempenho.

Populando com Dados de Exemplo

Insira destinos de viagem de exemplo:

INSERT INTO places (name, visited) VALUES 

('Tokyo', FALSE),

('Budapest', TRUE),

('Nairobi', FALSE),

('Berlin', TRUE),

('Lisbon', TRUE),

('Denver', FALSE),

('Moscow', FALSE),

('Oslo', FALSE),

('Rio de Janeiro', TRUE),

('Cincinnati', FALSE),

('Helsinki', FALSE);

Verifique os dados:

SELECT * FROM places ORDER BY visited DESC, name ASC;

Saída esperada:

+----+---------------+---------+---------------------+---------------------+
| id | name          | visited | created_at          | updated_at          |
+----+---------------+---------+---------------------+---------------------+
|  2 | Budapest      |       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  4 | Berlin        |       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  5 | Lisbon        |       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  9 | Rio de Janeiro|       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  1 | Tokyo         |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  3 | Nairobi       |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  6 | Denver        |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  7 | Moscow        |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  8 | Oslo          |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 10 | Cincinnati    |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 11 | Helsinki      |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
+----+---------------+---------+---------------------+---------------------+
11 rows in set (0.00 sec)

Sair do MySQL:

exit

Seu banco de dados agora está pronto para a integração com o Laravel. Em seguida, vamos criar a aplicação Laravel.

Passo 3 — Criando uma Nova Aplicação Laravel

Vamos criar uma aplicação Laravel usando o Composer, que gerencia dependências PHP e fornece o instalador do Laravel. Essa abordagem garante que você obtenha a versão estável mais recente com todas as dependências necessárias.

Versão do Laravel: Este guia utiliza o Laravel 11.x, a versão LTS atual que requer PHP 8.2+. O Laravel 11 introduz limitação de taxa por segundo, melhorias em casts de modelos e uma estrutura de diretórios mais simplificada. Para ambientes de produção, use sempre as versões LTS, que recebem correções de bugs por 18 meses e correções de segurança por 2 anos.

Instalando o Laravel com o Composer

Navegue até o seu diretório home:

cd ~

Crie uma nova aplicação Laravel:

composer create-project laravel/laravel travellist

Opções do Composer: A flag --prefer-dist faz o download de versões estáveis em vez do código-fonte, o que é mais rápido e confiável para ambientes de produção.

Saída esperada:

Creating a "laravel/laravel" project at "./travellist"
Installing laravel/laravel (v11.31.0)
  - Installing laravel/laravel (v11.31.0): Downloading (100%)         
Created project in travellist
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 80 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-ctype (v1.28.0): Downloading (100%)         
  - Installing phpoption/phpoption (1.9.0): Downloading (100%)         
  - Installing vlucas/phpdotenv (v5.5.0): Downloading (100%)         
  - Installing symfony/css-selector (v6.3.0): Downloading (100%)     
...

Verificando a instalação do Laravel

Navegue até o diretório da aplicação e teste a interface de linha de comando do Laravel:

cd travellist

php artisan --version

Você verá uma saída como:

Laravel Framework 11.31.0

A versão exata menor (11.x) vai variar dependendo de quando você instalar, mas certifique-se de que comece com "11" para confirmar que você tem o Laravel 11.

Teste a ferramenta de linha de comando Artisan:

php artisan list

Artisan CLI: A interface de linha de comando Artisan do Laravel oferece mais de 50 comandos integrados para tarefas comuns, como migrações de banco de dados, cache de rotas e gerenciamento de filas.

Isso confirma que o Laravel está instalado corretamente. Em seguida, vamos configurar a aplicação para o seu banco de dados e ambiente.

Passo 4 — Configurando o Ambiente Laravel

O Laravel usa variáveis de ambiente para gerenciar a configuração em diferentes ambientes. O arquivo .env contém informações sensíveis e configurações específicas do ambiente que sobrescrevem os arquivos de configuração padrão.

Aviso de Segurança: Nunca faça commit do arquivo .env no controle de versão. Ele contém credenciais de banco de dados, chaves de API e outras informações sensíveis. O Laravel o exclui automaticamente do Git através do .gitignore.

Compreendendo a Configuração do Laravel

O Laravel segue um sistema de configuração hierárquico:

  1. Valores padrão nos arquivos do diretório config/
  2. Variáveis de ambiente no arquivo .env (maior prioridade)
  3. Configuração em tempo de execução via comandos Artisan

Configurando Variáveis de Ambiente

Abra o arquivo .env para edição:

nano .env

Configuração Que Você Deve Alterar

Abra .env e atualize esses valores do banco de dados para corresponder ao Passo 2:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=your_secure_password_here

Substitua your_secure_password_here pela senha que você definiu no Passo 2.

Configuração Que Você Deve Revisar

Atualize estes com base no seu ambiente:

APP_NAME="Travel List Application"
APP_ENV=local              # Change to "production" when deploying
APP_DEBUG=true             # MUST be false in production (exposes sensitive data)
APP_URL=http://your_domain_or_ip

LOG_LEVEL=debug            # Use "error" in production to reduce log size

Configuração Que Você Pode Deixar Padrão

Por enquanto, estes funcionam como estão:

SESSION_DRIVER=file        # Upgrade to redis/memcached for multiple servers
CACHE_DRIVER=file          # Upgrade to redis for better performance
QUEUE_CONNECTION=sync      # Upgrade to redis/database for background jobs

Configurações Específicas do Ambiente:

  • Desenvolvimento: APP_DEBUG=true, APP_ENV=local
  • Produção: APP_DEBUG=false, APP_ENV=production
  • Testando: APP_DEBUG=true, APP_ENV=testing

Gerando Chave de Aplicativo

O Laravel requer uma chave de aplicação única para criptografia. Gere-a usando o Artisan:

php artisan key:generate

Chave do Aplicativo: Esta chave é usada para criptografar cookies, sessões e outros dados sensíveis. O Laravel gera automaticamente uma chave segura caso nenhuma exista.

Verificando a Conexão com o Banco de Dados do Laravel

Verifique a configuração do seu banco de dados:

php artisan tinker --execute="DB::connection()->getPdo();"

Saída esperada:

=> PDO {#1234}

Teste de Banco de Dados: Este comando testa a conexão com o banco de dados sem executar migrações. Se for bem-sucedido, você verá um objeto PDO retornado.

Otimização para Produção

Para ambientes de produção, execute estes comandos de otimização:

php artisan config:cache

php artisan route:cache

php artisan view:cache

Otimização de Desempenho: Esses comandos armazenam em cache a configuração, as rotas e as visualizações para melhorar o desempenho da aplicação em ambientes de produção.

Sua aplicação Laravel agora está configurada. Em seguida, vamos configurar o Nginx para servir sua aplicação.

Passo 5 — Configurando o Nginx para Laravel

O Nginx requer uma configuração adequada para servir aplicações Laravel de forma eficiente. Vamos configurar uma instalação pronta para produção com cabeçalhos de segurança, otimizações de desempenho e permissões corretas de arquivos.

Movendo Aplicativo para o Diretório Web

Mova a aplicação Laravel para o diretório web padrão:

sudo mv ~/travellist /var/www/travellist

Diretório da Web: /var/www é o local padrão para aplicações web no Ubuntu. Isso oferece melhor isolamento de segurança e segue os padrões de hierarquia do sistema de arquivos do Linux.

Configurando Permissões de Arquivo Adequadas

Configure a propriedade e as permissões dos diretórios graváveis do Laravel:

sudo chown -R www-data:www-data /var/www/travellist

sudo chmod -R 755 /var/www/travellist

sudo chmod -R 775 /var/www/travellist/storage

sudo chmod -R 775 /var/www/travellist/bootstrap/cache

Estratégia de Permissão:

  • 755 para diretórios (proprietário: ler/escrever/executar, grupo/outros: ler/executar)
  • 775 para os diretórios graváveis do Laravel (storage, cache)
  • A propriedade www-data garante que o Nginx possa ler arquivos e escrever no armazenamento

Criando Host Virtual Nginx

Crie uma nova configuração de host virtual:

sudo nano /etc/nginx/sites-available/travellist

Configuração Nginx Pronta para Produção

Use esta configuração otimizada para Laravel:

server {
    listen 80;
    listen [::]:80;
    server_name your_domain_or_ip;
    root /var/www/travellist/public;
    index index.php index.html index.htm;

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob;" always;

    # Gzip Compression
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied expired no-cache no-store private must-revalidate auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss;

    # Handle Laravel Routes
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # PHP Processing
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_hide_header X-Powered-By;
    }

    # Static Files Caching
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # Security: Deny access to hidden files
    location ~ /\. {
        deny all;
    }

    # Security: Deny access to sensitive files
    location ~ /(\.env|\.git|composer\.(json|lock)|package\.json) {
        deny all;
    }

    # Favicon and robots.txt
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
}

Recursos de Configuração:

  • Cabeçalhos de Segurança: proteção contra XSS, prevenção de detecção de tipo de conteúdo, opções de frame
  • Compressão Gzip: Reduz o uso de largura de banda e melhora os tempos de carregamento
  • Cache de Arquivos Estáticos: Otimiza o desempenho de CSS, JS e imagens
  • Socket PHP-FPM: Usa socket Unix para melhor desempenho do que TCP

Caminho do Socket PHP-FPM: A configuração utiliza php8.2-fpm.sock correspondente à nossa instalação do PHP 8.2. Se você instalou uma versão diferente do PHP, atualize este caminho. Para verificar seu socket: ls /var/run/php/ mostrará os sockets disponíveis como php8.2-fpm.sock ou php8.3-fpm.sock. O nome do socket sempre corresponde à versão do PHP instalada.

Ativando o Host Virtual

Crie um link simbólico para ativar o site:

sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

Gerenciamento de Sites: O link simbólico permite que o Nginx sirva o site. Para desativar um site, remova o link de sites-enabled/ sem deletar o arquivo de configuração.

Testando e Recarregando o Nginx

Teste a configuração para erros de sintaxe:

sudo nginx -t

Saída esperada:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Recarregue o Nginx para aplicar as alterações:

sudo systemctl reload nginx

Verificando a configuração

Acesse seu aplicativo em um navegador:

http://your_domain_or_ip

Resultado Esperado: Você deve ver a página de boas-vindas do Laravel, confirmando que o Nginx está servindo corretamente sua aplicação Laravel.

Sua aplicação Laravel agora está rodando no Nginx. Em seguida, vamos personalizar a aplicação para exibir dados do seu banco de dados.

Passo 6 — Criando o Aplicativo de Lista de Viagem

Agora vamos criar uma aplicação funcional em Laravel que exibe destinos de viagem do seu banco de dados. Isso demonstra a arquitetura MVC do Laravel, a conectividade com o banco de dados e o sistema de templates Blade.

Entendendo a Arquitetura MVC do Laravel

O Laravel segue o padrão Model-View-Controller (MVC):

  • Modelo: Representa dados e lógica de negócios
  • Visão: Responsável pela apresentação e interface do usuário
  • Controlador: Gerencia a entrada do usuário e coordena entre o Modelo e a Visão

Criando a Rota

Edite o arquivo da rota principal para consultar seu banco de dados:

nano /var/www/travellist/routes/web.php

Substitua a rota padrão por esta implementação baseada em banco de dados:

<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
    $visited = DB::select('SELECT * FROM places WHERE visited = ?', [1]);
    $togo = DB::select('SELECT * FROM places WHERE visited = ?', [0]);
    
    return view('travellist', [
        'visited' => $visited,
        'togo' => $togo
    ]);
});

Consultas ao Banco de Dados: Usamos consultas parametrizadas para prevenir ataques de injeção de SQL. O construtor de consultas do Laravel automaticamente escapa a entrada do usuário.

Criando o Template Blade

Crie um template Blade responsivo para sua lista de viagens:

nano /var/www/travellist/resources/views/travellist.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Travel Bucket List</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
        .section { margin: 30px 0; padding: 20px; border-radius: 8px; }
        .visited { background-color: #d4edda; border-left: 4px solid #28a745; }
        .togo { background-color: #fff3cd; border-left: 4px solid #ffc107; }
        h1 { color: #333; text-align: center; }
        h2 { color: #666; margin-top: 0; }
        ul { list-style: none; padding: 0; }
        li { padding: 8px 0; border-bottom: 1px solid #eee; }
        .count { font-weight: bold; color: #666; }
    </style>
</head>
<body>
    <h1>🌍 My Travel Bucket List</h1>
    
    <div class="section visited">
        <h2>✅ Places I've Visited ({{ count($visited) }})</h2>
        @if(count($visited) > 0)
            <ul>
                @foreach($visited as $place)
                    <li>{{ $place->name }}</li>
                @endforeach
            </ul>
        @else
            <p>No places visited yet. Time to start traveling!</p>
        @endif
    </div>
    
    <div class="section togo">
        <h2>🎯 Places I Want to Visit ({{ count($togo) }})</h2>
        @if(count($togo) > 0)
            <ul>
                @foreach($togo as $place)
                    <li>{{ $place->name }}</li>
                @endforeach
            </ul>
        @else
            <p>All destinations visited! Time to add more places to your bucket list.</p>
        @endif
    </div>
</body>
</html>

Blade Templating: O motor Blade do Laravel oferece recursos poderosos de template, incluindo condicionais, loops e herança de componentes. A sintaxe @if, @foreach e {{ }} torna os templates limpos e fáceis de ler.

Testando o Aplicativo

Acesse seu aplicativo em um navegador:

http://your_domain_or_ip

Resultado Esperado: Você deve ver uma lista de viagens estilizada mostrando destinos visitados e não visitados do seu banco de dados, com contagens e design responsivo.

Verificando a Conectividade com o Banco de Dados

Teste se seu aplicativo está devidamente conectado ao banco de dados:

cd /var/www/travellist

php artisan tinker --execute="echo 'Database connection: ' . (DB::connection()->getPdo() ? 'Success' : 'Failed');"

Verificação do Banco de Dados: Este comando testa a conexão com o banco de dados e confirma que o Laravel pode se comunicar com o MySQL com sucesso.

Sua aplicação Laravel agora está totalmente funcional com integração de banco de dados!

Passo 7 — Configuração de SSL com o Let’s Encrypt

Sites de produção exigem HTTPS para segurança e SEO. O Let’s Encrypt fornece certificados SSL gratuitos.

Pré-requisitos para SSL

Antes de executar o Certbot, verifique:

  1. O domínio aponta para o seu servidor: Execute dig +short seu_dominio.com - ele deve retornar o endereço IP do seu servidor
  2. Porta 80 está acessível: O Let's Encrypt valida via HTTP antes de emitir certificados HTTPS
  3. Nginx está em execução: Verifique com sudo systemctl status nginx

Se o seu domínio ainda não aponta para o servidor, você receberá: Falha no desafio para o domínio seu_dominio.com. Corrija seu DNS primeiro.

Instalando o Certbot

Instale o Certbot e o plugin do Nginx:

sudo apt update

sudo apt install certbot python3-certbot-nginx

Obtendo Certificado SSL

Execute o Certbot com seu domínio:

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

O Certbot irá:

  1. Verifique se você controla o domínio
  2. Gerar certificados SSL
  3. Modifique sua configuração do Nginx para usar HTTPS
  4. Adicionar um redirecionamento de HTTP para HTTPS

Quando solicitado “Por favor, escolha se deseja redirecionar o tráfego HTTP para HTTPS”, selecione 2 (Redirecionar) para aplicação automática do HTTPS.

O que o Certbot mudou

Verifique a configuração do Nginx para ver as alterações:

sudo cat /etc/nginx/sites-available/travellist

O Certbot adicionou estas linhas:

listen 443 ssl; # SSL port
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

Testando Renovação Automática

Os certificados Let’s Encrypt vencem após 90 dias. Teste a renovação automática:

sudo certbot renew --dry-run

Se for bem-sucedido, você verá: Parabéns, todas as renovações simuladas foram bem-sucedidas. O sistema irá renovar automaticamente os certificados antes do vencimento através de um timer do systemd.

Etapa 8 — Otimizações de Produção

Otimização de Desempenho do Laravel

Antes de implantar em produção, execute estes comandos de cache. Cada um faz cache de uma parte diferente do Laravel:

cd /var/www/travellist



# Cache configuration files (15-25ms faster per request)

php artisan config:cache



# Cache route definitions (10-15ms faster per request)

php artisan route:cache



# Pre-compile Blade templates (5-10ms faster per request)

php artisan view:cache



# Optimize autoloader (faster class loading)

php artisan optimize

Quando Executar Isso: Após cada implantação de código. Se você alterar rotas ou configuração, limpe o cache primeiro: php artisan cache:clear.

Não rode em desenvolvimento: O cache impede que alterações no .env tenham efeito. Use cache apenas em produção.

Ajuste de Desempenho do Nginx

Adicione essas otimizações à sua configuração do Nginx:

# Add to server block
client_max_body_size 20M;
client_body_timeout 60s;
client_header_timeout 60s;
keepalive_timeout 65s;
send_timeout 60s;

# FastCGI optimizations
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

Otimização do PHP-FPM

Otimize o PHP-FPM para o seu servidor:

Caminho de Configuração do PHP-FPM: Use /etc/php/8.2/fpm/pool.d/www.conf para o PHP 8.2. Se você instalou o PHP 8.3, use /etc/php/8.3/fpm/pool.d/www.conf em vez disso. O padrão do caminho é sempre /etc/php/VERSION/fpm/pool.d/www.conf.

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

Calculando Workers do PHP-FPM

Cada worker do PHP-FPM utiliza cerca de 30-50MB de RAM. Calcule o número máximo de workers:

max_children = (Total RAM - System RAM) / 50MB

Para um servidor de 2GB (1,5GB utilizáveis após a sobrecarga do sistema):

max_children = 1500MB / 50MB = 30 workers maximum

Atualize a configuração com os valores que você calculou:

; For 2GB RAM server (adjust based on your RAM)
pm = dynamic
pm.max_children = 30              ; Maximum workers (calculated above)
pm.start_servers = 8              ; 25% of max_children
pm.min_spare_servers = 5          ; Minimum idle workers
pm.max_spare_servers = 15         ; Maximum idle workers (50% of max_children)
pm.max_requests = 1000            ; Restart worker after 1000 requests (prevents memory leaks, industry standard)

Para 1GB de RAM: Defina pm.max_children=15
Para 4GB de RAM: Defina pm.max_children=60

Reiniciar PHP-FPM:

Nome do Serviço PHP-FPM: O nome do serviço corresponde à sua versão do PHP. Para PHP 8.2, use php8.2-fpm. Para PHP 8.3, use php8.3-fpm. Verifique sua versão instalada com systemctl list-units | grep php-fpm.

sudo systemctl restart php8.2-fpm

Solução de Problemas Comuns

Erros de Conexão com o Banco de Dados

Erro: SQLSTATE[HY000] [2002] Arquivo ou diretório não encontrado

Causa Raiz: Laravel tentando conexão via socket enquanto o MySQL está configurado para TCP, ou caminho do socket incorreto.

Etapas de Diagnóstico:

# Check MySQL service status

sudo systemctl status mysql



# Verify MySQL is listening

sudo netstat -tlnp | grep mysql



# Test direct connection

mysql -u travellist_user -p -h 127.0.0.1

Solução:

nano /var/www/travellist/.env

Atualizar configuração do banco de dados:

# Change from unix socket to TCP
DB_HOST=127.0.0.1
DB_PORT=3306

# Or specify socket path explicitly
DB_HOST=localhost
DB_SOCKET=/var/run/mysqld/mysqld.sock

Verificação: Após as alterações, limpe o cache de configuração do Laravel:

php artisan config:clear

php artisan config:cache

Erros de Permissão

Erro: Permissão negada para diretórios de armazenamento ou cache

Causa Raiz: O servidor web (www-data) não tem permissões de escrita nos diretórios graváveis do Laravel.

Cenário do Mundo Real: Isso ocorre comumente após implantar via Git, onde os arquivos herdam as permissões do seu usuário em vez de www-data.

Solução Completa:

# Fix ownership

sudo chown -R www-data:www-data /var/www/travellist



# Set base permissions

sudo find /var/www/travellist -type d -exec chmod 755 {} \;

sudo find /var/www/travellist -type f -exec chmod 644 {} \;



# Set writable directories

sudo chmod -R 775 /var/www/travellist/storage

sudo chmod -R 775 /var/www/travellist/bootstrap/cache



# If using ACLs for development team access

sudo setfacl -R -m u:www-data:rwx /var/www/travellist/storage

sudo setfacl -R -m u:www-data:rwx /var/www/travellist/bootstrap/cache

Prevenção: Adicione ao script de implantação:

#!/bin/bash
chown -R www-data:www-data /var/www/travellist
chmod -R 755 /var/www/travellist
chmod -R 775 /var/www/travellist/storage /var/www/travellist/bootstrap/cache

Nginx 502 Bad Gateway

Erro: 502 Bad Gateway ao acessar a aplicação

Causa Raiz: serviço PHP-FPM parado, travou ou caminho do socket não coincide.

Etapas de Diagnóstico:

# Check PHP-FPM service (adjust version as needed)

sudo systemctl status php8.2-fpm



# Check for socket file

ls -la /var/run/php/



# Review PHP-FPM error log

sudo tail -f /var/log/php8.2-fpm.log



# Check Nginx error log for specifics

sudo tail -f /var/log/nginx/error.log

Causas e Soluções Comuns:

1. Serviço PHP-FPM Fora do Ar:

sudo systemctl start php8.2-fpm

sudo systemctl enable php8.2-fpm

2. Incompatibilidade no Caminho do Socket:

# Find actual socket

ls /var/run/php/



# Update Nginx config

sudo nano /etc/nginx/sites-available/travellist

# Change: fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;



# Test and reload

sudo nginx -t

sudo systemctl reload nginx

3. Exaustão de Recursos do PHP-FPM (todos os trabalhadores ocupados):

# Check active processes

sudo ps aux | grep php-fpm | wc -l



# Review pool configuration

sudo nano /etc/php/8.2/fpm/pool.d/www.conf



# Increase max_children for high traffic

pm.max_children = 50  # from 20

pm.start_servers = 10  # from 5

pm.min_spare_servers = 10

pm.max_spare_servers = 20



sudo systemctl restart php8.2-fpm

Chave de Aplicação do Laravel Ausente

Erro: Nenhuma chave de criptografia de aplicativo foi especificada

Causa Raiz: arquivo .env está faltando APP_KEY ou foi corrompido durante a implantação.

Solução:

cd /var/www/travellist

php artisan key:generate



# Verify key was generated

grep APP_KEY .env



# Clear and rebuild cache

php artisan config:clear

php artisan config:cache

Armengue de Deploy em Produção: Nunca regenere as chaves em produção—isso invalida todos os dados criptografados. Em vez disso, copie APP_KEY do seu .env anterior ou do backup.

Composer Sem Memória

Erro: Erro fatal do PHP: tamanho de memória permitido esgotado

Causa Raiz: O Composer requer memória significativa durante a resolução de dependências.

Solução:

# Temporary memory increase

php -d memory_limit=512M /usr/bin/composer install



# Or set permanently

export COMPOSER_MEMORY_LIMIT=-1

composer install



# For production, use --optimize-autoloader

composer install --no-dev --optimize-autoloader

Sessão/Cache Não Funciona Após Implantação

Sintoma: Usuários são desconectados aleatoriamente, dados em cache não estão sendo mantidos.

Causa Raiz: Cache do sistema de arquivos limpo durante a implantação ou permissões incorretas.

Solução:

# Clear all caches

php artisan cache:clear

php artisan config:clear

php artisan view:clear

php artisan route:clear



# Rebuild optimized caches

php artisan config:cache

php artisan route:cache

php artisan view:cache



# Fix storage permissions

sudo chmod -R 775 /var/www/travellist/storage

sudo chown -R www-data:www-data /var/www/travellist/storage

Melhor Prática de Produção: Implemente Redis ou Memcached para sessões/cache em vez de armazenamento baseado em arquivos para evitar esses problemas em implantações e múltiplos servidores.

Perguntas Frequentes

Qual é a diferença entre LEMP e LAMP para Laravel?

LEMP (Linux, Nginx, MySQL, PHP) e LAMP (Linux, Apache, MySQL, PHP) são ambos stacks válidos para Laravel, mas o LEMP oferece desempenho significativamente superior para aplicações modernas. As diferenças quantificadas:

Comparação de Desempenho:

  • Conexões simultâneas: Nginx lida com mais de 10.000, enquanto o Apache cerca de 1.000 (melhora de 10x)
  • Eficiência de memória: 2,5MB vs 6-8MB por conexão (60% menor)
  • Serviço de arquivos estáticos: 15.000 req/s vs 5.000 req/s (3x mais rápido)
  • Tempo de resposta: 50-80ms vs 150-250ms (50-70% mais rápido)

Benefícios da Arquitetura: O modelo orientado a eventos do Nginx escala horizontalmente sem crescimento linear de memória, tornando-o ideal para aplicações modernas do Laravel com muitos recursos. O ecossistema do Laravel (Sail, Forge, Vapor) padroniza o Nginx, garantindo melhor suporte da comunidade e documentação.

Quando usar LAMP: Considere o Apache se você precisar de .htaccess para configuração por diretório ou compatibilidade com aplicações legadas. Caso contrário, LEMP é o padrão em produção.

Como habilito SSL para meu aplicativo Laravel no Nginx?

Use o Let’s Encrypt com Certbot para certificados SSL gratuitos:

# Install Certbot

sudo apt install certbot python3-certbot-nginx



# Obtain and configure SSL

sudo certbot --nginx -d your_domain.com -d www.your_domain.com



# Test automatic renewal

sudo certbot renew --dry-run

O Certbot automaticamente:

  • Obtém certificado SSL da Let’s Encrypt
  • Configura o Nginx com configurações de SSL
  • Configura redirecionamento de HTTP para HTTPS
  • Permite renovação automática (os certificados são renovados a cada 90 dias)

Impacto no Desempenho: Após habilitar o SSL, considere ativar o HTTP/2 na sua configuração do Nginx para carregamento de páginas 30-50% mais rápido:

listen 443 ssl http2;
listen [::]:443 ssl http2;

Quais permissões as pastas do Laravel devem ter no Ubuntu?

O Laravel requer permissões específicas para o funcionamento adequado:

Diretório/ArquivoPermissãoPropriedadePropósito
Raiz do aplicativo
755
www-data:www-data
Acesso de leitura ao servidor web
storage/
775
www-data:www-data
Logs, cache, sessões (gravação)
bootstrap/cache/
775
www-data:www-data
Cache do framework (gravação)
.env
644
www-data:www-data
Configuração do ambiente (leitura)

Aplicar permissões corretas:

sudo chown -R www-data:www-data /var/www/travellist

sudo find /var/www/travellist -type d -exec chmod 755 {} \;

sudo find /var/www/travellist -type f -exec chmod 644 {} \;

sudo chmod -R 775 /var/www/travellist/storage

sudo chmod -R 775 /var/www/travellist/bootstrap/cache

Nota de Segurança: Nunca defina permissões 777—isso cria vulnerabilidades de segurança. Use 775 para diretórios graváveis com a propriedade adequada.

Como corrigir erros 403/404 na configuração do Laravel com Nginx?

Erros 403 Proibido:

# 1. Check document root points to /public

sudo nano /etc/nginx/sites-available/travellist

# Verify: root /var/www/travellist/public;



# 2. Verify index.php exists

ls -la /var/www/travellist/public/index.php



# 3. Fix permissions

sudo chown -R www-data:www-data /var/www/travellist

sudo chmod 755 /var/www/travellist/public



# 4. Check Nginx user

ps aux | grep nginx

# Should run as www-data

Erros 404 nas Rotas do Laravel:

# 1. Verify try_files directive

sudo nano /etc/nginx/sites-available/travellist

# Should have: try_files $uri $uri/ /index.php?$query_string;



# 2. Test Nginx config

sudo nginx -t



# 3. Check Laravel routes

cd /var/www/travellist

php artisan route:list



# 4. Clear route cache

php artisan route:clear

php artisan route:cache

Armão do Mundo Real: Esquecer /public na raiz do documento faz o Laravel servir o ponto de entrada errado, expondo o código-fonte.

Como reiniciar o Nginx e o PHP-FPM após alterações na configuração?

Para alterações de configuração:

# Nginx - graceful reload (no downtime)

sudo nginx -t  # Always test first

sudo systemctl reload nginx



# PHP-FPM - adjust version as needed

sudo systemctl restart php8.2-fpm

Comandos de gerenciamento de serviço:

# Check service status

sudo systemctl status nginx

sudo systemctl status php8.2-fpm



# Enable auto-start on boot

sudo systemctl enable nginx

sudo systemctl enable php8.2-fpm



# View real-time logs

sudo journalctl -u nginx -f

sudo journalctl -u php8.2-fpm -f

Melhor Prática de Produção: Use reload para Nginx (sem tempo de inatividade) e restart para PHP-FPM apenas quando necessário. Para PHP-FPM, considere usar reload, se disponível, para minimizar interrupções.

Este tutorial é compatível com todas as versões do Ubuntu?

Sim, este tutorial utiliza comandos e configurações independentes de versão que funcionam em todas as versões LTS do Ubuntu e nas versões atuais. Os componentes principais (Nginx, MySQL, Laravel) mantêm um comportamento consistente entre as versões do Ubuntu.

Considerações específicas da versão:

  • Versões do PHP: Instale o PHP 8.2+ necessário, independentemente da versão padrão do Ubuntu
  • Nomes dos serviços: Os nomes dos serviços PHP-FPM refletem a versão instalada (por exemplo, php8.2-fpm)
  • Caminhos de socket: Verifique /var/run/php/ para identificar o socket do seu PHP-FPM
  • Caminhos de configuração: Ajuste os caminhos com base na sua versão do PHP (por exemplo, /etc/php/8.2/)

Para identificar seu sistema:

# Check Ubuntu version

lsb_release -a



# Check installed PHP version

php -v



# Find PHP-FPM socket

ls /var/run/php/



# Check PHP-FPM service name

systemctl list-units | grep php

Como monitorar o desempenho de uma aplicação Laravel?

Ferramentas Integradas do Laravel:

# Install Telescope for development/staging

composer require laravel/telescope --dev

php artisan telescope:install

php artisan migrate



# Access at: http://your_domain/telescope



# For queue monitoring

composer require laravel/horizon

php artisan horizon:install

Monitoramento em Nível de Servidor:

# Real-time process monitoring

htop



# Nginx request monitoring

sudo tail -f /var/log/nginx/access.log



# PHP-FPM status

sudo systemctl status php8.2-fpm



# Laravel logs

tail -f /var/www/travellist/storage/logs/laravel.log

Métricas de Desempenho para Monitorar:

  • Tempo médio de resposta: < 200ms para conteúdo em cache, < 500ms para conteúdo dinâmico
  • Tempo de consulta ao banco de dados: < 100ms por consulta (verifique com o Telescope)
  • Uso de memória: os workers do PHP-FPM devem usar < 128MB cada
  • Uso da CPU: Deve ficar em média abaixo de 70% sob carga normal

Monitoramento de Produção: Considere ferramentas de APM como New Relic, Datadog, ou alternativas de código aberto como Grafana + Prometheus para monitoramento completo.

Devo usar o Laravel Sail com Nginx em vez desta configuração?

Laravel Sail (ambiente de desenvolvimento baseado em Docker) e LEMP nativo servem a propósitos diferentes:

Use o Laravel Sail quando:

  • Desenvolvendo localmente com ambientes consistentes entre as equipes
  • Necessário isolamento do sistema host
  • Quer configuração rápida sem necessidade de ajustes no sistema
  • Trabalhando em vários projetos Laravel simultaneamente

Use LEMP nativo (este tutorial) quando:

  • Implantando em servidores de produção
  • Otimização para desempenho máximo (Docker adiciona 5-15% de sobrecarga)
  • Gerenciando a infraestrutura existente
  • Precisa de controle detalhado sobre cada componente
  • Trabalhando com servidores VPS com recursos limitados

Abordagem Híbrida: Muitas equipes usam o Sail para desenvolvimento e fazem o deploy no LEMP nativo para produção. Isso combina a conveniência do desenvolvimento com o desempenho na produção.

Comparação de Desempenho:

  • LEMP Nativo: 100 req/s como referência
  • Laravel Sail: 85-90 req/s (sobrecarga de rede do Docker)
  • Memória: Nativo usa ~150MB a menos que a configuração em contêiner

Como configurar o Laravel em um subdiretório com Nginx?

Para executar o Laravel em um subdiretório (por exemplo, example.com/myapp):

location /myapp {
    alias /var/www/travellist/public;
    try_files $uri $uri/ @myapp;
    
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
}

location @myapp {
    rewrite /myapp/(.*)$ /myapp/index.php?/$1 last;
}

Atualize o .env do Laravel:

APP_URL=http://your_domain.com/myapp

Fique atento: Muitos recursos do Laravel (compilação de assets, rotas) assumem implantação no nível raiz. Considere usar um subdomínio (myapp.example.com) em vez disso para uma configuração mais limpa.

Conclusão

Você agora configurou uma aplicação Laravel segura e robusta no Ubuntu, aproveitando o poder da pilha LEMP (Linux, Nginx, MySQL e PHP-FPM). Este tutorial guiou você passo a passo através da instalação e configuração de cada componente, da aplicação de medidas de segurança reforçadas para acesso ao banco de dados, permissões de arquivos e integração de SSL, bem como das melhores práticas para manter uma infraestrutura web estável e de alto desempenho.

Ao longo do caminho, você aprendeu como otimizar sua configuração através do ajuste do Nginx e do PHP-FPM, habilitar cache avançado no Laravel e estabelecer fluxos de trabalho prontos para produção para SSL, monitoramento do sistema e solução de problemas. Ao aplicar essas técnicas, você garantiu que seu ambiente Laravel esteja bem preparado para crescimento escalável, operação confiável e segurança de primeira classe em sistemas Ubuntu modernos.

Próximos Passos

  • Migrações de Banco de Dados: Use o sistema de migrações do Laravel para gerenciamento do esquema do banco de dados
  • Autenticação: Implemente o sistema de autenticação integrado do Laravel
  • Desenvolvimento de API: Crie APIs RESTful usando os recursos de API do Laravel
  • Armazenamento em cache: Implemente Redis ou Memcached para melhorar o desempenho
  • Monitoramento: Configure o monitoramento e o registro de aplicações

Recursos Adicionais

  • Documentação do Laravel
  • Guia de Configuração do Nginx
  • Otimização de Desempenho do MySQL
  • Como instalar Linux, Nginx, MySQL, PHP (pilha LEMP) no Ubuntu
  • Como Usar a Instalação LEMP 1-Click no Linux-Console.net
  • Como instalar Linux, Nginx, MySQL, PHP (pilha LEMP) no CentOS 8

Sua aplicação Laravel agora está pronta para uso em produção com segurança adequada, otimizações de desempenho e capacidades de monitoramento.

Obrigado por aprender com a comunidade Linux-Console.net.