Ubuntu 16.04升级后,PHP以文本形式呈现


20

Ubuntu 16.04升级后,Apache将PHP文件作为文本呈现。

Apache已安装并正在运行。PHP7正在运行。当我执行以下命令时,我得到正确的输出:

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

但是,当我访问http://localhost/info.php或任何其他php文件时,我得到的是文件内容而不是页面。

在线的大多数帮助都适用于Ubuntu和PHP的旧版本,因此我不确定它们是否可靠。

更新:安装libapache2-mod-php7.0并启用php7.0后,Apache将无法启动。查看输出:

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.

输出 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'.

输出 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) 

关于错误,Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP我确实在https://wiki.archlinux.org/index.php/Apache_HTTP_Server中找到了有关此问题的帮助,但是文件路径与Ubuntu中的文件路径不匹配,因此我没有尝试应用建议修复。

Answers:


27

php命令由提供php7.0-cli Ubuntu 16.04上软件包。运行CLI与Web服务器配置正交。

您需要安装和配置Web SAPI之一-apache2,fpm或cgi。最简单的是安装apache2 SAPI。

  1. 要安装apache2 SAPI,请运行apt-get install libapache2-mod-php(这将拉出默认的PHP版本,当前为libapache2-mod-php7.0)。该软件包应启用自身并切换到apache2 prefork MPM,这是唯一受支持的MPM。如果不是,请尝试运行a2enmod php7.0并查找错误。安装应自动从事件MPM切换到prefork MPM,但如果没有,则可以通过手动操作将其切换,sudo a2dismod mpm_event然后按sudo a2enmod mpm_prefork

  2. 要安装FPM SAPI,请运行apt-get install php-fpm,然后通过运行启用FPM a2enconf php7.0-fpm。FPM SAPI更安全,但更难正确配置。

  3. 要安装CGI SAPI,请运行apt-get install php-cgi,然后通过运行启用CGI a2enconf php7.0-cgi。请不要以不推荐使用CGI的方式运行PHP,但是在特殊部署中可能会派上用场。


我已经编辑了我的问题,以提供更多详细信息。
machadoug '16

@machadoug编辑了答案,其中包括描述如何切换MPM的方式
oerdnj '16

您对如何解决它有任何想法吗?
machadoug '16

1
@machadoug是的,我添加了“安装应该自动从事件MPM切换到prefork MPM,但如果没有,则可以先执行sudo a2dismod mpm_event,然后执行sudo a2enmod mpm_prefork来手动切换。”
oerdnj '16

1
选项2是否缺少步骤?我已经安装了apache2和php-fpm,并运行a2enconf命令。一切都成功了,两个服务都在运行,但是我的PHP文件直接输出了,而没有php处理它们。Apache或PHP-FPM的任何日志中都没有错误。
Andrew


0

我还以不同的方式被这个问题咬了:

默认情况下,PHP脚本不会在用户目录中运行。因此,如果您的服务器在用户的主文件夹中支持public_html并希望让用户在其中运行php,则应删除php7.0.conf其中禁用该部分的部分。


0

在最新的Apache 2.0中,对于Ubuntu 16.04.2,我发现Apache已预先配置了启用的线程,但是默认的PHP 7没有。如果未使用线程安全编译PHP,则需要切换到不使用线程的prefork MPM。

为此,首先禁用:

sudo a2dismod mpm_event 

然后启用:

sudo a2enmod mpm_prefork 

您必须以正确的顺序执行此操作,因为它们是互斥的。

然后重新启动Apache:

sudo service apache2 restart

您现在应该很好,没有任何问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.