17 min de leitura · Guia técnico
Configurar Nginx com PHP-FPM no VPS Linux é um processo que otimiza significativamente o desempenho de aplicações web. Para implementar esta configuração, você precisa instalar e configurar corretamente ambos os serviços, além de estabelecer a comunicação entre eles. Neste guia completo, você aprenderá a configurar o Nginx com PHP-FPM em um servidor VPS Linux em aproximadamente 30 minutos, mesmo sem experiência prévia.
Pré-requisitos
- Um servidor VPS Linux com Ubuntu 22.04, Debian 11 ou CentOS 8/9
- Acesso root ou usuário com privilégios sudo
- Conexão SSH ao servidor
- Conhecimentos básicos de linha de comando Linux
- Um domínio apontado para o IP do seu servidor (opcional, mas recomendado)
Instalando o Nginx no servidor VPS
O primeiro passo para configurar o ambiente Nginx com PHP-FPM é instalar o servidor web Nginx. O processo varia ligeiramente dependendo da distribuição Linux que você está utilizando. Vamos cobrir as distribuições mais populares.
Instalação no Ubuntu/Debian
Antes de instalar qualquer pacote, é importante atualizar os repositórios do sistema:
sudo apt update
sudo apt upgrade -y
Em seguida, instale o Nginx:
sudo apt install nginx -y
Após a instalação, inicie o serviço e configure-o para iniciar automaticamente durante o boot:
sudo systemctl start nginx
sudo systemctl enable nginx
Verifique se o Nginx está funcionando corretamente:
sudo systemctl status nginx
Output esperado:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-05-15 10:12:35 UTC; 5s ago
Docs: man:nginx(8)
Main PID: 12345 (nginx)
Tasks: 2 (limit: 4915)
Memory: 3.9M
CPU: 40ms
CGroup: /system.slice/nginx.service
├─12345 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─12346 "nginx: worker process"
Instalação no CentOS/RHEL
Para sistemas baseados em CentOS ou RHEL, o processo é um pouco diferente:
sudo dnf update -y
sudo dnf install epel-release -y
sudo dnf install nginx -y
Inicie e habilite o serviço:
sudo systemctl start nginx
sudo systemctl enable nginx
Se o firewall estiver ativo, você precisará permitir o tráfego HTTP e HTTPS:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Teste o acesso ao Nginx abrindo o endereço IP do seu servidor em um navegador. Você deverá ver a página de boas-vindas padrão do Nginx.
Instalando e configurando o PHP-FPM
O PHP-FPM (FastCGI Process Manager) é uma implementação alternativa do PHP FastCGI que oferece recursos adicionais para sites com tráfego elevado. Vamos instalar o PHP-FPM e configurá-lo para trabalhar com o Nginx.
Instalação do PHP-FPM no Ubuntu/Debian
Instale o PHP-FPM e algumas extensões comumente utilizadas:
sudo apt install php8.1-fpm php8.1-common php8.1-mysql php8.1-xml php8.1-xmlrpc php8.1-curl php8.1-gd php8.1-imagick php8.1-cli php8.1-dev php8.1-imap php8.1-mbstring php8.1-opcache php8.1-soap php8.1-zip php8.1-intl -y
Inicie e habilite o serviço PHP-FPM:
sudo systemctl start php8.1-fpm
sudo systemctl enable php8.1-fpm
Verifique o status do serviço:
sudo systemctl status php8.1-fpm
Output esperado:
● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php8.1-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-05-15 10:20:35 UTC; 5s ago
Docs: man:php-fpm8.1(8)
Process: 12400 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/8.1/fpm/pool.d/www.conf 81 (code=exited, status=0/SUCCESS)
Main PID: 12399 (php-fpm8.1)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 4915)
Memory: 9.3M
CPU: 55ms
CGroup: /system.slice/php8.1-fpm.service
├─12399 "php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)"
├─12401 "php-fpm: pool www"
└─12402 "php-fpm: pool www"
Instalação do PHP-FPM no CentOS/RHEL
Para sistemas CentOS/RHEL, o processo é o seguinte:
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
sudo dnf module reset php
sudo dnf module enable php:remi-8.1 -y
sudo dnf install php php-fpm php-common php-mysqlnd php-xml php-xmlrpc php-curl php-gd php-imagick php-cli php-devel php-imap php-mbstring php-opcache php-soap php-zip php-intl -y
Inicie e habilite o serviço:
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
Configurando o PHP-FPM
Agora, vamos ajustar a configuração do PHP-FPM para melhorar o desempenho. Edite o arquivo de configuração principal:
Para Ubuntu/Debian:
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
Para CentOS/RHEL:
sudo nano /etc/php-fpm.d/www.conf
Localize e modifique as seguintes linhas (ou adicione-as se não existirem):
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
Atenção: Os valores acima são recomendados para um VPS com 4GB de RAM. Para servidores com menos recursos, ajuste os valores de pm.max_children e outros parâmetros proporcionalmente.
Salve o arquivo e reinicie o PHP-FPM:
sudo systemctl restart php8.1-fpm # Ubuntu/Debian
# ou
sudo systemctl restart php-fpm # CentOS/RHEL
Configurando o Nginx para trabalhar com PHP-FPM
Agora que temos o Nginx e o PHP-FPM instalados e funcionando, precisamos configurar o Nginx para processar arquivos PHP através do PHP-FPM. Vamos criar um arquivo de configuração para o nosso site.
Criando um Server Block (Virtual Host)
Para Ubuntu/Debian, crie um novo arquivo de configuração:
sudo nano /etc/nginx/sites-available/meusite.conf
Para CentOS/RHEL:
sudo nano /etc/nginx/conf.d/meusite.conf
Adicione o seguinte conteúdo, substituindo "meudominio.com" pelo seu domínio real:
server {
listen 80;
server_name meudominio.com www.meudominio.com;
root /var/www/html/meusite;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # Ubuntu/Debian
# fastcgi_pass unix:/var/run/php-fpm/www.sock; # CentOS/RHEL (descomente esta linha e comente a anterior)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
location ~ /\.ht {
deny all;
}
# Configurações para arquivos estáticos
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
Se você estiver usando CentOS/RHEL, certifique-se de comentar a linha do socket do Ubuntu/Debian e descomentar a linha do CentOS/RHEL.
Para Ubuntu/Debian, ative o site criando um link simbólico:
sudo ln -s /etc/nginx/sites-available/meusite.conf /etc/nginx/sites-enabled/
Criando o diretório do site
Crie o diretório para os arquivos do seu site:
sudo mkdir -p /var/www/html/meusite
Defina as permissões corretas:
sudo chown -R www-data:www-data /var/www/html/meusite # Ubuntu/Debian
# ou
sudo chown -R nginx:nginx /var/www/html/meusite # CentOS/RHEL
Testando a configuração do PHP
Crie um arquivo PHP de teste para verificar se a integração entre Nginx e PHP-FPM está funcionando:
sudo nano /var/www/html/meusite/info.php
Adicione o seguinte conteúdo:
<?php
phpinfo();
?>
Verifique a sintaxe da configuração do Nginx:
sudo nginx -t
Output esperado:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Se a sintaxe estiver correta, reinicie o Nginx:
sudo systemctl restart nginx
Agora, acesse http://seu-dominio.com/info.php ou http://seu-ip/info.php em seu navegador. Você deverá ver a página de informações do PHP, confirmando que o Nginx está processando corretamente os arquivos PHP através do PHP-FPM.
Atenção: Por razões de segurança, remova o arquivo info.php após confirmar que tudo está funcionando:
sudo rm /var/www/html/meusite/info.php
Otimizando a configuração do Nginx e PHP-FPM
Para obter o melhor desempenho do seu servidor, vamos ajustar algumas configurações adicionais tanto no Nginx quanto no PHP-FPM.
Otimizando o Nginx
Edite o arquivo de configuração principal do Nginx:
sudo nano /etc/nginx/nginx.conf
Dentro do bloco "http", adicione ou modifique as seguintes configurações:
http {
# Configurações básicas
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# Configurações de buffer
client_max_body_size 64m;
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# Configurações de cache
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Configurações de gzip
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# Restante da configuração...
}
Otimizando o PHP-FPM
Edite o arquivo de configuração do PHP:
Para Ubuntu/Debian:
sudo nano /etc/php/8.1/fpm/php.ini
Para CentOS/RHEL:
sudo nano /etc/php.ini
Localize e modifique as seguintes configurações:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 300
display_errors = Off
expose_php = Off
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
Salve o arquivo e reinicie o PHP-FPM:
sudo systemctl restart php8.1-fpm # Ubuntu/Debian
# ou
sudo systemctl restart php-fpm # CentOS/RHEL
Reinicie também o Nginx:
sudo systemctl restart nginx
Configurando HTTPS com Let's Encrypt
Para garantir a segurança do seu site, é altamente recomendável configurar HTTPS. Vamos usar o Let's Encrypt para obter um certificado SSL gratuito.
Instalando o Certbot
Para Ubuntu/Debian:
sudo apt install certbot python3-certbot-nginx -y
Para CentOS/RHEL:
sudo dnf install certbot python3-certbot-nginx -y
Obtendo e configurando o certificado
Execute o Certbot para obter e configurar automaticamente o certificado:
sudo certbot --nginx -d meudominio.com -d www.meudominio.com
Siga as instruções na tela. O Certbot irá modificar automaticamente a configuração do Nginx para usar HTTPS e configurar o redirecionamento de HTTP para HTTPS.
Verifique se a renovação automática está configurada:
sudo systemctl status certbot.timer
Se não estiver ativo, habilite-o:
sudo systemctl enable certbot.timer
Teste a renovação automática (sem realmente renovar o certificado):
sudo certbot renew --dry-run
Problemas comuns e como resolver
Sintoma: Erro 502 Bad Gateway
Causa: Este erro geralmente ocorre quando o Nginx não consegue se comunicar com o PHP-FPM. Pode ser devido a permissões incorretas do socket, PHP-FPM não estar em execução ou configuração incorreta.
Solução: Verifique se o PHP-FPM está em execução com sudo systemctl status php8.1-fpm. Confirme se o caminho do socket no arquivo de configuração do Nginx está correto. Verifique as permissões do socket com ls -la /run/php/ e ajuste as permissões se necessário.
Sintoma: Arquivos PHP são baixados em vez de executados
Causa: O Nginx não está configurado corretamente para processar arquivos PHP através do PHP-FPM.
Solução: Verifique o bloco location ~ \.php$ na configuração do seu site. Certifique-se de que o fastcgi_pass está apontando para o socket correto e que todas as diretivas fastcgi_param estão presentes.
Sintoma: Erro "File not found" para arquivos PHP existentes
Causa: Problemas de permissão ou configuração incorreta do parâmetro SCRIPT_FILENAME.
Solução: Verifique as permissões dos arquivos PHP com ls -la /var/www/html/meusite/. Certifique-se de que o usuário do Nginx (www-data ou nginx) tem permissão para ler os arquivos. Confirme se a diretiva fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; está presente na configuração.
Sintoma: Desempenho lento do PHP
Causa: Configuração inadequada do PHP-FPM para os recursos do servidor.
Solução: Ajuste os parâmetros do PHP-FPM no arquivo www.conf, especialmente pm.max_children, pm.start_servers, pm.min_spare_servers e pm.max_spare_servers de acordo com os recursos disponíveis. Ative o OpCache no php.ini e ajuste suas configurações.
Sintoma: Erro "Permission denied" nos logs do Nginx
Causa: SELinux (em sistemas CentOS/RHEL) ou permissões de arquivo incorretas.
Solução: Para SELinux, execute sudo setsebool -P httpd_can_network_connect 1 e sudo setsebool -P httpd_unified 1. Para problemas de permissão, ajuste as permissões com sudo chown -R nginx:nginx /var/www/html/meusite (ou www-data:www-data para Ubuntu/Debian).
Perguntas frequentes sobre Nginx com PHP-FPM
Qual a vantagem do Nginx com PHP-FPM em relação ao Apache?
O Nginx com PHP-FPM oferece melhor desempenho para sites com tráfego elevado, consumindo menos memória RAM e processador. Enquanto o Apache usa um modelo baseado em processos, o Nginx trabalha com eventos assíncronos, permitindo gerenciar milhares de conexões simultâneas com recursos limitados.
É possível migrar de Apache para Nginx sem perder configurações?
Sim, é possível migrar do Apache para Nginx mantendo as configurações essenciais, mas será necessário converter regras de .htaccess para o formato do Nginx. Você precisará adaptar diretivas de reescrita, controle de acesso e configurações de cache, além de ajustar os virtual hosts para o formato de server blocks do Nginx.
Quais são os requisitos mínimos de hardware para rodar Nginx com PHP-FPM?
Para um VPS Linux executando Nginx com PHP-FPM, o mínimo recomendado é 1GB de RAM, 1 vCPU e 20GB de armazenamento. Para sites com tráfego moderado, 2GB de RAM e 2 vCPUs oferecem melhor desempenho, especialmente se você estiver executando aplicações como WordPress ou Magento.
Como configurar o Nginx para trabalhar com WordPress?
Para configurar o Nginx com WordPress, você precisa criar um server block específico com regras de reescrita para permalinks, definir o PHP-FPM como handler para arquivos .php, e configurar o acesso a wp-admin. Também é recomendável adicionar regras de cache para arquivos estáticos e configurar limites de upload adequados para o wp-content/uploads.
É necessário reiniciar o Nginx após cada alteração de configuração?
Não é necessário reiniciar o Nginx completamente após cada alteração, basta usar o comando 'nginx -t' para testar a sintaxe e depois 'systemctl reload nginx' para recarregar a configuração sem interromper conexões ativas. Isso permite aplicar mudanças sem downtime, ideal para ambientes de produção.
Conclusão
Configurar o Nginx com PHP-FPM em um servidor VPS Linux é uma excelente maneira de otimizar o desempenho das suas aplicações web. Neste guia, você aprendeu:
- Como instalar e configurar o Nginx e o PHP-FPM em diferentes distribuições Linux
- Como integrar o Nginx com o PHP-FPM para processar arquivos PHP
- Como otimizar as configurações para obter o melhor desempenho
- Como configurar HTTPS com certificados gratuitos do Let's Encrypt
- Como solucionar problemas comuns que podem surgir durante a configuração
Com esta configuração, seu servidor estará pronto para hospedar aplicações web modernas com excelente desempenho e segurança. Lembre-se de manter seu sistema atualizado e monitorar regularmente o desempenho para garantir que tudo continue funcionando de maneira ideal.
Precisa de ajuda com seu servidor VPS?
A AviraHost oferece servidores VPS Linux otimizados com suporte técnico especializado 24/7. Nossos planos incluem recursos de alta performance e painel de controle intuitivo para facilitar a administração do seu servidor.