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

如何解决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可读上下文):

  1. 对比两个文件的SELinux上下文:
ls -Z /usr/local/settings/sample.json /srv/http/sample.json
  1. 若目标文件上下文不是httpd_sys_content_t,修改临时上下文:
sudo chcon -t httpd_sys_content_t /usr/local/settings/sample.json
  1. 要永久生效(重启后不丢失),执行:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:45:41