PHP renderowane jako tekst po aktualizacji Ubuntu 16.04

20

Apache renderuje pliki PHP jako tekst po aktualizacji Ubuntu 16.04.

Apache jest zainstalowany i uruchomiony. PHP7 działa. Kiedy wykonuję następujące polecenie, otrzymuję prawidłowe dane wyjściowe:

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

Jednak gdy uzyskuję dostęp do http: //localhost/info.php lub dowolnego innego pliku php, otrzymuję zawartość pliku zamiast strony.

Większość pomocy online dotyczy starszych wersji zarówno Ubuntu, jak i PHP, więc nie jestem pewien, czy są niezawodne, czy nie.

AKTUALIZACJA: Apache nie uruchomi się po zainstalowaniu libapache2-mod-php7.0 i włączeniu php7.0. Zobacz dane wyjściowe:

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.

Wyjście 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'.

Wyjście 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) 

Jeśli chodzi o błąd Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP, znalazłem pomoc w https://wiki.archlinux.org/index.php/Apache_HTTP_Server dotyczącą tego problemu, jednak ścieżki do plików nie pasowały do ​​tych w Ubuntu, więc nie próbowałem zastosować zalecana poprawka.

machadoug
źródło

Odpowiedzi:

27

phpKomenda jest przez php7.0-clipakiet na Ubuntu 16.04. Uruchamianie CLI jest prostopadłe do konfiguracji serwera WWW.

Musisz zainstalować i skonfigurować jeden z internetowych interfejsów SAPI - apache2, fpm lub cgi. Najłatwiej jest zainstalować apache2 SAPI.

  1. Aby zainstalować SAPI apache2, uruchom apt-get install libapache2-mod-php(obecnie spowoduje to pobranie domyślnej wersji PHP libapache2-mod-php7.0). Pakiet powinien się włączyć i przełączyć na MPC apache2, który jest jedynym obsługiwanym MPM. Jeśli nie, spróbuj uruchomić a2enmod php7.0i poszukać błędów. Instalacja powinna automatycznie przełączyć się ze zdarzenia MPM na prefork MPM, ale jeśli nie, możesz przełączyć go ręcznie, wykonując, sudo a2dismod mpm_eventa następnie sudo a2enmod mpm_prefork.

  2. Aby zainstalować FPM SAPI, uruchom, apt-get install php-fpma następnie włącz FPM, uruchamiając a2enconf php7.0-fpm. FPM SAPI jest bezpieczniejszy, ale trudniej go poprawnie skonfigurować.

  3. Aby zainstalować CGI SAPI, uruchom, apt-get install php-cgia następnie włącz CGI, uruchamiając a2enconf php7.0-cgi. Należy pamiętać, że CGI nie jest zalecanym sposobem uruchamiania PHP, ale może się przydać w specjalnych wdrożeniach.

oerdnj
źródło
Zredagowałem swoje pytanie, aby podać więcej szczegółów.
machadoug
@machadoug zredagował odpowiedź w celu dołączenia opisu, jak przełączać MPM
oerdnj 24.04.2016
Czy masz pomysł, jak to naprawić?
machadoug 24.04.16
1
@machadoug Tak, dodałem „Instalacja powinna automatycznie przełączyć się ze zdarzenia MPM na prefork MPM, ale jeśli nie, możesz to zmienić ręcznie, wykonując sudo a2dismod mpm_event, a następnie sudo a2enmod mpm_prefork.”
oerdnj 24.04.16
1
Czy brakuje opcji 2? Zainstalowałem apache2 i php-fpm i uruchomiłem polecenie a2enconf. Wszystkie zakończyły się sukcesem i obie usługi są uruchomione, ale moje pliki PHP są wysyłane bezpośrednio bez przetwarzania php. Brak błędów w dziennikach Apache lub PHP-FPM.
Andrew Ensley,
1

Ponownie uruchomiłem mój, instalując libapache2-mod-php7.0. Mam nadzieję że to pomoże.

Tommy Holt
źródło
0

Ten problem mnie też ugryzł w inny sposób:

Domyślnie skrypty PHP nie będą działać w katalogach użytkowników. Więc jeśli twój serwer obsługuje public_html w folderze domowym użytkowników i chcesz pozwolić użytkownikom uruchamiać w nim php, powinieneś usunąć część, php7.0.confktóra go wyłącza.

Calmarius
źródło
0

W najnowszym Apache 2.0 dla Ubuntu 16.04.2 odkryłem, że Apache jest wstępnie skonfigurowany z włączonymi wątkami, ale domyślny PHP 7 nie. Jeśli PHP nie jest skompilowane z wątkami, musisz przełączyć się na MPork prefork, który nie używa wątków.

Aby to zrobić, najpierw wyłącz:

sudo a2dismod mpm_event 

Następnie włącz:

sudo a2enmod mpm_prefork 

Musisz to zrobić w odpowiedniej kolejności, ponieważ wzajemnie się wykluczają.

Następnie uruchom ponownie Apache:

sudo service apache2 restart

Powinieneś już być bez problemów.

Jeff Galbraith
źródło