You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

排查Debian12下Apache+PHP-FPM的“Lock not acquired”错误关联文件

Debian 12下Apache+PHP-FPM的"Lock not acquired"错误调试问题

问题背景

在Debian 12系统中搭配Apache与PHP-FPM运行时,Apache日志出现以下错误:

AH01071: Got error 'PHP message: Lock not acquired

怀疑该错误与自定义的AppArmor配置文件相关,正尝试定位关联文件以修复问题(可能需调整AppArmor规则或其他相关设置)。

已执行的调试操作

  • 在PHP-FPM池配置中添加错误日志开启设置:
    php_admin_value[error_log] = /var/log/php-fpm/$pool.error.log
    php_admin_flag[log_errors] = on
    
    但日志文件仅显示相同的错误信息,未提供更多细节。
  • 尝试在/etc/php/8.2/fpm/php-fpm.conf中提高全局错误日志详细程度,仅在/var/log/php8.2-fpm.log中增加了无用的调试信息。
  • 当前php.ini中的错误报告设置:
    error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING
    

下一步调试方案

1. 聚焦AppArmor规则排查

  • 查看PHP-FPM对应的AppArmor配置状态:
    sudo aa-status
    
    找到php-fpm相关的profile(通常为usr.sbin.php-fpm8.2)。
  • 临时切换到complain模式测试:
    sudo aa-complain /etc/apparmor.d/usr.sbin.php-fpm8.2
    
    之后访问站点,若错误消失,可确认是AppArmor规则限制导致。
  • 查看AppArmor审计日志,定位被拒绝的操作:
    sudo grep php-fpm /var/log/audit/audit.log
    
    日志中会明确显示被阻止的文件路径或系统调用,据此调整AppArmor规则。

2. 优化PHP错误日志记录

  • 修改/etc/php/8.2/fpm/php.ini中的配置:
    error_reporting = E_ALL
    log_errors_max_len = 0
    display_errors = Off
    
  • 在PHP-FPM池配置中覆盖全局设置,确保生效:
    php_admin_value[error_reporting] = E_ALL
    php_admin_value[log_errors_max_len] = 0
    
  • 重启PHP-FPM服务:
    sudo systemctl restart php8.2-fpm
    
    再次触发错误,检查日志是否有更完整的错误堆栈或上下文信息。

3. 定位代码中的锁逻辑

  • 搜索项目代码中涉及锁操作的函数,比如flock()、sem_acquire()、各类Mutex实现等,确认锁对应的资源路径(如文件锁的路径、共享内存标识)。
  • 验证这些资源路径是否在AppArmor允许访问的范围内,同时检查路径的权限是否对PHP-FPM进程用户(通常为www-data)开放。

4. 检查系统级锁资源权限

  • 查看PHP-FPM相关的socket或临时锁目录权限:
    ls -l /run/php/
    
    确保www-data用户拥有读写权限。
  • 检查临时目录/tmp的权限:
    ls -ld /tmp/
    
    若代码使用/tmp存储锁文件,需确保www-data有访问权限,且AppArmor规则允许PHP进程访问该目录。

内容的提问来源于stack exchange,提问作者Thibault Richard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:45:10