我当前的 httpd 部署设置包括生成新的配置文件、重新链接配置目录,然后重新加载 apache 服务。此过程对我的大多数主机都运行良好,但是在我的代理主机上,httpd 服务在发出重新加载后会退出。
例子:
/config/aaaa/*.conf
/config/bbbb/*.conf
/config/active -> /config/aaaa
在我的主httpd配置文件文件,
require /config/active/*.conf
部署过程将删除该链接,并重新链接一个新的配置目录。
发出后
systemctl reload httpd
错误
在进程终止之前,我的日志中出现了以下错误。
(28)设备上没有剩余空间:AH02611:创建:apr_shm_create(/etc/httpd/run/slotmem-shm-p975c3056_scanner_2.shm)失败
调试
我有足够的可用磁盘空间:
[root@proxy3 log]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl_template-root 3.8G 3.4G 363M 91% /
tmpfs 989M 102M 888M 11% /run
//10.3.36.10/config3 3.8G 2.6G 1.3G 68% /config
当服务器运行时,该目录只有6M。
[root@proxy3 ~]# du -h /etc/httpd/run/
0 /etc/httpd/run/htcacheclean
6.0M /etc/httpd/run/
包含约 1500 个文件
[root@proxy3 ~]# du -h /etc/httpd/run/* | wc -l
1521
可用内存(应清除缓存)
[root@proxy3 httpd]# free
total used free shared buff/cache available
Mem: 2025016 408128 113756 111216 1503132 1352584
我的信号量和 ulimit 似乎很好
[root@proxy3 httpd]# sysctl -a | grep sem
kernel.sem = 32000 1024000000 500 32000
[root@proxy3 httpd]# ipcs -l
------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398509481980
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 32000
max semaphores per array = 32000
max semaphores system wide = 1024000000
max ops per semop call = 500
semaphore max value = 32767
[root@proxy3 httpd]# ulimit
unlimited
版本信息
[root@proxy3 log]# httpd -v
Server version: Apache/2.4.37 (centos)
Server built: May 20 2021 04:33:06
[root@proxy3 log]# uname -r
4.18.0-305.19.1.el8_4.x86_64
我还能做什么来调试/纠正此故障模式?我目前的解决方法是在服务退出后重新启动服务,但这只是一个权宜之计。
答案1
从错误信息中检查目录的可用空间和大小:
df -h /etc/httpd/run/
du -h /etc/httpd/run/*
Red Hat httpd 软件包有一个符号链接 /etc/httpd/run/ -> /run/httpd。将 httpd DefaultRuntimeDir 存储放在系统 tmpfs 中,而不改变其相对于 ServerRoot 的约定。请注意,这意味着您应该注意 /run。
什么是日志代码 02611反正?模块 mod_slotmem_shm它提供了一个通用的共享内存 API,因此请检查所有已加载的模块,看它们是否使用它在工作器之间共享状态。根据观察和容量规划,可以大致确定大小可以达到多少。
关于如何缓解此问题,假设 tmpfs 已满,则为主机分配更多内存可以为其提供更多空间。或者,您可以调整 MPM 以减少工作程序数量,或者调整配置以减少共享状态。最后,考虑将 DefaultRuntimeDir 移动到具有足够空间的某个临时目录。
文件支持的共享内存映射不是您使用 ipcs 看到的 System V shm。APR 是可移植的,并提供了很多选项,但我认为在这个操作系统上是基于文件和 mmap 的。
说到空间,363M 可用空间(91% 使用)并不是很多,即使是在小型主机上也是如此。日志文件和包更新事务等通常需要更多空间。
答案2
您的 / 文件系统上只有 350Mio 可用。您确定足够吗?在所有情况下,消耗超过 90% 的磁盘空间应该是一个关键事实 ;)