排查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配置状态:
找到php-fpm相关的profile(通常为sudo aa-statususr.sbin.php-fpm8.2)。 - 临时切换到complain模式测试:
之后访问站点,若错误消失,可确认是AppArmor规则限制导致。sudo aa-complain /etc/apparmor.d/usr.sbin.php-fpm8.2 - 查看AppArmor审计日志,定位被拒绝的操作:
日志中会明确显示被阻止的文件路径或系统调用,据此调整AppArmor规则。sudo grep php-fpm /var/log/audit/audit.log
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或临时锁目录权限:
确保www-data用户拥有读写权限。ls -l /run/php/ - 检查临时目录
/tmp的权限:
若代码使用ls -ld /tmp//tmp存储锁文件,需确保www-data有访问权限,且AppArmor规则允许PHP进程访问该目录。
内容的提问来源于stack exchange,提问作者Thibault Richard
相关产品推荐
相关产品推荐

