PHP

Como Usar Deploy de Aplicações PHP em VPS com Nginx e PHP-FPM em Produção

8 min de leitura

Como Usar Deploy de Aplicações PHP em VPS com Nginx e PHP-FPM em Produção

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. 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 modphp. 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. Após criar a configuração, ative o site e teste a sintaxe do Nginx: A configuração é crucial para frameworks PHP modernos como Laravel e Symfony. Ela redireciona todas as requisições não-arquivo para

<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 &amp;&amp; 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 &quot;Deploy concluído com sucesso!&quot;</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&#039;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&#039;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>

Comentários

Mais em PHP

Dominando Padrão MVC em PHP: Construindo do Zero sem Framework em Projetos Reais
Dominando Padrão MVC em PHP: Construindo do Zero sem Framework em Projetos Reais

O que é o Padrão MVC e Por Que Aprender Sem Framework MVC (Model-View-Control...

Boas Práticas de Namespaces e Autoloading com PSR-4 para Times Ágeis
Boas Práticas de Namespaces e Autoloading com PSR-4 para Times Ágeis

O que são Namespaces? Namespaces são mecanismos de organização de código que...

Guia Completo de Laravel: Instalação, Estrutura de Pastas e Primeiros Passos
Guia Completo de Laravel: Instalação, Estrutura de Pastas e Primeiros Passos

Instalação e Configuração Inicial A instalação do Laravel é simples graças ao...