Apache DBD+SQLite3基础认证配置:数据库连接报错AH00629求助
这问题我之前帮人排查过好几次,核心点在于:你手动su - apache能访问数据库,但Apache进程的运行上下文和你交互式登录的shell环境不一样,哪怕给了shell权限,也得注意几个容易踩的坑,按下面的步骤逐一排查:
检查完整路径的权限链
别只盯着/home/git/db.sqlite文件的权限,上级目录的访问权限同样关键。Apache需要能进入/home/git目录才能读取里面的文件,所以每个父目录都得给apache用户执行权限(x)。
用这个命令查看全路径的权限详情:namei -l /home/git/db.sqlite确保每一层目录(比如
/home、/home/git)对apache用户都有x权限,db.sqlite文件有r权限。排查SELinux的限制
这是最容易被忽略的元凶!默认SELinux会阻止Apache访问/home目录下的文件,哪怕文件权限完全正确。
先临时关闭SELinux测试:setenforce 0然后重启Apache:
systemctl restart httpd,如果此时能正常连接数据库,就说明是SELinux的问题。接下来需要添加正确的SELinux策略:# 给单个数据库文件添加上下文 semanage fcontext -a -t httpd_sys_content_t /home/git/db.sqlite restorecon -v /home/git/db.sqlite # 如果需要整个目录的访问权限,也可以给目录添加上下文 semanage fcontext -a -t httpd_sys_content_t /home/git/ restorecon -v /home/git/最后记得重新开启SELinux:
setenforce 1。确认Apache配置中的路径正确性
检查你的DBD配置段,确保数据库路径是绝对路径,比如:DBDriver sqlite3 DBDParams "dbname=/home/git/db.sqlite"如果写的是相对路径(比如
db.sqlite),Apache会从它的默认工作目录(通常是/var/www/html)去找,自然找不到文件。验证Apache进程的运行用户
有时候Apache可能不是用apache用户运行的,比如某些发行版用httpd用户。用这个命令查看:ps aux | grep httpd看进程列表里的用户列,如果是其他用户,就得把数据库文件和目录的权限调整给这个用户。
模拟Apache进程的访问测试
用runuser命令模拟Apache用户的环境访问数据库文件,比su - apache更贴近实际进程的上下文:runuser -u apache -- ls -l /home/git/db.sqlite runuser -u apache -- sqlite3 /home/git/db.sqlite ".tables"如果这两个命令报错,说明还是权限或SELinux的问题;如果能正常执行,再检查Apache的认证配置是否正确(比如
AuthDBDUserPWQuery语句有没有语法错误)。
内容的提问来源于stack exchange,提问作者Flavius

