Deploy de aplicações PHP
LidoEsta aula aborda o deploy de aplicações PHP, cobrindo servidores web (Apache e Nginx), PHP-FPM, configuração de HTTPS e o uso de variáveis de ambiente para segurança e configuração. Ao final, você terá uma base sólida para publicar suas aplicações em produção.
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
- PHP: Instalação do FPM - Manual
- Documentação do Apache HTTP Server
- Documentação oficial do Nginx
- Let's Encrypt - Como funciona
- PHP: Variáveis de ambiente - Manual
- vlucas/phpdotenv - GitHub
- MDN: Strict-Transport-Security
Exercícios
- Diferencie Apache e Nginx no contexto de servir aplicações PHP. Explique quando você escolheria cada um.
- Qual é a função do PHP-FPM e como ele melhora o desempenho em produção?
- Como você configuraria HTTPS em um servidor Nginx? Descreva os passos essenciais.
- Por que é importante usar variáveis de ambiente em vez de hardcodar configurações? Dê um exemplo de como acessá-las no PHP.
- Quais são as boas práticas de segurança ao fazer deploy de uma aplicação PHP?
getenv('DB_PASSWORD') ou $_ENV['DB_PASSWORD'].