Nesta aula, você aprenderá os fundamentos do deploy de aplicações PHP, desde a escolha do servidor web até a configuração de HTTPS e o gerenciamento de variáveis de ambiente. O deploy é uma etapa crucial no ciclo de vida de qualquer aplicação, e fazer isso corretamente garante desempenho, segurança e facilidade de manutenção.

Vamos explorar as diferenças entre Apache e Nginx, entender o papel do PHP-FPM, configurar certificados SSL/TLS e utilizar variáveis de ambiente para separar configurações sensíveis do código-fonte. Ao final, você será capaz de colocar uma aplicação PHP em produção com confiança.

Servidor web (Apache/Nginx, visão geral)

O servidor web é responsável por receber requisições HTTP e entregar respostas. Para PHP, dois servidores são os mais comuns: Apache e Nginx. Ambos têm suas vantagens e podem ser usados com PHP, mas diferem em arquitetura e desempenho.

O Apache é tradicional e amplamente documentado. Ele pode processar PHP diretamente através de módulos como mod_php, o que simplifica a configuração. O Nginx, por outro lado, é mais leve e eficiente em servir arquivos estáticos e lidar com muitas conexões simultâneas, mas para PHP ele precisa delegar o processamento a um gerenciador de processos como o PHP-FPM.

Em ambientes de produção, é comum usar Nginx como proxy reverso para PHP-FPM, pois isso reduz o consumo de memória e melhora a escalabilidade. No entanto, o Apache com mod_php ainda é usado em muitos sistemas legados. A escolha depende das necessidades do projeto e da infraestrutura existente.

// Exemplo de configuração de um virtual host no Apache (httpd-vhosts.conf)
<VirtualHost *:80>
    ServerName exemplo.com
    DocumentRoot "/var/www/html/public"
    <Directory "/var/www/html/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
// Exemplo de configuração de um server block no Nginx (nginx.conf)
server {
    listen 80;
    server_name exemplo.com;
    root /var/www/html/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

FPM

PHP-FPM (FastCGI Process Manager) é um gerenciador de processos que melhora o desempenho do PHP em produção. Ele mantém um pool de processos PHP prontos para processar requisições, reduzindo a sobrecarga de inicialização. O FPM também permite configurar diferentes pools para diferentes usuários ou aplicações, aumentando a segurança e o isolamento.

Com o FPM, você pode ajustar parâmetros como o número de processos, a quantidade máxima de requisições por processo e o tempo de vida, otimizando o uso de memória e CPU. A configuração é feita em arquivos .conf, normalmente localizados em /etc/php/8.2/fpm/pool.d/.

Para usar o FPM com Nginx, você configura o Nginx para passar requisições PHP para o socket ou porta do FPM. Já com o Apache, você pode usar o módulo mod_proxy_fcgi para encaminhar as requisições. O FPM é essencial para aplicações com tráfego real, pois oferece melhor desempenho que o mod_php do Apache.

// Exemplo de pool do PHP-FPM (www.conf)
[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8

HTTPS

HTTPS é essencial para proteger a comunicação entre o cliente e o servidor, criptografando os dados transmitidos. Sem HTTPS, informações sensíveis como senhas e dados pessoais ficam expostas. Para implementar HTTPS, você precisa de um certificado SSL/TLS, que pode ser obtido gratuitamente via Let's Encrypt ou adquirido de uma autoridade certificadora.

Após obter o certificado, você deve configurar o servidor web para usá-lo. No Apache, isso envolve habilitar o módulo SSL e configurar um VirtualHost na porta 443. No Nginx, você adiciona um bloco server para a porta 443 e especifica os caminhos do certificado e da chave privada. Também é importante redirecionar todo o tráfego HTTP para HTTPS para garantir que os usuários sempre usem a versão segura.

Além do certificado, você deve manter as configurações de segurança atualizadas, como o uso de versões modernas de TLS e a configuração de HSTS (HTTP Strict Transport Security) para forçar o navegador a usar HTTPS.

// Exemplo de configuração HTTPS no Apache (ssl.conf)
<VirtualHost *:443>
    ServerName exemplo.com
    DocumentRoot "/var/www/html/public"
    SSLEngine on
    SSLCertificateFile "/etc/ssl/certs/exemplo.com.crt"
    SSLCertificateKeyFile "/etc/ssl/private/exemplo.com.key"
    SSLCertificateChainFile "/etc/ssl/certs/chain.pem"
</VirtualHost>
// Exemplo de configuração HTTPS no Nginx (nginx.conf)
server {
    listen 443 ssl;
    server_name exemplo.com;

    ssl_certificate /etc/ssl/certs/exemplo.com.crt;
    ssl_certificate_key /etc/ssl/private/exemplo.com.key;

    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Variáveis de ambiente

Variáveis de ambiente são usadas para armazenar configurações que variam entre ambientes (desenvolvimento, teste, produção), como credenciais de banco de dados, chaves de API e URLs. Elas não devem ser incluídas no código-fonte, pois isso representa um risco de segurança e dificulta a manutenção.

Em PHP, você pode acessar variáveis de ambiente através do array $_ENV ou da função getenv(). Para carregá-las de um arquivo .env, você pode usar bibliotecas como Vlucas/phpdotenv, que é comum em projetos Laravel e outros frameworks. Isso permite manter as configurações fora do repositório, facilitando o deploy em diferentes servidores.

No servidor, as variáveis podem ser definidas no sistema operacional, no arquivo de configuração do FPM ou no ambiente do processo. É importante nunca commitar arquivos .env com dados reais; use um arquivo .env.example como modelo.

// Exemplo de uso de variáveis de ambiente no PHP
$dbHost = getenv('DB_HOST');
$dbUser = getenv('DB_USER');
$dbPass = getenv('DB_PASSWORD');

// Ou usando $_ENV
$dbName = $_ENV['DB_NAME'];

// Exemplo de arquivo .env (não deve ser versionado)
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=segredo
DB_NAME=meubanco

Boas práticas e observações finais

Ao fazer deploy de aplicações PHP, siga boas práticas como: sempre usar HTTPS, manter as dependências atualizadas, configurar corretamente as permissões de arquivos e diretórios, e usar um sistema de controle de versão. Além disso, monitore os logs do servidor e do aplicativo para detectar problemas cedo.

Automatize o processo de deploy com ferramentas como Deployer ou usar pipelines de CI/CD (GitHub Actions, GitLab CI). Isso reduz erros humanos e torna o processo mais rápido e confiável. Lembre-se de testar em um ambiente de staging antes de ir para produção.

Por fim, entenda que o deploy não é um evento único, mas um processo contínuo. Mantenha um rollback planejado e documente os passos para facilitar a resolução de problemas.

Referências

Exercícios

  1. Diferencie Apache e Nginx no contexto de servir aplicações PHP. Explique quando você escolheria cada um.
  2. ✓ Resposta: Apache é mais fácil de configurar para PHP com mod_php, mas consome mais memória. Nginx é mais eficiente em estáticos e conexões concorrentes, mas exige PHP-FPM. Escolha Apache para simplicidade e compatibilidade, e Nginx para alta performance e escalabilidade.
  3. Qual é a função do PHP-FPM e como ele melhora o desempenho em produção?
  4. ✓ Resposta: O PHP-FPM é um gerenciador de processos que mantém processos PHP persistentes, reduzindo a sobrecarga de inicialização. Ele permite configurar pools, ajustar número de processos e melhorar o uso de recursos, resultando em maior desempenho e estabilidade.
  5. Como você configuraria HTTPS em um servidor Nginx? Descreva os passos essenciais.
  6. ✓ Resposta: Obtenha um certificado SSL (ex: Let's Encrypt), configure um bloco server na porta 443, especifique os caminhos do certificado e da chave, e redirecione o tráfego HTTP para HTTPS. Também é recomendado configurar HSTS.
  7. Por que é importante usar variáveis de ambiente em vez de hardcodar configurações? Dê um exemplo de como acessá-las no PHP.
  8. ✓ Resposta: Variáveis de ambiente evitam expor credenciais no código, facilitam a mudança entre ambientes e melhoram a segurança. Exemplo: getenv('DB_PASSWORD') ou $_ENV['DB_PASSWORD'].
  9. Quais são as boas práticas de segurança ao fazer deploy de uma aplicação PHP?
  10. ✓ Resposta: Usar HTTPS, manter dependências atualizadas, configurar permissões corretas, não expor arquivos sensíveis (como .env), usar autenticação forte no banco, e monitorar logs.