AWS上Apache部署Flask应用遇Errno13权限拒绝问题求助
看起来你遇到的核心问题是Apache运行Flask应用时的权限不匹配,以及相对路径导致的文件定位错误——虽然用了chmod 777 -R,但这不是最优(甚至不安全)的解决方案,而且没触碰到根本问题。下面一步步来修复:
1. 用权限归属替代777(安全且有效的方案)
chmod 777虽然开放了所有权限,但Apache是用特定用户运行的(Ubuntu/Debian系通常是www-data),如果目录/文件的所有者不是这个用户,系统还是会限制访问。
先确认Apache的运行用户:
ps aux | grep apache2输出第一列就是运行用户,大概率是
www-data。把你的应用目录的所有者改成Apache用户:
sudo chown -R www-data:www-data /path/to/your/flask/app这样Apache用户就拥有了目录和文件的读写权限,比
777安全得多,也符合Linux权限的最佳实践。
2. 替换相对路径为绝对路径
你的代码里用了ET.parse('export_po_list.xml')这种相对路径,但Apache运行Flask时的当前工作目录(os.getcwd())不一定是你的应用目录(比如可能是/var/www/html或者Apache的默认目录),导致找不到你放在应用目录里的文件。
修改代码,用绝对路径定位文件:
import os import xml.etree.ElementTree as ET def po_data(a,b,c): # 获取当前脚本所在的绝对目录 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 拼接XML文件的绝对路径 xml_file_path = os.path.join(BASE_DIR, 'export_po_list.xml') # ... 其他代码保持不变 ... # 用绝对路径读取文件 tree = ET.parse(xml_file_path) root = tree.getroot() # ... 后续解析代码保持不变 ...
这样不管Apache的工作目录是什么,都能精准定位到你的XML文件。
3. 额外检查:父目录的执行权限
如果你的应用目录的父目录没有给www-data用户执行权限,即使应用目录权限正确,Apache也无法进入应用目录。可以给父目录添加执行权限:
sudo chmod +x /path/to/parent/of/your/app
为什么chmod 777没用?
Linux的权限系统不仅看文件本身,还看父目录的权限;而且Apache的运行用户可能没有被赋予目录的所有权,即使文件开放了777,用户没有进入目录的权限,或者系统的安全策略(比如AWS EC2默认开启的SELinux)限制了Apache访问非标准目录。如果上面的步骤还没解决,可以检查SELinux状态:
sestatus
如果是Enforcing状态,可以临时关闭测试:
sudo setenforce 0
如果问题解决了,再配置SELinux允许Apache访问你的应用目录。
内容的提问来源于stack exchange,提问作者Subhaac

