Запустите mod_wsgi с virtualenv или Python с версией, отличной от используемой по умолчанию

Я пытаюсь заставить мое приложение Flask работать на сервере CentOS. В основном проблема в том, что у меня установлен Python 2.6 в /usr/bin который является системным по умолчанию и Python 3.4 установлен в /usr/local/bin, Я хотел бы использовать Python 3.4 virtualenv или хотя бы интерпретатор Python 3.4 для mod_wsgi для запуска моего приложения.

Я создал virtualenv в ~/virtualenvs/flask,

У меня есть этот скрипт WSGI:

import os
import sys
from logging import Formatter, FileHandler

APP_HOME = r"/home/fenikso/Album"


activate_this = os.path.join("/home/fenikso/virtualenvs/flask/bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))

sys.path.insert(0, APP_HOME)
os.chdir(APP_HOME)

from app import app

handler = FileHandler("app.log")
handler.setFormatter(Formatter("[%(asctime)s | %(levelname)s] %(message)s"))
app.logger.addHandler(handler)
application = app

И следующий конфиг в Apache:

<VirtualHost *:80>
        ServerName album2.site.cz
        Alias /static "/home/fenikso/Album/static"
        Alias /photos "/home/fenikso/Album/photos"
        Alias /thumbs "/home/fenikso/Album/thumbs"
        WSGIScriptAlias / "/home/fenikso/Album/wsgi.py"
        <Directory "/home/fenikso/Album">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/static">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/photos">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/thumbs">
            AllowOverride None
            Allow from all
        </Directory>
</VirtualHost>

Однако при попытке запустить приложение я получаю сообщение об ошибке:

Apache/2.2.15 (Unix) DAV/2 mod_wsgi/3.2 Python/2.6.6 mod_fcgid/2.3.7 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.1e-fips SVN/1.6.11 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations
mod_wsgi (pid=14627): Target WSGI script '/home/fenikso/Album/wsgi.py' cannot be loaded as Python module.
mod_wsgi (pid=14627): Exception occurred processing WSGI script '/home/fenikso/Album/wsgi.py'.
Traceback (most recent call last):
   File "/home/fenikso/Album/wsgi.py", line 15, in <module>
     from app import app
   File "/home/fenikso/Album/app.py", line 1, in <module>
     from flask import Flask
 ImportError: No module named flask

Я заметил, что либо Python 2.6 запускается, и мой virtualenv не активирован. Каков был бы правильный способ заставить это работать и все еще иметь Python 2.6 в качестве системного по умолчанию?

4 ответа

Решение

Вы должны добавить следующую строку в ваш apache.conf, чтобы указать правильный исполняемый файл и путь к virtualenv.

WSGIPythonHome /usr/local/bin
WSGIPythonPath /home/fenikso/virtualenv/lib/python3.4/site-packages

Все параметры этих двух команд вы найдете в документации к mod_wsgi

Помните, что у вас должна быть версия mod_wsgi, совместимая с исполняемым файлом python. В вашем случае вам, вероятно, придется установить mod_wsgi3.4 и настроить apache для его использования вместо стандартного модуля mod_wsgi.

Весь файл конфигурации должен быть:

WSGIPythonHome "/usr/local/bin"
WSGIPythonPath "/home/fenikso/virtualenv/lib/python3.4/site-packages"

<VirtualHost *:80>
        ServerName album2.site.cz
        Alias /static "/home/fenikso/Album/static"
        Alias /photos "/home/fenikso/Album/photos"
        Alias /thumbs "/home/fenikso/Album/thumbs"
        WSGIScriptAlias / "/home/fenikso/Album/wsgi.py"
        <Directory "/home/fenikso/Album">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/static">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/photos">
            AllowOverride None
            Allow from all
        </Directory>
        <Directory "/home/fenikso/Album/thumbs">
            AllowOverride None
            Allow from all
        </Directory>
</VirtualHost>

Посмотрите на директивы WSGIPythonHome и WSGIPythonPath. Также возможно, что у вас установлен python2.6 mod_wsgi, mod_wsgi должен быть скомпилирован для предполагаемой версии python и не поддерживает несколько версий python. Поэтому убедитесь, что ваш mod_wsgi совместим с py3.4 и установите директивы выше.

В качестве альтернативы, вы можете запустить приложение фляги с сервером Python, таким как gunicorn и proxypass от apache до gunicorn.

Другой вариант, который, как я считаю, намного чище, логичнее и гибче, — просто указать интерпретатор python из вашего venv в начале вашего файла wsgi. Таким образом, его легко изменить (без возни с файлами конфигурации системы) и открывается возможность запуска нескольких приложений в разных средах Python, например:

      #!/path/to/your/venv/bin/python

Если версия Python, установленная в системе, отличается от версии Python, используемой в виртуальной среде, тогда mod_wsgi не будет работать, поскольку mod_wsgi всегда компилируется для конкретной версии Python.

В этой ситуации вам необходимо установить mod_wsgi в виртуальной среде

      pip install mod_wsgi-standalone

Затем такой модуль должен быть загружен вместо стандартного, установленного в системе.

Например, для Ubuntu измените путь к модулю в/etc/apache2/mods-available/wsgi.load

      LoadModule wsgi_module /home/user/etc/.venv/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so

Затем, чтобы избежать ошибки « нет такого файла или каталога: mod_wsgi (pid=XXXX): не удалось связать сокет домена unix '/usr/local/opt/httpd/logs/wsgi.xxxxx.11.1.sock », должно быть добавлено в файл httpd.conf:

      WSGISocketPrefix /var/run/wsgi

После перезапуска апача все должно работать

Другие вопросы по тегам