Voltar ao Diminua Blog

Artigo

Configurando Nginx e PHP-FPM: Um Guia Prático para Aplicações Web Seguras no Linux

Domine a integração do Nginx com PHP-FPM e implemente SSL com Let's Encrypt para hospedar suas aplicações PHP de forma eficiente e segura.

Configurando Nginx e PHP-FPM: Um Guia Prático para Aplicações Web Seguras no Linux

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 upgrade

Em 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-xml
  • nginx: 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-fpm

Configurando 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.br

Crie 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.br

Adicione 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_files tenta 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 .php para o PHP-FPM.
  • include snippets/fastcgi-php.conf;: Inclui configurações FastCGI padrão, como fastcgi_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/default

Teste a sintaxe da sua configuração do Nginx para garantir que não há erros:

sudo nginx -t

Se o teste for bem-sucedido, reinicie o Nginx para aplicar as mudanças:

sudo systemctl restart nginx

Para 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:

  • user e group: O usuário e grupo sob os quais os processos PHP serão executados (normalmente www-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-fpm

Assegurando 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.br

Em 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-nginx

Com 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.br

O 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-run

Monitoramento 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.log ou em um arquivo específico para o pool, como configurado em /etc/php/X.X/fpm/pool.d/www.conf (parâmetro php_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.log

Para 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 -f

Verificar 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.