Ubuntu16.04升级Apache到2.4.46报AH00141随机数初始化失败怎么办
核心报错根因
你碰到的Could not initialize random number generator报错,和/dev/random、/dev/urandom设备是否存在没有关系,根源是升级后的Apache 2.4.46版本,底层的APR运行库默认优先调用Linux内核的getrandom()系统调用完成随机数初始化,但当前使用的4.4.0-042stab141.2是OpenVZ虚拟化架构的定制内核,该内核版本未实现对应版本的getrandom()系统调用接口,直接触发了"Function not implemented"的功能未实现报错。叠加当前系统libc6版本为2.23,本身也没有对该系统调用的适配逻辑,因此升级后服务无法正常启动。
分步修复方案
- 第一步:先回滚到可用版本,快速恢复线上服务
执行如下命令回滚所有Apache相关组件到升级前的2.4.18-2ubuntu3.17版本:apt-get install --only-upgrade apache2=2.4.18-2ubuntu3.17 apache2-bin=2.4.18-2ubuntu3.17 apache2-data=2.4.18-2ubuntu3.17 apache2-utils=2.4.18-2ubuntu3.17
执行service apache2 start确认服务恢复正常,提前校验原有PHP-FPM、FastCGI、MPM event模式的配置是否生效,排除升级过程中产生的配置偏移。 - 第二步:添加兼容配置,绕过系统调用兼容问题
打开Apache环境变量配置文件/etc/apache2/envvars,在文件末尾追加一行配置:export APR_USE_RANDOM_DEVICE=/dev/urandom
该配置会强制Apache底层APR库跳过优先调用getrandom()系统调用的逻辑,退回到传统的直接读取/dev/urandom设备文件获取熵值的初始化流程,从根本上绕开定制OpenVZ内核不支持系统调用的问题。 - 第三步:重新执行升级流程
先执行apt update刷新软件源索引,再运行apt-get --only-upgrade install apache2拉取目标版本2.4.46的Apache安装包完成升级,最后执行service apache2 restart重启服务,通过systemctl status apache2.service确认服务处于正常运行状态。 - 兜底校验
升级完成后逐一核对核心配置:确认MPM event运行模式没有被切换为prefork/worker,PHP7.3、PHP7.4对应的PHP-FPM的FastCGI代理映射规则没有被升级覆盖,必要时和升级前的配置文件做diff比对。
异常兜底提示:如果配置完上述环境变量后仍然报相同的随机数初始化错误,可以在
/etc/apache2/envvars中再追加一行export APR_RANDOM_POLL_MS=1000,强制APR库通过轮询/dev/urandom设备的方式获取足够熵值,跳过非阻塞模式的系统调用检测。
内容的提问来源于stack exchange,提问作者Marti
相关产品推荐
相关产品推荐

