<h2>Preparação da VPS e Instalação de Dependências</h2>
<p>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.</p>
<pre><code class="language-bash"># 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</code></pre>
<p>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.</p>
<pre><code class="language-bash"># 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</code></pre>
<h2>Configuração do Nginx e PHP-FPM</h2>
<p>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.</p>
<pre><code class="language-nginx"># /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;
}
}</code></pre>
<p>Após criar a configuração, ative o site e teste a sintaxe do Nginx:</p>
<pre><code class="language-bash"># 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</code></pre>
<p>A configuração <code>try_files</code> é crucial para frameworks PHP modernos como Laravel e Symfony. Ela redireciona todas as requisições não-arquivo para <code>index.php</code>, permitindo que o roteador da aplicação processe as URLs. O socket Unix (<code>unix:/var/run/php/php8.2-fpm.sock</code>) oferece latência menor que TCP e não expõe a comunicação na rede.</p>
<h2>Deploy da Aplicação e Gerenciamento de Processos</h2>
<p>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.</p>
<pre><code class="language-bash"># 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</code></pre>
<p>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:</p>
<pre><code class="language-bash">#!/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!"</code></pre>
<p>Execute <code>chmod +x /home/usuario/deploy.sh</code> e utilize-o para atualizações. Configure também um arquivo <code>.env</code> local na VPS com credenciais de banco de dados e configurações específicas do ambiente de produção. <strong>Nunca faça commit do <code>.env</code> no repositório.</strong></p>
<h2>Otimizações e Segurança Essenciais</h2>
<p>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.</p>
<pre><code class="language-ini"># /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</code></pre>
<p>Implemente HTTPS usando Let's Encrypt com Certbot. Certificados SSL são gratuitos e essenciais:</p>
<pre><code class="language-bash">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/</code></pre>
<p>Atualize a configuração do Nginx para usar SSL e redirecionar HTTP para HTTPS:</p>
<pre><code class="language-nginx">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
}</code></pre>
<p>Configure <code>cron</code> para renovar automaticamente o certificado SSL antes da expiração:</p>
<pre><code class="language-bash">sudo certbot renew --quiet --no-eff-email --agree-tos</code></pre>
<h2>Conclusão</h2>
<p>Você aprendeu que <strong>deploy profissional em VPS envolve três pilares</strong>: 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. <strong>Automação via scripts de deploy reduz erros humanos</strong> e acelera iterações. <strong>HTTPS obrigatório, gerenciamento de processos dinâmico e monitoramento contínuo</strong> 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.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://nginx.org/en/docs/" target="_blank" rel="noopener noreferrer">Documentação Oficial Nginx</a></li>
<li><a href="https://www.php.net/manual/en/install.fpm.configuration.php" target="_blank" rel="noopener noreferrer">PHP-FPM Configuration Manual</a></li>
<li><a href="https://letsencrypt.org/" target="_blank" rel="noopener noreferrer">Let's Encrypt - Free SSL Certificates</a></li>
<li><a href="https://www.digitalocean.com/community/tutorials/" target="_blank" rel="noopener noreferrer">DigitalOcean - How to Deploy a PHP Application with Nginx</a></li>
<li><a href="https://www.nginx.com/resources/wiki/start/topics/tutorials/solaris_10_1/" target="_blank" rel="noopener noreferrer">Nginx and PHP-FPM Performance Tuning</a></li>
</ul>