许多 Apache 命令(例如apache2 -v
和)apachectl graceful
都失败并显示以下消息:
(38)Function not implemented: AH00141: Could not initialize random number generator
在线搜索表明这可能是由 ; 中的中文字符引起的,除了和 斜线,PATH
我没有看到任何字符。其他人则表示我的系统中缺少和; 。a-z
/dev/random
/dev/urandom
如果我运行cat /proc/sys/kernel/random/entropy_avail
,我得到的数字大约在 130 到 250 之间。这太低了吗?这可能与此有关吗?
还有其他可能性吗?
Ubuntu 16.04.7 LTS
Apache 2.4.46
答案1
根据这个 Debian 错误报告,看起来 Apache 希望有一个内核函数存在,但每个内核并不一定都有这个函数:
问题是,如果库在构建时配置为 USE_GETRANDOM,则它假定 getrandom() 调用可用,如果失败,则会出现致命错误。在我的系统上,我没有 getrandom(),因为我运行的是旧内核,但其他人可以(更合理地)在最近的定制内核上禁用该选项。
最好的解决方案可能是更新到 Ubuntu 的最新版本。Ubuntu 16.04 已有五年或十个发布周期,将在不到一个月的时间内失去支持。或者上述 PPA 的维护者将其:
有了 Ubuntu 14.04 Trusty EOL 的经验,我再怎么强调也不为过,你应该提前计划,现在就升级你的服务器。昨天太晚了。
答案2
我要感谢@Liam Morland 的上述回答,这让我在 Ubuntu 16.04 上进行了一次不明智的 apt-get 更新后纠正了这个问题。对于那些可能觉得它有用的人,以下是我所做的:
检查 apt-get 的日志来查看上一轮升级了哪些软件,以及哪些软件需要降级。
sudo tail /var/log/apt/history.log
搜索那里的数据以确定我安装了哪些 libapr1 和 libutil1。我确定对我来说是:
- libapr1
- libaprutil1
- libaprutil1-dbd-sqlite3
- libaprutil1-ldap
您的系统可能会有所不同!
安装了 aptitude (
sudo apt-get install aptitude
)。它非常有用,并指导我如何修复依赖项,而当我尝试降级时,apt-get 却给了我乱码。使用命令
sudo aptitude versions libapr1
sudo aptitude versions libaprutil1
我注意到了 aptitude 可以提供的确切版本号。在我的例子中,libaprutil1 的版本不能只是 1.5.4,而必须是 1.5.4-1build1。使用 = 符号指定版本,我运行了
sudo aptitude install libapr1=1.5.2-3
。然后,Aptitude 为我提供了其他软件的列表,如果我继续操作,这些软件将被降级或停止工作。我退出安装过程,并利用错误,编写了一个命令来降级 aptitude 识别的所有软件。这是我的:
sudo aptitude install libapr1=1.5.2-3 libaprutil1=1.5.4-1build1 libaprutil1-ldap=1.5.4-1build1 libaprutil1-dbd-sqlite3=1.5.4-1build1 apache2=2.4.18-2ubuntu3.17 apache2-bin=2.4.18-2ubuntu3.17 apache2-data=2.4.18-2ubuntu3.17
这是基于我的特定安装,因此请在运行此命令之前检查您拥有的内容。
- 我重新启动了 Apache,一切又恢复正常运行!
我希望这对路上的其他人有所帮助。
答案3
我通过libapr1
从 1.7.0 降级到 1.5.2 解决了这个问题。为了使它正常工作,我不得不从 1.6.1 降级libaprutil1
(和两次libaprutil1-*
)到 1.5.4。我还必须坚持使用 Apache 2.4.18。
答案4
您的机器是否在 Solus / openvz 中运行?那么 openvz 的内核太旧了... 这里的机器在 Solus / openvz 下也有同样的问题(内核 2.6.xx)