在EC2的RHEL 7 Apache部署Flask应用时遇ImportError: No module named run
Let's break down the most likely causes and fixes for this ImportError—since you're using a Python 2.7 virtual environment with Apache on RHEL 7, the issue almost always boils down to path configuration, virtual environment activation, or permission issues specific to RHEL's setup.
1. 确保WSGI脚本正确加载虚拟环境
Python 2.7虚拟环境不会自动为Apache的WSGI进程激活,所以你需要在example.wsgi脚本开头显式加载activate_this.py文件。这能确保Apache使用虚拟环境的Python和安装的包,而不是系统默认的Python。
在example.wsgi开头添加这段代码(替换为你的虚拟环境实际路径):
# 加载虚拟环境 activate_this = '/home/ec2-user/your-virtualenv/bin/activate_this.py' execfile(activate_this, dict(__file__=activate_this))
注意:这里必须用绝对路径——Apache不会使用你的用户工作目录,相对路径会直接失效。
2. 确认sys.path包含你的项目根目录
你提到已经打印了sys.path,首先要检查包含run.py的项目目录是否在这个列表里。如果没有,在导入Flask应用前,在example.wsgi里手动添加:
import sys # 替换为你的项目文件夹绝对路径(run.py所在的目录) sys.path.insert(0, '/var/www/your-flask-project') # 现在导入你的应用 from run import app as application
用sys.path.insert(0, ...)能确保Apache优先检查你的项目目录,避免和系统级Python模块冲突。
3. 检查导入语句和文件命名细节
- 大小写敏感:RHEL的文件系统是大小写敏感的。如果你的文件名叫
Run.py但WSGI里写的是from run import...,就会报错。仔细核对文件名和导入语句的大小写是否完全一致。 - run.py中的应用导出:确保Flask应用实例定义在
run.py的顶层,而不是if __name__ == '__main__':代码块内。比如:
这样才能保证WSGI脚本导入时能访问到from flask import Flask app = Flask(__name__) # 你的路由定义... if __name__ == '__main__': app.run()app对象。
4. 验证Apache配置(myapp.conf)
你的Apache配置需要正确指向WSGI文件,并授予项目目录访问权限。以下是一个可用的配置示例:
<VirtualHost *:80> ServerName localhost WSGIDaemonProcess your-flask-app python-path=/var/www/your-flask-project:/home/ec2-user/your-virtualenv/lib/python2.7/site-packages WSGIProcessGroup your-flask-app WSGIScriptAlias / /var/www/your-flask-project/example.wsgi <Directory /var/www/your-flask-project> Require all granted </Directory> ErrorLog /var/log/httpd/flask-error.log CustomLog /var/log/httpd/flask-access.log combined </VirtualHost>
WSGIDaemonProcess中的python-path同时包含项目目录和虚拟环境的site-packages文件夹,强化了正确的模块查找路径。- 确保
WSGIScriptAlias用绝对路径直接指向你的example.wsgi文件。
5. 修复RHEL特有的SELinux和权限问题
RHEL默认启用SELinux,即使文件权限看起来正确,它也可能阻止Apache访问你的项目文件。
临时禁用SELinux测试
运行以下命令测试SELinux是否是问题根源:
sudo setenforce 0
如果禁用后应用正常工作,就需要为项目目录设置正确的SELinux上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/your-flask-project(/.*)?" sudo restorecon -Rv /var/www/your-flask-project
设置正确的文件权限
确保Apache用户(通常是apache或httpd)对项目文件有读取权限:
sudo chown -R apache:apache /var/www/your-flask-project sudo chmod -R 755 /var/www/your-flask-project
6. 重启Apache并验证
修改任何配置后,重启Apache使更改生效:
sudo systemctl restart httpd
然后用curl http://localhost/再次测试,同时查看错误日志排查新问题:
tail -f /var/log/httpd/flask-error.log
内容的提问来源于stack exchange,提问作者user8200889

