Preparação da VPS e Instalação de Dependências
Antes de deployar sua aplicação PHP, você precisa configurar um servidor robusto. Acesso root ou permissões sudo são essenciais. Começamos atualizando o sistema e instalando os pacotes fundamentais: Nginx, PHP-FPM e ferramentas complementares.
# Atualizar repositórios
sudo apt update && sudo apt upgrade -y
# Instalar dependências principais
sudo apt install -y nginx php-fpm php-cli php-mysql php-curl php-xml php-mbstring git curl wget
# Verificar versões instaladas
php -v
nginx -v
Após a instalação, inicie os serviços e configure-os para iniciar automaticamente no boot. O PHP-FPM funciona como um gerenciador de processos separado do Nginx, comunicando-se via socket Unix ou TCP, o que melhora significativamente a performance e segurança comparado à solução clássica Apache com mod_php.
# Iniciar serviços
sudo systemctl start nginx
sudo systemctl start php8.2-fpm
# Habilitar inicialização automática
sudo systemctl enable nginx
sudo systemctl enable php8.2-fpm
# Verificar status
sudo systemctl status php8.2-fpm
Configuração do Nginx e PHP-FPM
A configuração do Nginx é determinante para o sucesso do deploy. Você precisa criar um virtual host que direcione requisições PHP para o PHP-FPM através de um socket Unix, que é mais eficiente que TCP para comunicação local.
# /etc/nginx/sites-available/seu-app.com
server {
listen 80;
server_name seu-app.com www.seu-app.com;
root /var/www/seu-app/public;
index index.php index.html;
# Logs
access_log /var/log/nginx/seu-app-access.log;
error_log /var/log/nginx/seu-app-error.log;
# Gzip compression
gzip on;
gzip_types text/plain text/css text/javascript application/json;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Processar arquivos PHP
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
# Negar acesso a arquivos sensíveis
location ~ /\. {
deny all;
}
}
Após criar a configuração, ative o site e teste a sintaxe do Nginx:
# Criar link simbólico
sudo ln -s /etc/nginx/sites-available/seu-app.com /etc/nginx/sites-enabled/
# Testar sintaxe
sudo nginx -t
# Recarregar Nginx
sudo systemctl reload nginx
A configuração try_files é crucial para frameworks PHP modernos como Laravel e Symfony. Ela redireciona todas as requisições não-arquivo para index.php, permitindo que o roteador da aplicação processe as URLs. O socket Unix (unix:/var/run/php/php8.2-fpm.sock) oferece latência menor que TCP e não expõe a comunicação na rede.
Deploy da Aplicação e Gerenciamento de Processos
Crie a estrutura de diretórios apropriada e configure permissões corretamente. O usuário www-data (padrão do Nginx) deve ter acesso aos arquivos da aplicação, especialmente diretórios de escrita como logs e cache.
# Criar diretório da aplicação
sudo mkdir -p /var/www/seu-app
sudo chown -R $USER:$USER /var/www/seu-app
cd /var/www/seu-app
# Clonar aplicação (exemplo com Git)
git clone seu-repositorio .
# Instalar dependências (se usando Composer)
composer install --optimize-autoloader --no-dev
# Configurar permissões (Laravel exemplo)
sudo chown -R www-data:www-data /var/www/seu-app
sudo chmod -R 755 /var/www/seu-app
sudo chmod -R 775 /var/www/seu-app/storage /var/www/seu-app/bootstrap/cache
Crie um script de deploy automatizado para facilitar futuras atualizações. Esse script puxa as alterações do repositório, instala dependências e reinicia os serviços necessários:
#!/bin/bash
# /home/usuario/deploy.sh
cd /var/www/seu-app
git pull origin main
composer install --optimize-autoloader --no-dev
php artisan migrate --force
php artisan cache:clear
php artisan config:clear
sudo systemctl reload php8.2-fpm
sudo systemctl reload nginx
echo "Deploy concluído com sucesso!"
Execute chmod +x /home/usuario/deploy.sh e utilize-o para atualizações. Configure também um arquivo .env local na VPS com credenciais de banco de dados e configurações específicas do ambiente de produção. Nunca faça commit do .env no repositório.
Otimizações e Segurança Essenciais
A configuração padrão não está otimizada para produção. Ajuste os parâmetros do PHP-FPM conforme a carga esperada da sua aplicação. O pool de processos determina quantas requisições simultâneas seu servidor pode processar.
# /etc/php/8.2/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
listen = /var/run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
; Dynamic process management
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500
; Performance
request_terminate_timeout = 30s
Implemente HTTPS usando Let's Encrypt com Certbot. Certificados SSL são gratuitos e essenciais:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot certonly --nginx -d seu-app.com -d www.seu-app.com
# Certbot gera certificados em /etc/letsencrypt/live/seu-app.com/
Atualize a configuração do Nginx para usar SSL e redirecionar HTTP para HTTPS:
server {
listen 80;
server_name seu-app.com www.seu-app.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name seu-app.com www.seu-app.com;
ssl_certificate /etc/letsencrypt/live/seu-app.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/seu-app.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# ... resto da configuração anterior
}
Configure cron para renovar automaticamente o certificado SSL antes da expiração:
sudo certbot renew --quiet --no-eff-email --agree-tos
Conclusão
Você aprendeu que deploy profissional em VPS envolve três pilares: infraestrutura adequadamente configurada (Nginx + PHP-FPM com socket Unix), aplicação bem estruturada com permissões corretas, e otimizações de performance e segurança desde o início. Automação via scripts de deploy reduz erros humanos e acelera iterações. HTTPS obrigatório, gerenciamento de processos dinâmico e monitoramento contínuo transformam sua aplicação de um experimento em um serviço confiável. Revise regularmente logs de erro, ajuste parâmetros conforme observar gargalos e mantenha dependências atualizadas.