mude o apache do prefork para o evento no Ubuntu 16, obtenha o php 7 funcionando

4

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

sudo apachectl -V

e ficaram alarmados ao descobrir que o Server MPM é o prefork . Eles enfaticamente disseram: NÃO USE PREFORK EM UM SERVIDOR DE PRODUÇÃO. Como se vê, os pacotes do Ubuntu (supostamente herdados do Debian?) Insistem em executar o apache no modo prefork apesar do fato de que recomendado para executar o PHP com o Apache recomenda claramente proxy_fcgi e php-fpm, depois fcgid e, finalmente, diz que você não deve usar o prefork:

Why you shouldn't use mod_php with the prefork mpm anymore

  • mod_php is loaded into every httpd process all the time. Even when httpd is serving static/non php content, that memory is in use.
  • mod_php is not thread safe and forces you to stick with the prefork mpm (multi process, no threads), which is the slowest possible configuration

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

Eu tentei mudar o apache para modo de evento usando a2enmod e quando tentei disparar o apache de volta eu recebi um erro:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP

De qualquer forma, eu queria saber se alguém tinha algumas instruções mínimas, passo-a-passo para executar o modo fastCGI no Ubuntu 16 com o 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 arruinar meu ambiente de produção com decisões ruins.

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

    
por S. Imp 22.03.2018 / 17:10

2 respostas

4

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

Em primeiro lugar, enquanto escrevia, os pacotes apache2 do Ubuntu insistem em prefork se você quiser instalar o PHP. Não se desespere, no entanto, porque você ainda pode usar instaladores de pacotes para instalar e atualizar o PHP e apache2 e ainda fazer sua configuração funcionar com o Apache no modo evento usando PHP-FPM como recomendado pelo wiki do Apache e descrito com mais detalhes em PHP de alto desempenho no apache httpd 2.4.x usando mod_proxy_fcgi e php-fpm . A ideia básica é que o apache2 e o PHP-FPM se comuniquem via socket ao invés do PHP rodando como um módulo do Apache.

1) Remova ou desative o módulo PHP do Apache

Como os pacotes do Ubuntu insistem no prefork Apache ao instalar o PHP, temos que separá-los. Eu fiz isso usando o apt para desinstalar libapache2-mod-php7.0 porque eu não preciso mais do pacote:

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

Alternativamente, você pode desabilitar o módulo php7.0 do Apache, mas isto não removerá o pacote apt do seu sistema, o que deixa para trás irritantes restrições ao sistema.

sudo a2dismod php7.0

2) Mude o Apache para o modo de evento e habilite o fcgid

Eu acredito que esses comandos devem fazer o truque:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Instalar o PHP-FPM

Eu já tenho o PHP 7 instalado com seus vários módulos, então eu apenas instalei 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 o PHP-FPM:

No meu caso, eu editei o host SSL padrão, /etc/apache2/sites-available/default-ssl.conf , e adicionei esta linha 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 o PHP-FPRM e com o caminho desta 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 isto:

Server MPM:     event

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

    
por 22.03.2018 / 21:19
4

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

Embora a maneira mais eficaz seja o apache w / event + mod_proxy_fcgi - > php-fpm.

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

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

Sobre o wiki eu prefiro ou sugiro o método "handler". link .

Ou seja, configure o php-fpm para ter um socket pronto e com permissões suficientes para o usuário do Apache enviar pedidos para ele e configurar 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 inverterá as requisições apropriadas para o php-fpm.

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

Editar 2:

Como por solicitação, você não precisa desinstalar os pacotes mod_php do debian / ubuntu, o Apache só se preocupa com sua configuração, então o descarregamento do módulo será suficiente.

    
por 22.03.2018 / 19:54