Como Configurar Apache e PHP para Websites de Alto Tráfego em Servidor Linux

Apache Php Fpm Featured

Quase todos os tutoriais sobre como instalar a pilha LAMP (Linux, Apache, MySQL, PHP) recomendam que você use o módulo integrado do Apache para processar scripts PHP. Por exemplo, no Ubuntu você ativaria isso ao usar um comando como sudo apt install libapache2-mod-php para instalar um pacote. Isso forçaria o Apache a usar mpm_prefork. Toda vez que um visitante acessa seu site, um novo processo será iniciado para gerenciar essa conexão. Isso funciona bem quando o tráfego é baixo.

Mas isso se torna um grande problema se você receber um aumento repentino de tráfego. Por exemplo, uma postagem no Reddit pode incluir seu site, e se a postagem se tornar popular, você pode receber milhares de visitantes em apenas alguns minutos.

No melhor cenário, se o Apache conseguir lidar com o aumento de tráfego, alguns visitantes azarados podem ter que esperar talvez trinta a sessenta segundos até que a página seja carregada, o que é absurdo no mundo de hoje. No pior cenário, o servidor começará a atrasar severamente, e algumas conexões simplesmente serão descartadas por falta de recursos. Nesse caso, os visitantes verão um erro em seus navegadores.

Não é um bom cenário de qualquer maneira, já que você potencialmente perdeu a atenção de centenas ou milhares de leitores, clientes ou fãs interessados.

Infelizmente, o PHP é um grande consumidor de recursos de qualquer forma. Mas, com o mpm_event, o Apache pode lidar com aumentos súbitos de tráfego de uma maneira muito mais eficiente. É recomendável, no entanto, que seu servidor tenha pelo menos 2 GB de RAM e 2 núcleos de CPU, reais ou virtuais, e ainda mais se você espera ter picos de tráfego intensos, como mais de dez visitantes por segundo. Se você estiver usando um servidor privado virtual, adicione mais núcleos de CPU virtuais à sua situação e armazenamento SSD. A RAM é secundária.

Leia também: Nginx vs Apache: Qual Serve Melhor Para Você?

Como Usar Apache MPM Event e PHP-FPM em Distribuições Baseadas em Debian

No Debian, Ubuntu ou outras distribuições dessa família, evite simplesmente instalar o pacote “libapache2-mod-php”. Quando você instala o Apache, ele usa o MPM event por padrão. Mas ao instalar o pacote mencionado, um script desativa o MPM event e ativa o MPM prefork. O módulo PHP do Apache só pode funcionar (com segurança) com mpm_prefork. Claro, sem “libapache2-mod-php”, você não tem um processador para arquivos PHP. Então, você usará o PHP-FPM em vez do módulo PHP incluído no Apache. Aqui está como você instalaria uma pilha LAMP em um servidor limpo. Você pode adaptar os passos de acordo com os requisitos da sua aplicação web.

Primeiro, faça login como root. Depois, instale o Apache.

apt update && apt install apache2

Neste ponto, você pode ver que o Apache realmente vem com o MPM event ativado por padrão.

apachectl-V

Apache Php Fpm Check Mpm Debian

Instale o PHP-FPM.

apt install php-fpm

Você verá instruções sobre como habilitar o processador PHP no Apache.

Apache Php Fpm Enable Php Instructions

Ative o protocolo FastCGI.

a2enmod proxy_fcgi

Ative a configuração padrão do PHP-FPM para o Apache.

a2enconf php7.0-fpm

Nota: em versões futuras do Debian/Ubuntu, este comando pode mudar para algo diferente, por exemplo, a2enconf php7.6-fpm, porque o PHP-FPM seria de uma versão diferente.

Reinicie o Apache.

systemctl restart apache2

Instale o resto dos seus requisitos para sua aplicação PHP. Aqui está um exemplo:

apt install mariadb-server php-mysql

Isso instalaria um servidor de banco de dados e o módulo PHP MySQL para que sua aplicação PHP possa se conectar a um banco de dados.

Leia também: Como Proteger Contra DDoS com Mod_evasive no Servidor Apache

Como Usar Apache MPM Event e PHP-FPM em Distribuições Baseadas em RedHat

A outra escolha popular de distribuição de servidor é o RedHat ou CentOS. Da mesma forma que acima, um exemplo de uma instalação limpa do Apache com MPM event ativado e PHP-FPM será oferecido.

Faça login como root e instale o Apache.

yum install httpd

Ao contrário das distribuições baseadas em Debian, aqui você verá que o Apache usa o MPM prefork por padrão, pelo menos na versão mais recente do CentOS 7 disponível no momento da redação.

apachectl-V

Apache Php Fpm Check Mpm Centos

Para ativar o MPM event, você precisa editar um arquivo de configuração.

sed-i'/mpm_prefork\.so$/s/^/#/'/etc/httpd/conf.modules.d/00-mpm.conf

Isso adicionará um sinal # para comentar (desativar) a linha LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

Apache Php Fpm Mpm Conffile On Centos

Agora descomente (ative) a linha #LoadModule mpm_event_module modules/mod_mpm_event.so removendo o sinal # anterior com o próximo comando.

sed-i'/mpm_event\.so$/s/^#//'/etc/httpd/conf.modules.d/00-mpm.conf

Inicie o Apache e habilite-o para iniciar automaticamente na inicialização.

systemctl start httpd.service  
systemctl enable httpd.service

Verifique se o Apache agora usa o MPM event.

apachectl-V

Apache Php Fpm Mpm Event Enabled Status Centos

Instale o PHP-FPM e o módulo FastCGI.

yum install php-fpm mod_fcgid

Crie “/etc/httpd/conf.d/php.conf” para instruir o Apache sobre como processar arquivos PHP. Copie TODO o conteúdo abaixo e cole tudo de uma vez no terminal, depois pressione ENTER.

cat</etc/httpd/conf.d/php.conf  
# Redirecionar para php-fpm local se mod_php não estiver disponível  
  
  
# Habilitar cabeçalhos de autorização http  
  
SetEnvIfNoCase ^Authorization$ "(.+)"HTTP_AUTHORIZATION=$1  
IfModule>  
  
  
#SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost"  
SetHandler "proxy:fcgi://127.0.0.1:9000"  
FilesMatch>  
  
# Negar acesso a fontes php brutas por padrão  
# Para reabilitar, é recomendável habilitar o acesso aos arquivos  
# apenas em host virtual específico ou diretório  
Require all denied  
FilesMatch>  
# Negar acesso a arquivos sem nome de arquivo (por exemplo, '.php')  
  
Require all denied  
FilesMatch>  
IfModule>  
IfModule>  
PASTE

O crédito por essa ótima configuração vai para o Debian. Outras fontes recomendam um arquivo de configuração simples como:


SetHandler "proxy:fcgi://127.0.0.1:9000"

Mas isso é vulnerável a alguns ataques, e se certos serviços falharem, você pode expor arquivos PHP ao público, potencialmente expondo senhas armazenadas, códigos e dados sensíveis.

Reinicie o Apache.

systemctl restart httpd.service

Inicie o PHP-FPM e habilite seu início automático na inicialização.

systemctl start php-fpm.service  
systemctl enable php-fpm.service

Conclusão

Agora você tem um servidor Apache que escala muito melhor com o tráfego. No entanto, lembre-se de que você está usando as configurações padrão, que são as “melhores” para a maioria das pessoas. Se você realmente quer extrair o máximo do seu servidor HTTP, precisa ler sobre várias variáveis que você pode ajustar. Os valores corretos para isso são altamente dependentes dos recursos do seu servidor, do tráfego esperado e da aplicação PHP.