在Jessie升级到php7后,Apache崩溃并出现munmap_chunk(): invalid pointer错误。

10

我最近在运行Debian 8的服务器上更新到了php 7.0.4。

以下是dpkg -l | grep php给我的结果:

ii  libapache2-mod-php7.0          7.0.4-1~dotdeb+8.1           amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  php-common                     21-1~dotdeb+8.1              all          Common files for PHP packages
ii  php-readline                   21-1~dotdeb+8.1              all          readline module for PHP [default]
ii  php7.0                         7.0.4-1~dotdeb+8.1           all          server-side, HTML-embedded scripting language (metapackage)
ii  php7.0-cli                     7.0.4-1~dotdeb+8.1           amd64        command-line interpreter for the PHP scripting language
ii  php7.0-common                  7.0.4-1~dotdeb+8.1           all          Common files for packages built from the PHP source
ii  php7.0-curl                    7.0.4-1~dotdeb+8.1           amd64        CURL module for PHP
ii  php7.0-gd                      7.0.4-1~dotdeb+8.1           amd64        GD module for PHP
ii  php7.0-imap                    7.0.4-1~dotdeb+8.1           amd64        IMAP module for PHP
ii  php7.0-intl                    7.0.4-1~dotdeb+8.1           amd64        Internationalisation module for PHP
ii  php7.0-json                    7.0.4-1~dotdeb+8.1           amd64        JSON module for PHP
ii  php7.0-mcrypt                  7.0.4-1~dotdeb+8.1           amd64        libmcrypt module for PHP
ii  php7.0-mysql                   7.0.4-1~dotdeb+8.1           amd64        MySQL module for PHP
ii  php7.0-opcache                 7.0.4-1~dotdeb+8.1           amd64        Zend OpCache module for PHP
ii  php7.0-readline                7.0.4-1~dotdeb+8.1           amd64        readline module for PHP

我的php应用程序大部分时间都运行良好。但在某些请求中,我仅收到生成页面的页面,没有可预见的原因。

在这种情况下,/var/log/apache2/error.log指出:

*** Error in `/usr/sbin/apache2': munmap_chunk(): invalid pointer: 0x00007efc6ddb4a50 ***
*** Error in `/usr/sbin/apache2': munmap_chunk(): invalid pointer: 0x00007efc6dd5cad0 ***
[Wed Mar 09 11:26:44.940931 2016] [core:notice] [pid 28486] AH00052: child pid 29338 exit signal Aborted (6)
[Wed Mar 09 11:26:44.941017 2016] [core:notice] [pid 28486] AH00052: child pid 29344 exit signal Aborted (6)
*** Error in `/usr/sbin/apache2': munmap_chunk(): invalid pointer: 0x00007efc6dd5cad0 ***
[Wed Mar 09 11:26:46.942581 2016] [core:notice] [pid 28486] AH00052: child pid 29347 exit signal Aborted (6)

我会提供更多信息:

语法:

$ apachectl configtest
Syntax OK

版本:

apachectl -v
Server version: Apache/2.4.10 (Debian)
Server built:   Nov 28 2015 14:05:48

我的意思是,在 PHP 更新之前,我没有看到这些错误。这里出了什么问题?或者我怎样才能更好地找到源头?我很迷茫,因为这个错误似乎是随机发生的。有时候,同一个请求在一分钟前失败了,但现在成功了。我会感激你的帮助。


我有同样的问题。Apache2版本与您相同,php 7.0.8.1。您找到任何解决方案了吗? - DARK_DIESEL
我在那个服务器上降级回到了php 5.6。因此,我无法测试建议的解决方案。 - Daniel
4个回答

12

这已经是我们第二次遭受同样问题的沉重打击。

当在最新版本的Debian上运行PHP 7.0时,这个问题就会出现。 这将破坏任何大量使用正则表达式的网站系统。 我们已经看到了它在Neos(neos.io)或Typo3(从6.2开始)中发生。

如果无法使用libpcre3的测试版本,则可以在php.ini中禁用即时编译。

  1. 编辑您的php.ini,在任何位置添加pcre.jit=0
  2. 重新启动Apache
  3. 感到高兴

禁用JIT在我的情况下起作用了。我注意到这个问题似乎只存在于PHP >7.1.3中。不知道它是否会被上游修复? - trkoch

2
我有和你一样的版本,通过升级libpcre3 软件包解决了问题,就像 @Kevin Fischer 所写的那样。
我将libpcre3软件包从稳定版的2:8.35-3.3+deb8u4 升级到了测试版的2:8.38-3.1
步骤如下:
  1. 将行deb http://ftp.us.debian.org/debian testing main contrib non-free添加到 /etc/apt/sources.list 中
  2. 创建文件 /etc/apt/apt.conf.d/99default-release ,内容为:APT::Default-Release "stable";
  3. 以root身份运行命令apt-get update
  4. 运行命令apt-get -t testing install libpcre3 安装测试版的 libpcre3软件包
  5. 重启您的服务器并检查日志,错误应该已经消失。
要了解更多关于安装测试软件包的信息,请参见此问答警告!测试软件包可能无法正常工作!请自行决定是否更新或等待新版本发布。

1
我们刚遇到了类似的情况,其中我们框架的一个组件会出现以下错误:*** Error in `php': munmap_chunk(): invalid pointer: 0x00007fdce5550060 ***。我不能告诉您关于该漏洞本身的任何信息,但它的原因是一个破损的libpcre3版本,即8.35-3.3+deb8u4。我们正在运行自定义构建,因为PHP7需要来自libpcre3的JIT支持,而默认的Ubuntu版本中不包含此支持(Ubuntu 14.04 LTS, 8.31-2ubuntu2.3)。升级libpcre3版本解决了我们的问题。

0

我也遇到了不少令人头疼的apache崩溃问题,但是上面提供的解决方案和其他网站上的方法都无法解决我的问题。

经过多次尝试和错误,我终于找到了问题的根本原因。

我手动编辑了PHP配置,并添加了两个扩展程序。这些扩展程序都是针对微软SQL Server的。

我在php.ini中添加了以下几行:

extension=sqlsrv.so
extension=pdo_sqlsrv

我没有注意到我在pdo驱动程序中忘记了“.so”。 更改如下所示的行后,Apache服务再次正常运行。

extension=sqlsrv.so
extension=pdo_sqlsrv.so

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接