PHP renderizado como texto após a atualização do Ubuntu 16.04

20

O Apache está renderizando arquivos PHP como texto após a atualização do Ubuntu 16.04.

O Apache está instalado e em execução. O PHP7 está em execução. Quando executo o seguinte comando, obtenho a saída correta:

php -r 'echo "\n\nYour PHP installation is working fine.\n\n\n";'

No entanto, quando acesso o http: //localhost/info.php ou qualquer outro arquivo php, recebo o conteúdo do arquivo em vez da página.

A maior parte da ajuda on-line é para versões mais antigas do Ubuntu e PHP, então não tenho certeza de que sejam confiáveis ​​ou não.

ATUALIZAÇÃO: O Apache não será iniciado após a instalação do libapache2-mod-php7.0 e da ativação do php7.0. Veja a saída:

douglas@douglas-acer:~$ sudo service apache2 restart
douglas@douglas-acer:~$ sudo apt-get install libapache2-mod-php
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  libapache2-mod-php
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/2.960 B of archives.
After this operation, 15,4 kB of additional disk space will be used.
Selecting previously unselected package libapache2-mod-php.
(Reading database ... 263897 files and directories currently installed.)
Preparing to unpack .../libapache2-mod-php_1%3a7.0+35ubuntu6_all.deb ...
Unpacking libapache2-mod-php (1:7.0+35ubuntu6) ...
Setting up libapache2-mod-php (1:7.0+35ubuntu6) ...
douglas@douglas-acer:~$ sudo service apache2 restart
douglas@douglas-acer:~$ sudo a2enmod php7.0
Considering conflict php5 for php7.0:
Enabling module php7.0.
To activate the new configuration, you need to run:
  service apache2 restart
douglas@douglas-acer:~$ sudo service apache2 restart
Job for apache2.service failed because the control process exited with error code. See "systemctl status apache2.service" and "journalctl -xe" for details.
douglas@douglas-acer:~$ sudo apt-get purge php5
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package 'php5' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

A saída de systemctl status apache2.service:

● apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: failed (Result: exit-code) since Dom 2016-04-24 08:21:35 BRT; 14s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 9216 ExecStart=/etc/init.d/apache2 start (code=exited, status=1/FAILURE)

Abr 24 08:21:35 douglas-acer apache2[9216]:  * The apache2 configtest failed.
Abr 24 08:21:35 douglas-acer apache2[9216]: Output of config test was:
Abr 24 08:21:35 douglas-acer apache2[9216]: [Sun Apr 24 08:21:35.235583 2016] [:crit] [pid 9226:tid 140666367190912] Apache is running a threade
Abr 24 08:21:35 douglas-acer apache2[9216]: AH00013: Pre-configuration failed
Abr 24 08:21:35 douglas-acer apache2[9216]: Action 'configtest' failed.
Abr 24 08:21:35 douglas-acer apache2[9216]: The Apache error log may have more information.
Abr 24 08:21:35 douglas-acer systemd[1]: apache2.service: Control process exited, code=exited status=1
Abr 24 08:21:35 douglas-acer systemd[1]: Failed to start LSB: Apache2 web server.
Abr 24 08:21:35 douglas-acer systemd[1]: apache2.service: Unit entered failed state.
Abr 24 08:21:35 douglas-acer systemd[1]: apache2.service: Failed with result 'exit-code'.

A saída de journalctl -xe

-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit apache2.service has finished shutting down.
Abr 24 08:37:59 douglas-acer systemd[1]: Starting LSB: Apache2 web server...
-- Subject: Unit apache2.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit apache2.service has begun starting up.
Abr 24 08:37:59 douglas-acer apache2[10261]:  * Starting Apache httpd web server apache2
Abr 24 08:37:59 douglas-acer apache2[10261]:  *
Abr 24 08:37:59 douglas-acer apache2[10261]:  * The apache2 configtest failed.
Abr 24 08:37:59 douglas-acer apache2[10261]: Output of config test was:
Abr 24 08:37:59 douglas-acer apache2[10261]: [Sun Apr 24 08:37:59.748900 2016] [:crit] [pid 10271:tid 139911432607616] Apache is running a threa
Abr 24 08:37:59 douglas-acer apache2[10261]: AH00013: Pre-configuration failed
Abr 24 08:37:59 douglas-acer apache2[10261]: Action 'configtest' failed.
Abr 24 08:37:59 douglas-acer apache2[10261]: The Apache error log may have more information.
Abr 24 08:37:59 douglas-acer systemd[1]: apache2.service: Control process exited, code=exited status=1
Abr 24 08:37:59 douglas-acer systemd[1]: Failed to start LSB: Apache2 web server.
-- Subject: Unit apache2.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit apache2.service has failed.
-- 
-- The result is failed.
Abr 24 08:37:59 douglas-acer systemd[1]: apache2.service: Unit entered failed state.
Abr 24 08:37:59 douglas-acer systemd[1]: apache2.service: Failed with result 'exit-code'.
Abr 24 08:37:59 douglas-acer sudo[10258]: pam_unix(sudo:session): session closed for user root
Abr 24 08:38:02 douglas-acer sudo[10276]:  douglas : TTY=pts/18 ; PWD=/home/douglas ; USER=root ; COMMAND=/bin/journalctl -xe
Abr 24 08:38:02 douglas-acer sudo[10276]: pam_unix(sudo:session): session opened for user root by (uid=0)
Abr 24 08:38:38 douglas-acer sudo[10276]: pam_unix(sudo:session): session closed for user root
Abr 24 08:39:01 douglas-acer CRON[10297]: pam_unix(cron:session): session opened for user root by (uid=0)
Abr 24 08:39:01 douglas-acer CRON[10299]: (root) CMD (  [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean)
Abr 24 08:39:01 douglas-acer CRON[10297]: pam_unix(cron:session): session closed for user root
Abr 24 08:39:01 douglas-acer CRON[10298]: pam_unix(cron:session): session opened for user root by (uid=0)
Abr 24 08:39:01 douglas-acer CRON[10300]: (root) CMD (  [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean)
Abr 24 08:39:02 douglas-acer CRON[10298]: pam_unix(cron:session): session closed for user root
Abr 24 08:39:51 douglas-acer sudo[10122]: pam_unix(sudo:session): session closed for user root
Abr 24 08:39:53 douglas-acer sudo[10368]:  douglas : TTY=pts/5 ; PWD=/home/douglas ; USER=root ; COMMAND=/bin/journalctl -xe
Abr 24 08:39:53 douglas-acer sudo[10368]: pam_unix(sudo:session): session opened for user root by (uid=0) 

Em relação ao erro Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP, encontrei alguma ajuda em https://wiki.archlinux.org/index.php/Apache_HTTP_Server em relação a esse problema, no entanto, os caminhos dos arquivos não coincidiam com os do Ubuntu, então não tentei aplicar o correção recomendada.

machadoug
fonte

Respostas:

27

O phpcomando é fornecido pelo php7.0-clipacote no Ubuntu 16.04. A execução da CLI é ortogonal à configuração do servidor da web.

Você precisa instalar e configurar um dos SAPIs da web - apache2, fpm ou cgi. O mais fácil é instalar o apache2 SAPI.

  1. Para instalar o apache2 SAPI, execute apt-get install libapache2-mod-php(isso puxará a versão PHP padrão, atualmente libapache2-mod-php7.0). O pacote deve habilitar-se e alternar para o apache2 prefork MPM que é o único MPM suportado. Caso contrário, tente executar a2enmod php7.0e procure por erros. A instalação deve alternar do evento MPM para o pré-fork MPM automaticamente, mas, se não, você pode alternar manualmente, sudo a2dismod mpm_eventseguindo-o sudo a2enmod mpm_prefork.

  2. Para instalar o FPM SAPI, execute apt-get install php-fpme ative o FPM executando a2enconf php7.0-fpm. O SAPI do FPM é mais seguro, mas mais difícil de configurar corretamente.

  3. Para instalar o CGI SAPI, execute apt-get install php-cgie ative o CGI executando a2enconf php7.0-cgi. Não se esqueça que o CGI não é uma maneira recomendada de executar o PHP, mas pode ser útil em implantações especiais.

oerdnj
fonte
Editei minha pergunta para fornecer mais detalhes.
machadoug
@machadoug editado a resposta para incluir a descrição como MPMs interruptor
oerdnj
Você tem alguma idéia de como corrigi-lo?
machadoug
1
@machadoug Sim, eu adicionei "A instalação deve alternar do evento MPM para pré-fork MPM automaticamente, mas se isso não ocorrer, você pode alterná-lo manualmente, executando sudo a2dismod mpm_event seguido por sudo a2enmod mpm_prefork."
oerdnj
1
Há uma etapa ausente na opção 2? Instalei o apache2 e o php-fpm e execute o comando a2enconf. Todos foram bem-sucedidos e os dois serviços estão em execução, mas meus arquivos PHP estão sendo produzidos diretamente sem o php processá-los. Não há erros nos logs do Apache ou PHP-FPM.
Andrew Ensley 06/06
1

Eu fiz o meu rodando novamente instalando o libapache2-mod-php7.0. Espero que isto ajude.

Tommy Holt
fonte
0

Eu também fui mordido por esse problema de uma maneira diferente:

Por padrão, os scripts PHP não serão executados nos diretórios do usuário. Portanto, se seu servidor suporta public_html na pasta inicial dos usuários e deseja permitir que os usuários executem php nela, você deve remover a parte php7.0.confque a desabilita.

Calmarius
fonte
0

No Apache 2.0 mais recente, para o Ubuntu 16.04.2, descobri que o Apache está pré-configurado com os threads ativados, mas o PHP 7 padrão não. Se o PHP não for compilado com thread-safe, será necessário mudar para o MPM prefork, que não usa threads.

Para fazer isso, primeiro desative:

sudo a2dismod mpm_event 

Em seguida, ative:

sudo a2enmod mpm_prefork 

Você deve fazer isso na ordem certa, pois eles são mutuamente exclusivos.

Em seguida, reinicie o Apache:

sudo service apache2 restart

Você deve estar pronto agora sem problemas.

Jeff Galbraith
fonte