Python3, Apache, mod-wsgi ‘Файлообменник’ не определен

#python-3.x #apache #exception #mod-wsgi

Вопрос:

Я установил mod-wsgi из исходного кода, используя Python3 (Apache 2.4.46 на виртуальной машине Amazon Linux 2).

Каждый раз, когда я перезагружаю свой демон 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()
 

Все это вызывает приложение flask (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.версия отображается как 3.7, и я могу запускать конкретные вызовы python3 в своем проекте.

Я проверил, как модуль wsgi загружается в Apache conf (/etc/httpd/conf.modules.d/wsgi.conf):
LoadModule wsgi_module modules/mod_wsgi.so

Я не вижу ошибки в других проектах, не связанных с wsgi, запущенных на том же сервере Apache. Я понятия не имею, как исправить ошибку. Это не мешает мне запускать свой проект, но я хотел бы точно знать, откуда взялась ошибка и почему.

Есть ли способ получить журналы отладки mod-wsgi? Это то, что мне нужно сделать в моем проекте? (колба, .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. Не знаю, почему у него как-то возникли трудности без этого, но… Это все исправляет.