apache httpd 无法启动或启动报错的分析方法

2025-02-10 18:49:00
丁国栋
原创 42
摘要:本文记录一次Apache httpd 无法启动的排错过程。

背景:我们公司设计开发了一套LAMP的一键安装包程序,通过解压发布包和直接执行启动脚本,能运行在绝大多数Linux发行版。

故障发现过程:公司同事用从公司官网下载的一键安装包在Debian 11上尝试运行,但发现无法启动,apache2的运行状态始终是stopped,正常应该是running。

故障现象:apache2进程无法通过脚本启动,通过直接运行httpd可执行程序也不报错,没有错误日志,没有对应的系统日志。同事尝试了一些解决办法,例如尝试关闭防火墙,检查apache2配置文件是否正确,查看系统日志等,但没有找到无法启动的原因。

故障排查和分析

虽然同事说他已经采取了一些操作和排查方法包括但不限于以下措施,但我还是按照我自己的排查思路检查了一下。

  1. 查看系统版本和内核版本
  2. 检查apache2错误日志,通过命令 httpd -t 检查apache2配置文件是否有问题,通过 ldd 命令检查apache2可执行程序 httpd 的库是否存在,检查系统日志(syslog)是否包含apache2、httpd等关键词的报错;
  3. 检查系统防火墙、apparmor是否有拦截,检查系统审计日志 auth.log 

以上检查之后确实没有发现任何问题。既然环境没有问题,那就要分析httpd的手动启动过程和详细日志了。

  1. 先确认干净的Debian 11运行一键安装包有没有问题,发现没有问题,可以正常运行;
  2. 核对同事使用的一键安装包的md5sum没有问题,替换一键安装包(重新解压再执行)发现没有问题;
  3. 通过 httpd -k start 执行,执行结果为0,没有错误;
  4. 尝试增加 httpd 执行的日志级别(logLevel)到最大(最大是debug),httpd -e debug -E error.log,没有发现问题;
  5. 尝试使用httpd的debug模式运行,httpd -X -e debug -E error.log 发现提示 apc (php 的 apcu 配置参数)内存过大,检查系统内存发现系统是512M的系统,而 apc.shm_size 默认是 1024M,修改 apc.shm_size 配置为一个较小的值,比如24M,修改apc参数或者禁用 apache2 php 模块后发现问题解决;

附 httpd 几个参数的用途


  -e level          : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -X                 : debug mode (only one worker, do not detach)


启示

  1. 开发应用程序需要确定和检查系统的最低配置需求,如果需求不满足,在执行时给出友好提示信息;
  2. 在排查问题的过程中,需要考虑内存大小对系统的影响,这个在排查过程中没有在一开始就查看,浪费了一些时间,如果早点知道系统的内存较小,或许也可以想到或者发现问题,(这个错误在较大内存的主机或者Docker容器内都无法复现,Docekr环境下也比较难模拟);
  3. 鼓励同事一起完成问题攻坚,要相信办法总是有的,问题总有解决的办法,一定有什么原因导致问题的发生,事出必有因,小概率不可能等;

附 Debian 11 运行一键安装包所需的基本配置:

docker run --rm -it debian:11 bash
sed -i.bak -r 's/(deb|security).debian.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list  && apt update -y
apt install iproute2 curl procps -y


注:iproute2 提供 ss,procps 提供 pgrep, curl用于获取一键安装包。

--

发表评论
博客分类