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

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

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.

Referências


Artigos relacionados