【问题标题】:Python3, Apache, mod-wsgi 'FileNotFoundError' is not definedPython3、Apache、mod-wsgi 'FileNotFoundError' 未定义
【发布时间】:2021-11-10 00:01:32
【问题描述】:

我使用 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.x apache exception mod-wsgi


    【解决方案1】:

    我缺少一个参数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 2021-05-20
      • 2012-02-16
      • 1970-01-01
      • 2014-09-09
      • 2011-09-15
      • 1970-01-01
      • 2015-10-21
      相关资源
      最近更新 更多