Deploy de aplicações Laravel em VPS
O Laravel é um dos frameworks PHP mais populares do mundo. Neste guia, você vai colocar uma aplicação Laravel em produção com Nginx, PHP-FPM, filas, scheduler e as otimizações recomendadas.
1. Stack necessária
sudo apt update
sudo apt install nginx mariadb-server redis-server unzip git -y
sudo apt install php-fpm php-cli php-mysql php-mbstring php-xml php-curl php-zip php-bcmath php-intl php-redis -y
Verifique se a versão do PHP atende ao requisito da versão do Laravel que você usa (php -v).
Composer
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
2. Banco de dados
CREATE DATABASE laravel CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'laravel'@'localhost' IDENTIFIED BY 'SENHA_FORTE';
GRANT ALL PRIVILEGES ON laravel.* TO 'laravel'@'localhost';
3. Código
sudo mkdir -p /var/www/app && sudo chown $USER:www-data /var/www/app
git clone https://github.com/sua-empresa/app.git /var/www/app
cd /var/www/app
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generate
Edite o .env:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://app.seudominio.com.br
DB_CONNECTION=mysql
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=SENHA_FORTE
CACHE_STORE=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
Os nomes de algumas variáveis mudam entre versões do Laravel (ex.:
CACHE_DRIVERem versões anteriores). Confira o.env.exampledo seu projeto.
Permissões
sudo chown -R $USER:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
Migrações e link de storage
php artisan migrate --force
php artisan storage:link
4. Nginx
/etc/nginx/sites-available/app:
server {
listen 80;
server_name app.seudominio.com.br;
root /var/www/app/public;
index index.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # ajuste à sua versão
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known) {
deny all;
}
}
sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d app.seudominio.com.br
5. Otimizações de produção
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
Ative e ajuste o OPcache no PHP-FPM.
6. Scheduler
No crontab do usuário da aplicação:
* * * * * cd /var/www/app && php artisan schedule:run >> /dev/null 2>&1
7. Filas com Supervisor
sudo apt install supervisor -y
/etc/supervisor/conf.d/laravel-worker.conf:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/worker.log
stopwaitsecs=3600
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status
Se usa Laravel Horizon, configure o Supervisor para rodar php artisan horizon em vez de queue:work.
8. Script de deploy
#!/bin/bash
set -e
cd /var/www/app
php artisan down
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:restart
php artisan up
Para deploys sem nenhum downtime, ferramentas como Deployer usam releases em pastas separadas com troca por link simbólico.
Conclusão
Com Nginx, PHP-FPM, Redis, filas e cache de configuração, seu Laravel fica pronto para produção. Faça o deploy em um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.