如何解决Apache+mod_wsgi+Flask环境下的[Errno 13]权限拒绝问题?
解决Apache + mod_wsgi读取/usr/local/settings/sample.json权限拒绝问题
从报错和测试情况来看,核心问题是Apache运行的apache用户没有读取目标文件的完整权限链(Linux读取文件需要路径上所有目录的执行权限+文件本身的读权限),按以下步骤排查:
1. 检查目录权限链
要读取/usr/local/settings/sample.json,apache用户需要对路径上的每个目录(/usr、/usr/local、/usr/local/settings)拥有执行权限(x)。执行命令查看权限:
ls -ld /usr /usr/local /usr/local/settings
- 确保每个目录的权限对
apache用户(或其所属组、其他用户)包含x权限。比如若apache不在目录所属组,需保证其他用户位有x(权限字符串最后一位为x)。 - 若缺少权限,用
chmod补充:例如给/usr/local/settings添加其他用户执行权限:sudo chmod o+x /usr/local/settings
2. 确认文件及目录的读权限
即使文件权限和/srv/http下的文件相同,也需仔细核对:
ls -l /usr/local/settings/sample.json /srv/http/sample.json ls -l /usr/local/settings/ /srv/http/
- 确保
/usr/local/settings/sample.json对apache用户有读权限(r),比如权限设为644(其他用户可读),或者将文件所属组改为apache并给组添加读权限。 - 若缺少权限,执行:
sudo chmod o+r /usr/local/settings/sample.json,或者调整所属组:sudo chgrp apache /usr/local/settings/sample.json && sudo chmod g+r /usr/local/settings/sample.json
3. 验证Apache实际运行用户
虽然httpd.conf中配置了WSGIDaemonProcess wsgi user=apache,但需确认httpd进程实际运行的用户:
ps aux | grep httpd
- 查看输出第一列的用户名,确保是
apache。若不是,检查httpd主配置或虚拟主机配置是否覆盖了用户设置。
4. 强制检查SELinux上下文(即使无警报)
/usr/local目录下的文件默认SELinux上下文可能不允许httpd读取,而/srv/http下的文件默认是httpd_sys_content_t(httpd可读上下文):
- 对比两个文件的SELinux上下文:
ls -Z /usr/local/settings/sample.json /srv/http/sample.json
- 若目标文件上下文不是
httpd_sys_content_t,修改临时上下文:
sudo chcon -t httpd_sys_content_t /usr/local/settings/sample.json
- 要永久生效(重启后不丢失),执行:
sudo semanage fcontext -a -t httpd_sys_content_t "/usr/local/settings(/.*)?" sudo restorecon -Rv /usr/local/settings
5. 模拟Apache用户测试读取
最后,用apache用户直接读取文件,验证是否为权限问题:
sudo -u apache cat /usr/local/settings/sample.json
- 若此步骤报错,说明是文件/目录权限或SELinux问题,与Apache/mod_wsgi配置无关;若成功,检查Flask代码中是否有路径拼写错误,或文件被其他进程锁定。
内容的提问来源于stack exchange,提问作者ThrowDevNull
相关产品推荐
相关产品推荐

