Laravel em VPS: Deploy Completo com Nginx, PHP 8 e SSL Gratis

7357709d-11f9-4bde-9cd5-9419fd9c6edf

Fazer o deploy de uma aplicação Laravel em hospedagem compartilhada é pedir problema. Limite de memória, PHP desatualizado, sem acesso root, sem controle nenhum sobre o php.ini. Quando o projeto começa a crescer, o ambiente trava antes dele.

Um VPS muda isso completamente. Você controla o servidor, escolhe a versão do PHP, configura o Nginx do jeito que precisa e ainda sobe SSL gratuito com Certbot. Este guia cobre o processo inteiro — do servidor zerado até a aplicação Laravel rodando em produção com HTTPS.


O que você vai precisar antes de começar

  • Um VPS com Ubuntu 22.04 LTS (recomendado)
  • Acesso SSH root ou usuário com sudo
  • Um domínio apontando para o IP do servidor
  • Composer instalado localmente (para enviar o projeto) ou acesso ao Git no servidor

Se você ainda está escolhendo onde hospedar, a Napoleon oferece VPS com NVMe SSD em datacenters no Brasil e nos EUA — o que faz diferença real na latência para usuários brasileiros e nos tempos de resposta do banco de dados.


Passo 1: Atualizar o servidor e criar um usuário de deploy

Nunca rode sua aplicação como root. Crie um usuário dedicado logo de cara.

apt update && apt upgrade -y
adduser deploy
usermod -aG sudo deploy

Copie sua chave SSH para o novo usuário:

rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

A partir daqui, trabalhe como deploy.


Passo 2: Instalar o Nginx

sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Confirme que está rodando:

sudo systemctl status nginx

Passo 3: Instalar o PHP 8.3 com as extensões necessárias para o Laravel

O repositório padrão do Ubuntu pode não ter a versão mais recente do PHP. Use o PPA do Ondřej:

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.3 php8.3-fpm php8.3-mbstring php8.3-xml php8.3-bcmath \
  php8.3-curl php8.3-zip php8.3-mysql php8.3-redis php8.3-intl -y

Confirme a versão:

php -v

Passo 4: Instalar o Composer

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

Passo 5: Instalar o MySQL (ou MariaDB)

sudo apt install mysql-server -y
sudo mysql_secure_installation

Crie o banco e o usuário da aplicação:

sudo mysql -u root -p
CREATE DATABASE laravel_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'senha_forte_aqui';
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Passo 6: Fazer o deploy do projeto Laravel

Opção A: via Git (recomendado para produção)

cd /var/www
sudo git clone https://github.com/seu-usuario/seu-projeto.git laravel
sudo chown -R deploy:www-data /var/www/laravel

Opção B: via SCP ou rsync

rsync -avz ./meu-projeto/ deploy@seu-ip:/var/www/laravel/

Com os arquivos no lugar:

cd /var/www/laravel
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate

Edite o .env com as credenciais do banco:

DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=senha_forte_aqui

Execute as migrations:

php artisan migrate --force

Ajuste as permissões de storage e bootstrap/cache:

sudo chown -R www-data:www-data /var/www/laravel/storage
sudo chown -R www-data:www-data /var/www/laravel/bootstrap/cache
sudo chmod -R 775 /var/www/laravel/storage
sudo chmod -R 775 /var/www/laravel/bootstrap/cache

Passo 7: Configurar o Nginx para o Laravel

Crie o arquivo de configuração do site:

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

Cole o bloco abaixo, substituindo seudominio.com.br pelo seu domínio:

server {
    listen 80;
    server_name seudominio.com.br www.seudominio.com.br;
    root /var/www/laravel/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

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

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Ative o site e teste a configuração:

sudo ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Passo 8: Instalar SSL gratuito com Certbot

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d seudominio.com.br -d www.seudominio.com.br

O Certbot detecta o bloco server do Nginx automaticamente, emite o certificado Let's Encrypt e configura o redirect de HTTP para HTTPS. Ao final, o arquivo de configuração já sai atualizado com as diretivas SSL.

Teste a renovação automática:

sudo certbot renew --dry-run

O cron é configurado pelo próprio Certbot na instalação. Não há nada para fazer manualmente.


Passo 9: Otimizar o Laravel para produção

Com o ambiente pronto, rode os comandos de otimização:

php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache

Se o projeto usa filas, configure o Supervisor para manter o worker ativo:

sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/laravel/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/laravel/storage/logs/worker.log
stopwaitsecs=3600
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Passo 10: Configurar o scheduler do Laravel

Adicione uma entrada no crontab do usuário www-data:

sudo crontab -u www-data -e
* * * * * cd /var/www/laravel && php artisan schedule:run >> /dev/null 2>&1

Checklist final antes de ir ao ar

Antes de apontar o domínio definitivo ou avisar o cliente, confirme cada item:

  • APP_ENV=production e APP_DEBUG=false no .env
  • APP_URL com o domínio correto e HTTPS
  • Permissões de storage/ e bootstrap/cache/ corretas
  • SSL ativo e redirect HTTP → HTTPS funcionando
  • Migrations executadas sem erros
  • Cache de configuração, rotas e views gerado
  • Worker de filas rodando (se aplicável)
  • Scheduler configurado no crontab
  • Logs gravando em storage/logs/laravel.log

Por que VPS faz sentido para Laravel

Hospedagem compartilhada impõe limites que o Laravel sente rápido: memória por processo, tempo máximo de execução, restrições no php.ini, sem acesso ao Supervisor para filas. Em um VPS, esses limites somem e você passa a controlar a stack inteira.

Para agências e freelancers brasileiros gerenciando vários projetos ao mesmo tempo, um VPS bem configurado também é muito mais previsível do que dividir recursos com centenas de outros sites no mesmo servidor físico.


FAQs

Qual versão do PHP devo usar com Laravel em 2026?
O Laravel 11 e o Laravel 12 exigem PHP 8.2 no mínimo. PHP 8.3 é a versão estável mais recente e a recomendada para novos deploys em produção.

Posso usar Apache em vez de Nginx?
Sim. O Laravel funciona com Apache usando o módulo mod_rewrite e um .htaccess na pasta public/. O Nginx costuma ser preferido em VPS porque consome menos memória e lida melhor com conexões simultâneas.

O SSL do Let's Encrypt expira. Como garantir a renovação automática?
O Certbot instala um timer do systemd (ou cron) automaticamente durante a configuração. Teste com sudo certbot renew --dry-run — se o comando retornar sem erros, está tudo certo.

Como atualizo o projeto sem derrubar o site?
Via Git: git pull, composer install --no-dev, php artisan migrate --force, e depois reconstrua os caches com php artisan config:cache, route:cache e view:cache. O site permanece disponível durante todo o processo.

O que é o php-fpm e por que preciso dele com Nginx?
O Nginx não processa PHP nativamente. O php-fpm (FastCGI Process Manager) é o serviço responsável por executar os scripts PHP e devolver a resposta ao Nginx via socket Unix. A linha fastcgi_pass unix:/var/run/php/php8.3-fpm.sock no bloco do Nginx é exatamente essa ponte.

Preciso de root para fazer esse deploy?
Você precisa de sudo para instalar pacotes, configurar o Nginx e o Certbot. Para o deploy do código em si, um usuário sem privilégios elevados — como o deploy criado no Passo 1 — é suficiente e mais seguro.

Qual o tamanho de VPS recomendado para uma aplicação Laravel em produção?
Para um projeto de porte médio com banco de dados local, 2 vCPUs e 2 GB de RAM são um ponto de partida razoável. Projetos com filas pesadas, cache Redis e múltiplos workers vão precisar de mais memória. O ideal é monitorar o uso real e escalar conforme a demanda cresce.


Com o ambiente configurado, sua aplicação Laravel roda em infraestrutura que você controla — PHP na versão certa, HTTPS ativo, filas funcionando sem depender de gambiarras de hospedagem compartilhada. Se você ainda está avaliando onde hospedar seu próximo projeto, conheça as soluções de VPS da Napoleon com NVMe SSD e datacenters no Brasil.

Compartilhe

Facebook
WhatsApp
Email
LinkedIn

Redes Sociais

Mais Populares

Receba as Últimas Novidades

Inscreva em Nossa Newsletter Semanal

Não realizamos spam, apenas novidades sobre produtos, dicas e tutoriais do universo online.

Categorias

Fique Ligado

Posts Relacionados