mude o apache do prefork para o evento no Ubuntu 16, faça o php 7 funcionar

11

O Apache estava lento na produção. Depois de procurar respostas por algum tempo, finalmente fui ao canal IRC #apache e os profissionais me fizeram verificar o modo apache com este comando:

sudo apachectl -V

e ficaram alarmados ao descobrir que o Server MPM é pré - fork . Eles enfaticamente disseram: NÃO USE PREFORK EM UM SERVIDOR DE PRODUÇÃO. Acontece que os pacotes Ubuntu (presumivelmente herdados do Debian?) Insistem em executar o apache no modo prefork, apesar do método recomendado para executar o PHP com Apache recomendar claramente proxy_fcgi e php-fpm, depois o fcgid e, finalmente, diz que você não deve use prefork:

Por que você não deve mais usar o mod_php com o mpm prefork

  • O mod_php é carregado em todos os processos httpd o tempo todo. Mesmo quando o httpd está servindo conteúdo estático / não php, essa memória está em uso.
  • O mod_php não é seguro para threads e obriga a manter o mpm prefork (multi processo, sem threads), que é a configuração mais lenta possível

Essa página também contém alguns detalhes sobre o PHP-FPM, mas isso parece um pouco elaborado, pouco claro e envolve muita configuração manual. Estou decepcionado e surpreso O Ubuntu 16 não tem opção de pacote para o modo fastCGI ou algo assim.

Tentei mudar o apache para o modo de evento usando a2enmod e quando tentei acionar o apache novamente, recebi um erro:

O Apache está executando um MPM encadeado, mas seu módulo PHP não é compilado para ser seguro para encadeamentos. Você precisa recompilar o PHP

De qualquer forma, eu queria saber se alguém tinha algumas instruções passo a passo mínimas para obter o modo fastCGI em execução no Ubuntu 16 com PHP 7.0 , confiando nos instaladores de pacotes o máximo possível. Atualmente, estou vendo muitas instruções vagas e mal explicadas e estou preocupado em estragar meu ambiente de produção com más decisões.

Além disso, alguém deve adicionar mpm-event como uma opção de tag. Isso é o que os caras do #apache IRC recomendaram.

Pateta
fonte
Esse último erro ocorre porque você mudou para o evento, mas ainda está usando o mod_php. Desative mod_php e mude para php-fpm e ele desaparecerá. E posso recomendar o nginx?
Michael Hampton
@ MichaelHampton, o título deve mencionar PHP. Não é difícil mudar o apache para o evento. É difícil mudar o apache para o evento E fazer o php 7 funcionar.
S. Imp
1
@ MichaelHampton certamente você percebe que estou confuso sobre como "desativar o mod_php e mudar para php-fpm". Não é essa a pergunta que faço no meu post? Além disso, a questão não é sobre o nginx, que apresenta mais uma esfera de aprendizado. Mudar para o nginx não é prático para este projeto porque estou trabalhando com uma equipe.
S. Imp
Eu não mencionei como desativar os módulos Apache porque você demonstrou que já sabe como fazer isso. Quanto à habilitação do php-fpm, consulte as respostas a esta pergunta, tutoriais online etc.
Michael Hampton

Respostas:

15

O ezra-s sugere uma boa abordagem, mas não inclui alguns detalhes que podem ser confusos para as pessoas que confiam nos gerenciadores de pacotes. NOTA : Não tenho certeza se essas etapas são exatas. Se alguém encontrar problemas ou encontrar problemas, entre em contato e atualizarei esta postagem.

Em primeiro lugar, até o momento em que este artigo foi escrito, os pacotes apache2 do Ubuntu insistem em prefork se você deseja instalar o PHP. Não se desespere, no entanto, porque você ainda pode usar instaladores de pacote para instalar e atualizar PHP e apache2 e ainda obter sua configuração de trabalhar com Apache no evento modo utilizando PHP-FPM como recomendado pelo wiki Apache e descritos em mais detalhes em Alta PHP de desempenho no apache httpd 2.4.x usando mod_proxy_fcgi e php-fpm . A idéia básica é que o apache2 e o PHP-FPM se comuniquem via soquete, em vez do PHP sendo executado como um módulo Apache.

1) Remova ou desative o módulo Apache PHP

Como os pacotes Ubuntu insistem em pré-forjar o Apache ao instalar o PHP, precisamos separá-los. Fiz isso usando o apt para desinstalar o libapache2-mod-php7.0 porque não preciso mais do pacote:

sudo apt-get remove libapache2-mod-php7.0

Como alternativa, você pode desativar o módulo php7.0 Apache, mas isso não removerá o pacote apt do seu sistema, o que deixa para trás um problema irritante no sistema.

sudo a2dismod php7.0

2) Alterne o Apache para o modo de evento e ative o fcgid

Eu acredito que estes comandos devem fazer o truque:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Instale o PHP-FPM

Eu já tenho o PHP 7 instalado com seus vários módulos, então eu apenas instalo o PHP-FPM com este comando:

sudo apt-get install php7.0-fpm

4) Edite sua configuração do VirtualHost para manipular arquivos PHP com PHP-FPM:

No meu caso, editei o host SSL padrão, /etc/apache2/sites-available/default-ssl.conf , e adicionei esta linha bem perto do topo:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

IMPORTANTE Isso instrui o Apache a lidar com solicitações de arquivos PHP com PHP-FPRM e o caminho nesta diretiva ( /run/php/php7.0-fpm.sock ) deve corresponder ao caminho especificado pela diretiva listen no arquivo / etc / php /7.0/fpm/pool.d/www.conf

5) Reinicie o Apache

sudo service apache2 restart

Para verificar se o modo de evento está ativado, use este comando:

sudo apachectl -V

Na saída, você deve ver isso:

Server MPM:     event

Tente criar uma página phpinfo e acessá-la no seu navegador. Você deve ver Server API: FPM/FastCGIna saída.

Pateta
fonte
5
Eu sugiro não usar ProxyPassMatch, porque não permitirá usar .htaccess no diretório Use isso: <FilesMatch \ .php $> SetHandler "proxy: unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </FilesMatch>
waza123 em
Isso também está funcionando gist.github.com/GAS85/990b46a3a9c2a16c0ece4e48ebce7300
user5858
O que acontecerá se eu não tocar neste arquivo ao contrário do que você pediu: /etc/apache2/sites-available/default-ssl.conf,? Mina https e http ambos funcionando bem
user5858
Eu segui a resposta, exceto ProxyPassMatch, adicionei a linha Filesmatch do comentário de @ waza123 à parte superior de 000-default.conf e reiniciei o apache2 e tudo está funcionando perfeitamente. Graças a ambos meus pequenos VPS está salvando uma tonelada de memória e CPU sobre mpm_prefork 🥳
DW1
Não precisei fazer o ProxyPass ou editar o arquivo com o Ubuntu Server 19.10. Após a etapa 3 (instalação do PHP-FPM), acabei de a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apachecriar e quando criei um arquivo phpinfo.php com <?php phpinfo();inside, a linha da API do servidor diz FPM / FastCGI. BTW, eu instalei o php7.3 porque, no momento em que escrevi este post, alguém deveria estar nessa versão, se não superior, e os repositórios do Ubuntu apt para o Ubuntu Server 19.10 passam para o php7.3 atualmente.
ServerChecker
6

As distribuições oferecem o método "mod_php" por conveniência.

Enquanto a maneira mais eficiente é apache w / event + mod_proxy_fcgi -> php-fpm.

Talvez eles devam atualizar com os tempos, mas é difícil para eles quando tantas estruturas vêm com as configurações .htaccess mod_php de uma maneira "plug & play". No final, é o administrador o único responsável por administrar e configurar seu site corretamente.

Se você estiver em produção, sugiro que você use um servidor de teste para praticar a atualização e as alterações.

Sobre o wiki, prefiro ou sugiro o método "manipulador". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

Ou seja, configure o php-fpm para ter um soquete pronto e com permissões suficientes para o usuário do Apache enviar solicitações a ele e configure o Apache para usá-lo.

Um exemplo rápido:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Editar:

Dessa forma, não importa qual versão do PHP você usa, porque o Apache não se importa, ele apenas reverterá as solicitações apropriadas para o php-fpm.

Além disso, não esqueça de descarregar o mod_php para poder usar o mpm_event.

Edição 2:

Conforme a solicitação, você não precisa desinstalar os pacotes mod_php do debian / ubuntu, o Apache se preocupa apenas com sua configuração, portanto, a descarga do módulo será necessária.

ezra-s
fonte
obrigado pela sua resposta. Venho fazendo muitas tentativas e erros e essa é a abordagem que parece estar funcionando atualmente. O processo real é um pouco mais complicado, porque você precisa obter o apache do prefork para o evento, desinstalar o libapache2-mod-php7.0 etc. Espero criar uma resposta mais completa daqui a pouco.
S. Imp
não é necessário "desinstalar" do ponto de vista do apache httpd, basta descarregar o módulo. Mesmo com event / prefork, os mpm também são módulos na 2.4, portanto, um descarrega o prefork e carrega o evento.
Ezra-s
ok, então talvez você não precise desinstalar o pacote, mas precisa desabilitar o módulo php para apache, no mínimo - e estou preocupado com uma atualização do apt-get que interrompe a instalação. Esses detalhes estão faltando na sua resposta. Eu ficaria encantado se você os adicionasse, porque não estou especialmente confiante em minha capacidade de esclarecer os detalhes sobre o que exatamente fiz.
S. Imp
Talvez eu os tenha assumido, o Apache também não se importa com pacotes debian, apenas com sua configuração funcional.
Ezra-s
O Apache se importará se uma atualização do pacote apt alterar sua configuração, que é um problema que encontrei em um ponto. No espírito da minha postagem original, gostaria de fornecer instruções detalhadas para outras pessoas que confiam nos instaladores (e nas atualizações) de pacotes como eu.
S. Imp