今天我的 apache 实例被某个 cron 作业自动重启了,我猜是之后它就不再运行了。apache 错误日志文件显示:
[Fri Jun 03 06:25:04.379685 2016] [mpm_prefork:notice] [pid 8256] AH00171: Graceful restart requested, doing restart
apache2: Syntax error on line 140 of /etc/apache2/apache2.conf: Syntax error on line 2 of /etc/apache2/mods-enabled/access_compat.load: Cannot load /usr/lib/apache2/modules/mod_access_compat.so into server: /usr/lib/apache2/modules/mod_access_compat.so: undefined symbol: ap_get_useragent_host
通过以下方式手动启动后
service apache2 start
它按预期工作。
我已经禁用了这台 Ubuntu 14.04 机器上的无人值守安全更新,因为上周我遇到了类似的问题,它打印
[Thu May 26 06:27:29.737707 2016] [mpm_prefork:notice] [pid 1487] AH00171: Graceful restart requested, doing restart
apache2: Syntax error on line 140 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/php5.load: Cannot load /usr/lib/apache2/modules/libphp5.so into server: /lib/x86_64-linux-gnu/libm.so.6: symbol __strtold_nan, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
这是某种竞争条件吗?为什么有时无法加载模块?
更新
错误中提到的行看起来像
LoadModule access_compat_module /usr/lib/apache2/modules/mod_access_compat.so
所以该行没有语法错误,我没有改变任何东西来让它再次运行,只是重新启动 apache。
答案1
托马斯,我很想知道您是否找到了问题的解决方案。这个错误今天早上影响了我。具有讽刺意味的是,每当 Apache 进行正常重新加载时,它都会被触发。但是运行 apache2 restart 重新启动服务器却没有问题。我遇到的正常重新加载是 apache 日志轮换脚本 (/etc/logrotate.d/apache2) 的后期处理的一部分。此处进行正常重新加载是为了释放旧日志文件,以便它们不再占用磁盘空间。我在工作中临时修改了它,使用重新启动而不是重新加载,从而避免了这个问题。
日志中的错误消息指出 mod_access_compat 模块是问题所在,这是一个核心模块,我真的不能没有它。因此,我开始研究和比较差异。这个问题只在我从 2.4.16 升级到 2.4.20(以及另一台服务器上的 2.4.23)后影响到我。看来 2.4.19 中有一个变化,表明所有模块都使用 ap_get_useragent_host 而不是旧的 ap_get_remote_host 函数来获取访问者的远程 IP。我决定下载最新的源代码(2.4.23)并将 mod_access_compat.c(第 279 行)中的此行改回旧版本中的内容:remotehost = ap_get_remote_host(r->connection, r->per_dir_config, REMOTE_DOUBLE_REV, &remotehost_is_ip);
重新编译 apache 后,我将新的 mod_access_compat.so 复制到我的模块文件夹中,替换已发布的那个。此后,我能够顺利地重新启动和重新加载,没有任何麻烦。虽然我还没有将此更新移到我的生产服务器中,但我会在几个小时后将其移到。
这显然不是一个长期的解决方案,但它解决了我的问题,直到 Apache 开发人员正确修复它。我正在运行 Ubuntu 14.04。
您的里程可能会有所不同,祝你好运!
更新 我整理了我的发现并向 Apache 开发人员提交了一份错误报告。他们建议服务器需要完全停止并启动,因为升级后某些组件仍在内存中。我再次测试,在生产服务器上,优雅的重新加载工作正常——无需更换模块。所以,显然这是实际升级过程中的一次性错误,因为它应该停止/启动而不是重新启动服务器。对于可能遇到这种情况的其他人;只需停止服务器并重新启动它。
这是我提交的错误报告(我希望它真的被标记为非错误):https://bz.apache.org/bugzilla/show_bug.cgi?id=59842