RHEL 8下Apache部署Flask应用时WSGI无法找到本地模块怎么办?
解决Apache WSGI无法识别Flask本地模块的问题
针对你遇到的No module named 'utility'错误,核心原因是WSGI运行时的Python模块搜索路径和Flask开发服务器不一致,以下是几种可行的解决方法:
方法1:在Flask应用中手动添加路径
在__init__.py的最开头添加以下代码,把项目根目录加入Python的搜索路径,用动态方式避免硬编码:
import sys import os # 获取当前文件所在目录的绝对路径 app_root = os.path.dirname(os.path.abspath(__file__)) # 将项目根目录加入sys.path sys.path.insert(0, app_root)
方法2:配置WSGI文件的模块搜索路径
创建myapp.wsgi文件放在/var/www/FLASKAPPS/目录下,内容如下:
import sys # 把项目根目录插入到sys.path最前面 sys.path.insert(0, '/var/www/FLASKAPPS/myapp') # 导入Flask应用 from myapp import app as application
然后在Apache配置文件(比如/etc/httpd/conf.d/myapp.conf)中指定这个WSGI文件:
<VirtualHost *:80> ServerName your-domain.com WSGIDaemonProcess myapp python-home=/path/to/your/venv(如果使用虚拟环境) WSGIScriptAlias / /var/www/FLASKAPPS/myapp.wsgi <Directory /var/www/FLASKAPPS/myapp> WSGIProcessGroup myapp WSGIApplicationGroup %{GLOBAL} Require all granted </Directory> </VirtualHost>
方法3:确保虚拟环境配置正确(若使用)
如果用了Python虚拟环境,必须在WSGI文件中激活虚拟环境,否则WSGI会使用系统默认Python环境,导致模块路径错误。在myapp.wsgi开头添加:
activate_this = '/path/to/your/venv/bin/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this))
方法4:检查文件权限
Apache运行用户(通常为apache或httpd)需要有读取/var/www/FLASKAPPS/myapp及子目录文件的权限,执行以下命令修复:
chmod -R 755 /var/www/FLASKAPPS/myapp chown -R apache:apache /var/www/FLASKAPPS/myapp
完成配置后重启Apache服务:
systemctl restart httpd
内容的提问来源于stack exchange,提问作者Wige
相关产品推荐
相关产品推荐

