Quase todos os tutoriais sobre como instalar a pilha LAMP (Linux, Apache, MySQL, PHP) irão recomendar que você use o módulo Apache embutido para processar scripts PHP. Por exemplo, no Ubuntu, você habilitaria isso ao usar um comando como sudo apt install libapache2-mod-php
para instalar um pacote. Isso, por sua vez, forçaria o Apache a usar mpm_prefork. Cada vez que um visitante acessa seu site, um novo processo será lançado para lidar com essa conexão. Isso funciona bem quando o tráfego está baixo.
No entanto, torna-se um grande problema se você receber uma explosão repentina de tráfego. Por exemplo, uma postagem do Reddit pode incluir seu site e, se a postagem se tornar popular, você poderá receber milhares de visitantes em apenas alguns minutos.
Na melhor das hipóteses, se o Apache for capaz de lidar com o estouro do 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. Na pior das hipóteses, o servidor começará a apresentar atrasos graves e algumas conexões serão simplesmente interrompidas por falta de recursos. Nesse caso, os visitantes verão um erro em seus navegadores.
De qualquer forma, não é um bom cenário, 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 maneira. Mas com mpm_event, O Apache pode lidar com picos repentinos de tráfego de uma maneira muito mais eficiente. Recomenda-se, porém, 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 virtual privado, adicione mais núcleos de CPU virtuais à sua situação e armazenamento SSD. RAM é secundária.
Como usar o evento Apache MPM e PHP-FPM em distribuições baseadas em Debian
No Debian, Ubuntu ou outras distros desta família, simplesmente evite instalar o pacote “libapache2-mod-php”. Quando você instala o Apache, ele usa o evento MPM por padrão. Mas ao instalar o pacote mencionado, um script desabilita o evento MPM e habilita o pré-garfo MPM. O módulo Apache PHP só pode funcionar (com segurança) com mpm_prefork. Claro, sem “libapache2-mod-php,” você não tem processador para arquivos PHP. Portanto, você usará PHP-FPM em vez do módulo PHP incluído no Apache. Aqui está como você instalaria uma pilha LAMP em um servidor novo. Você pode adaptar as etapas de acordo com os requisitos de seu aplicativo da web.
Primeiro, faça login como root. Em seguida, instale o Apache.
apt update && apt install apache2
Neste ponto, você pode ver que o Apache realmente é fornecido com o evento MPM habilitado por padrão.
apachectl -V
Instale o PHP-FPM.
apt install php-fpm
Você verá instruções sobre como habilitar o processador PHP no Apache.
Ative o protocolo FastCGI.
a2enmod proxy_fcgi
Habilite 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 outra coisa, por exemplo a2enconf php7.6-fpm
, porque PHP-FPM seria uma versão diferente.
Reinicie o Apache.
systemctl restart apache2
Instale o restante de seus requisitos para seu aplicativo 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 seu aplicativo PHP possa se conectar a um banco de dados.
Como usar o evento Apache MPM e PHP-FPM em distribuições baseadas em RedHat
A outra escolha popular de distribuição de servidor é RedHat ou CentOS. Da mesma forma como acima, um exemplo de uma instalação limpa do Apache com evento MPM habilitado e PHP-FPM será oferecido.
Faça login como root e instale o Apache.
yum install httpd
Ao contrário das distros baseadas em Debian, aqui você verá que o Apache usa MPM prefork por padrão, pelo menos no CentOS 7 mais recente disponível no momento da escrita.
apachectl -V
Para habilitar o evento MPM, você deve editar um arquivo de configuração.
sed -i '/mpm_prefork.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf
Isso irá adicionar um #
assine para comentar (inativar) 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 anterior #
assine 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 inicialização automática na inicialização.
systemctl start httpd.service
systemctl enable httpd.service
Verifique se o Apache agora usa evento MPM.
apachectl -V
Instale o módulo PHP-FPM e 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, cole tudo de uma vez no terminal e pressione ENTER.
cat <<PASTE > /etc/httpd/conf.d/php.conf # Redirect to local php-fpm if mod_php is not available <IfModule !mod_php7.c> <IfModule proxy_fcgi_module> # Enable http authorization headers <IfModule setenvif_module> SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 </IfModule> <FilesMatch ".+.ph(p[3457]?|t|tml)$"> #SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost" SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> <FilesMatch ".+.phps$"> # Deny access to raw php sources by default # To re-enable it's recommended to enable access to the files # only in specific virtual host or directory Require all denied </FilesMatch> # Deny access to files without filename (e.g. '.php') <FilesMatch "^.ph(p[3457]?|t|tml|ps)$"> Require all denied </FilesMatch> </IfModule> </IfModule> PASTE
O crédito por esta ótima configuração vai para o Debian. Outras fontes recomendam um arquivo de configuração simples, como:
<FilesMatch .php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>
Mas isso é vulnerável a alguns ataques e, se certos serviços falharem, você pode expor arquivos PHP ao público, potencialmente expondo senhas, códigos e dados confidenciais armazenados.
Reinicie o Apache.
systemctl restart httpd.service
Inicie o PHP-FPM e ative sua inicialização automática 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, como o que é “melhor” para a maioria das pessoas. Se você realmente deseja obter o máximo do seu servidor HTTP, deve ler sobre as várias variáveis que pode ajustar. Os valores corretos para esses são altamente dependentes dos recursos do seu servidor, tráfego esperado e aplicativo PHP.