python-3.x - Python3、Apache、mod-wsgi 'FileNotFoundError' 未定义
问题描述
我使用 Python3(Amazon Linux 2 VM 上的 Apache 2.4.46)从源代码安装了 mod-wsgi。
每次我重新加载我的 wsgi 守护程序时,我的 Apache 错误日志中都会出现以下错误:
Exception ignored in: <generator object path at 0x7f128e93fdd0>
Traceback (most recent call last):
File "/usr/lib64/python3.7/importlib/resources.py", line 190, in path
NameError: name 'FileNotFoundError' is not defined
我认为当守护进程关闭时会发生这种情况,因为当我关闭 Apache 时我也会看到错误。
我在 python3 的虚拟环境中运行我的项目。这是我的 Apache 配置:
<VirtualHost *:443>
<Directory /var/www/html/project/>
Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
Require all granted
</Directory>
ErrorLog /home/ec2-user/apache_project_errors.log
ServerName project.projtds.net
DocumentRoot /var/www/html/project/
WSGIDaemonProcess project threads=1 processes=2 python-home=/var/www/html/project/venv home=/var/www/html/project
WSGIScriptAlias / /var/www/html/project/project.wsgi process-group=project
WSGIScriptReloading On
</VirtualHost>
我的 .wsgi 相当简单:
from project import create_app
application = create_app()
所有这些都调用了一个烧瓶应用程序(project.py):
from flask import Flask
def create_app():
app = Flask(__name__, instance_relative_config=False)
@app.route("/")
def home():
import sys
string = f"Python version {sys.version} Version info {sys.version_info}"
return string
return app
现在,我只检查 python 版本,因为错误是 python2 解释器遍历 python3 代码的典型错误......但是 sys.version 确实显示为 3.7,我可以在我的项目中运行 python3 特定调用。
我检查了 wsgi 模块是如何在 Apache conf (/etc/httpd/conf.modules.d/wsgi.conf) 中加载的:
LoadModule wsgi_module modules/mod_wsgi.so
我没有看到在同一 Apache 服务器下运行的其他非 wsgi 项目中的错误。我不知道如何解决这个错误。它不会阻止我运行我的项目,但我很想知道错误的确切来源以及原因。
有没有办法获取 mod-wsgi 调试日志?这是我需要在我的项目中做的事情吗?(烧瓶、.wsgi 等)
解决方案
我缺少一个参数:
<Directory /var/www/html/project/>
Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
Require all granted
</Directory>
本来应该:
<Directory /var/www/html/jiraiop/>
Options +ExecCGI +FollowSymlinks -SymLinksIfOwnerMatch
Require all granted
WSGIApplicationGroup %{GLOBAL}
</Directory>
https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIApplicationGroup.html
全局应用程序组中的任何 WSGI 应用程序将始终在 Python 初始化时创建的第一个解释器的上下文中执行,即处理请求的进程。
我认为这是确保解释器是 python3 的必要条件。不知道为什么它在没有它的情况下会遇到困难,但是......这解决了它。
推荐阅读
- swift - Swift / Firestore - 如何获取包含嵌套地图对象的单个文档并将它们发送到结构?
- jenkins - Jenkins - 多分支管道无法解释的故障
- php - 带括号的 XDebug - 非活动调试按钮
- java - 如何截取 GridLayout 的屏幕截图然后分享
- python - argparse设置,解析后设置值
- javascript - 扩展 Toast UI Image Editor 的预建函数 addShape
- database - 无法在 MongoDB 查询中找到匹配项
- javascript - 如何在无状态组件中合并值?
- pine-script - 解释 tradingview 松脚本自引用变量值
- python-3.x - 使用 Twitter API 发送直接消息不起作用