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

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 apache2Neste ponto, você pode ver que o Apache realmente vem com o MPM event ativado por padrão.
apachectl-V
Instale o PHP-FPM.
apt install php-fpmVocê verá instruções sobre como habilitar o processador PHP no Apache.

Ative o protocolo FastCGI.
a2enmod proxy_fcgiAtive a configuração padrão do PHP-FPM para o Apache.
a2enconf php7.0-fpmNota: 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 apache2Instale o resto dos seus requisitos para sua aplicação PHP. Aqui está um exemplo:
apt install mariadb-server php-mysqlIsso 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 httpdAo 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
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.confIsso adicionará um sinal # para comentar (desativar) a linha LoadModule mpm_prefork_module modules/mod_mpm_prefork.so.

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.confInicie o Apache e habilite-o para iniciar automaticamente na inicialização.
systemctl start httpd.service
systemctl enable httpd.serviceVerifique se o Apache agora usa o MPM event.
apachectl-V
Instale o PHP-FPM e o módulo FastCGI.
yum install php-fpm mod_fcgidCrie “/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.serviceInicie o PHP-FPM e habilite seu início automático na inicialização.
systemctl start php-fpm.service
systemctl enable php-fpm.serviceConclusã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.