首页 > 解决方案 > 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 等)

标签: python-3.xapacheexceptionmod-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 的必要条件。不知道为什么它在没有它的情况下会遇到困难,但是......这解决了它。


推荐阅读