Hospedar aplicações web PHP de forma eficiente e segura é uma tarefa fundamental para muitos administradores de sistemas e desenvolvedores. A combinação do Nginx como servidor web e do PHP-FPM para processamento PHP oferece uma arquitetura robusta e de alto desempenho. Neste artigo, vamos explorar como configurar ambos os componentes no Linux e, crucialmente, como proteger sua aplicação com SSL usando o Certbot e o Let's Encrypt.
A Dupla Dinâmica: Nginx e PHP-FPM
O Nginx (pronuncia-se "engine-x") é um servidor web, proxy reverso, proxy de e-mail e proxy TCP/UDP conhecido por sua alta performance, estabilidade, rico conjunto de recursos, configuração simples e baixo consumo de recursos. Ele é excelente para servir conteúdo estático e para atuar como um proxy reverso para aplicações dinâmicas.
Já o PHP-FPM (FastCGI Process Manager) é uma implementação alternativa do PHP FastCGI com recursos adicionais úteis para sites de alto tráfego, como o gerenciamento de pools de processos. Ele permite que o Nginx passe requisições PHP para o PHP-FPM, que as processa e envia os resultados de volta para o Nginx para serem entregues ao cliente.
Juntos, eles formam uma solução poderosa: o Nginx lida com as conexões e serve os arquivos estáticos de forma muito eficiente, enquanto o PHP-FPM se dedica exclusivamente a executar o código PHP, otimizando o uso de recursos e a velocidade da sua aplicação.
Pré-requisitos e Instalação Básica
Para este guia, assumiremos um sistema operacional baseado em Debian/Ubuntu. Os comandos podem variar ligeiramente para outras distribuições Linux, mas os conceitos permanecem os mesmos.
Primeiro, é uma boa prática atualizar a lista de pacotes e os pacotes instalados:
sudo apt update && sudo apt upgradeEm seguida, instale o Nginx e o PHP-FPM, juntamente com algumas extensões PHP comuns que a maioria das aplicações pode precisar. A versão do PHP (ex: 8.1) pode variar dependendo da sua distribuição e das suas necessidades. Substitua X.X pela versão do PHP que você deseja instalar (ex: 8.1, 8.2, 8.3).
sudo apt install nginx phpX.X-fpm phpX.X-mysql phpX.X-cli phpX.X-gd phpX.X-curl phpX.X-mbstring phpX.X-xmlnginx: O servidor web Nginx.phpX.X-fpm: O gerenciador de processos FastCGI para PHP.phpX.X-mysql: Extensão PHP para comunicação com bancos de dados MySQL/MariaDB.phpX.X-cli: Interface de linha de comando para PHP, útil para scripts e ferramentas.phpX.X-gd,phpX.X-curl,phpX.X-mbstring,phpX.X-xml: Extensões PHP comuns para manipulação de imagens, requisições HTTP, strings multibyte e XML, respectivamente.
Após a instalação, o Nginx e o PHP-FPM devem estar rodando. Você pode verificar o status de seus serviços com o systemctl:
sudo systemctl status nginx sudo systemctl status phpX.X-fpmConfigurando Nginx para PHP-FPM
Agora, vamos configurar o Nginx para servir sua aplicação PHP. Criaremos um novo arquivo de configuração para o seu site no diretório /etc/nginx/sites-available/ e, em seguida, criaremos um link simbólico para ele em /etc/nginx/sites-enabled/.
Crie o diretório raiz da sua aplicação (substitua seusite.com.br pelo seu domínio real):
sudo mkdir -p /var/www/html/seusite.com.brCrie um arquivo de configuração para o seu site, por exemplo, /etc/nginx/sites-available/seusite.com.br:
sudo nano /etc/nginx/sites-available/seusite.com.brAdicione o seguinte conteúdo, adaptando seusite.com.br e a versão do PHP:
server { listen 80; server_name seusite.com.br www.seusite.com.br; root /var/www/html/seusite.com.br; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/phpX.X-fpm.sock; } location ~ /\.(ht|svn|git) { deny all; }}listen 80;: O Nginx escutará na porta HTTP padrão.server_name seusite.com.br www.seusite.com.br;: Define os nomes de domínio que este bloco de servidor irá responder.root /var/www/html/seusite.com.br;: O diretório raiz onde os arquivos da sua aplicação estão localizados.index index.php index.html index.htm;: A ordem dos arquivos que o Nginx tentará servir quando uma URL de diretório for acessada.location /: Lida com todas as requisições.try_filestenta servir o arquivo solicitado, depois o diretório, ou retorna 404.location ~ \.php$: Este bloco é crucial. Ele instrui o Nginx a passar todas as requisições de arquivos.phppara o PHP-FPM.include snippets/fastcgi-php.conf;: Inclui configurações FastCGI padrão, comofastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;.fastcgi_pass unix:/var/run/php/phpX.X-fpm.sock;: Especifica o socket UNIX onde o PHP-FPM está escutando. Certifique-se de que a versão do PHP (X.X) corresponda à que você instalou.location ~ /\.(ht|svn|git): Bloqueia o acesso a arquivos de configuração sensíveis.
Agora, ative o site criando um link simbólico e remova a configuração padrão do Nginx para evitar conflitos:
sudo ln -s /etc/nginx/sites-available/seusite.com.br /etc/nginx/sites-enabled/sudo rm /etc/nginx/sites-enabled/defaultTeste a sintaxe da sua configuração do Nginx para garantir que não há erros:
sudo nginx -tSe o teste for bem-sucedido, reinicie o Nginx para aplicar as mudanças:
sudo systemctl restart nginxPara testar, crie um arquivo index.php simples no diretório raiz da sua aplicação:
sudo nano /var/www/html/seusite.com.br/index.php<?php phpinfo(); ?>Ao acessar http://seusite.com.br no seu navegador, você deverá ver a página de informações do PHP.
Gerenciando PHP-FPM
O PHP-FPM gerencia "pools" de processos. Por padrão, ele usa o pool www. Você pode ter múltiplos pools para diferentes aplicações, cada um com suas próprias configurações de usuário, grupos e recursos.
O arquivo de configuração do pool www geralmente está em /etc/php/X.X/fpm/pool.d/www.conf. Nele, você pode ajustar parâmetros como:
useregroup: O usuário e grupo sob os quais os processos PHP serão executados (normalmentewww-data).listen: O socket onde o PHP-FPM escuta (geralmente um socket UNIX, como configurado no Nginx).pm(process manager): Define como o gerenciador de processos controla o número de processos filhos (ex:dynamic,ondemand,static).pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers: Parâmetros para ajustar o número de processos PHP-FPM, importantes para o desempenho e o consumo de memória.
Sempre que fizer alterações no arquivo de configuração do PHP-FPM, você precisará reiniciar o serviço:
sudo systemctl restart phpX.X-fpmAssegurando Permissões Corretas
As permissões de arquivos e diretórios são críticas para a segurança e o funcionamento correto da sua aplicação PHP. O Nginx e o PHP-FPM geralmente executam como o usuário www-data (ou um usuário similar). Portanto, este usuário precisa ter as permissões adequadas para ler e, em alguns casos, escrever nos arquivos da sua aplicação.
Primeiro, defina o proprietário do diretório da sua aplicação para www-data:
sudo chown -R www-data:www-data /var/www/html/seusite.com.brEm seguida, ajuste as permissões de arquivos e diretórios:
- Para diretórios: O ideal é
755(leitura, escrita e execução para o proprietário; leitura e execução para o grupo e outros). Isso permite que o Nginx e o PHP-FPM naveguem pelos diretórios. - Para arquivos: O ideal é
644(leitura e escrita para o proprietário; leitura para o grupo e outros). Isso permite que o Nginx e o PHP-FPM leiam os arquivos da sua aplicação.
sudo find /var/www/html/seusite.com.br -type d -exec chmod 755 {} \;sudo find /var/www/html/seusite.com.br -type f -exec chmod 644 {} \;Aviso de Segurança: Nunca defina permissões 777 para arquivos ou diretórios, a menos que seja absolutamente necessário para um diretório específico (como um diretório de upload ou cache temporário) e você entenda os riscos de segurança envolvidos. Permissões 777 concedem acesso total de leitura, escrita e execução para todos, o que é um risco enorme.
Para um controle mais granular das permissões, você pode explorar o uso de Access Control Lists (ACLs) no Linux, que permitem definir regras mais específicas do que as permissões tradicionais de usuário, grupo e outros.
Implementando SSL com Certbot (Let's Encrypt)
A segurança SSL/TLS é essencial para qualquer aplicação web moderna. Ela criptografa a comunicação entre o navegador do usuário e o seu servidor, protegendo dados sensíveis e aumentando a confiança. O Let's Encrypt oferece certificados SSL gratuitos e automatizados, e o Certbot é a ferramenta recomendada para obtê-los e gerenciá-los.
Instale o Certbot e o plugin Nginx:
sudo apt install certbot python3-certbot-nginxCom o Certbot instalado, você pode obter um certificado SSL para o seu domínio. O plugin Nginx do Certbot pode automaticamente configurar seu servidor Nginx:
sudo certbot --nginx -d seusite.com.br -d www.seusite.com.brO Certbot fará algumas perguntas (endereço de e-mail para avisos, concordância com os termos de serviço) e então:
- Comunicará-se com o Let's Encrypt para verificar a propriedade do seu domínio.
- Gerará e instalará os certificados SSL.
- Modificará automaticamente a configuração do seu Nginx para usar HTTPS e, opcionalmente, redirecionar todo o tráfego HTTP para HTTPS.
Após a conclusão, acesse https://seusite.com.br no seu navegador. Você deverá ver o ícone de cadeado, indicando que a conexão é segura.
Os certificados Let's Encrypt são válidos por 90 dias. O Certbot configura automaticamente um cronjob ou um timer do systemd para renová-los antes que expirem. Você pode testar o processo de renovação automática a qualquer momento com:
sudo certbot renew --dry-runMonitoramento Básico e Logs
Para diagnosticar problemas e monitorar o comportamento da sua aplicação, os logs são indispensáveis.
- Logs do Nginx:
/var/log/nginx/access.log: Registra todas as requisições HTTP e HTTPS para o seu servidor./var/log/nginx/error.log: Registra erros que o Nginx encontra, como arquivos não encontrados, problemas de configuração, etc.- Logs do PHP-FPM:
- Geralmente localizados em
/var/log/phpX.X-fpm.logou em um arquivo específico para o pool, como configurado em/etc/php/X.X/fpm/pool.d/www.conf(parâmetrophp_admin_value[error_log]). - Registram erros de execução do PHP e avisos.
Para visualizar logs em tempo real, você pode usar o comando tail -f:
tail -f /var/log/nginx/error.logtail -f /var/log/phpX.X-fpm.logPara logs dos serviços Nginx e PHP-FPM gerenciados pelo systemd, você pode usar o journalctl:
sudo journalctl -u nginx.service -fsudo journalctl -u phpX.X-fpm.service -fVerificar esses logs regularmente é uma prática recomendada para identificar e resolver problemas rapidamente.
Conclusão
A configuração do Nginx e PHP-FPM para hospedar aplicações web PHP no Linux é uma habilidade essencial para qualquer profissional de TI. Ao seguir este guia, você estabeleceu uma base sólida para suas aplicações, garantindo não apenas desempenho e eficiência, mas também a segurança crucial com a implementação de SSL via Let's Encrypt e Certbot.
Lembre-se que a administração de servidores é um processo contínuo. Monitore seus logs, mantenha seus sistemas atualizados e explore otimizações adicionais de segurança e performance para garantir que suas aplicações estejam sempre funcionando da melhor forma possível.