TL; DR , мне нужно знать, как "скомпилировать" файл WSGI таким образом, чтобы он использовал интерпретатор Python, отличный от того, который я изначально установил mod_wsgi.
Это мое первое Flask приложение / веб-сайт, так что, надеюсь, вы можете простить немного невежества. Я постараюсь дать вам соответствующую информацию.
У меня есть приложение Flask, работающее на сервере Ubuntu через Nginx / Apache (обратная настройка прокси). Моя структура папок выглядит следующим образом:
|----MyApp
|------MyApp.wsgi
|------MyApp
|--------__init__.py
|--------templates
|--------static
|--------requirements.txt
|--------venv
Я получаю странные исключения из моего приложения и обнаружил, что мое приложение Flask работает с неверной версией интерпретатора Python, таким образом, часть кода не работает, как ожидалось. У меня установлен pyenv, и Python 3.8.1 установлен как глобальный, но когда приложение запускается через Apache, оно использует Python 2.7.17 (версия, которая поставляется с Ubuntu 18.04). Я выяснил хотя бы часть проблемы. Я следовал этому уроку: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps
В какой-то момент у вас есть учебник по sudo pip install Flask
, который, кажется, устанавливает Flask «глобально» (т. Е. Вне вену, который, кажется, победить цель). Не уверен, что я использую правильную терминологию. Итак, я делал:
python3 -m venv venv
source venv/bin/activate
sudo pip install Flask
Затем, когда я запускал свое приложение, либо через Apache, либо даже просто из окна терминала, я печатал в файл .txt sys.version
Таким образом, я мог видеть интерпретатор Python, который он использовал, и вуаля, он использует 2.7.17, а не 3.8.1. Таким образом, методом проб и ошибок я узнал, что sudo pip install Flask
не то, что я хотел. pip install Flask
(при запуске с активированным venv) дает желаемый результат при запуске приложения Flask из терминала:
source venv/bin/activate
export FLASK_APP=__init__.py
flask run
И BAM, я получаю правильную версию Python, 3.8.1. Однако теперь у меня возникла новая проблема. Когда я перезагружаю Apache и пытаюсь go перейти на мой сайт, Apache выдает следующую ошибку: Exception occurred processing WSGI script '/var/www/MyApp/MyApp.wsgi'
и ImportError: No module named flask
Я думаю, что мне нужно сказать Apache или WSGI (или кто бы ни) где моя Flask установка, так как она установлена только в пределах venv. Я нашел это сообщение SO: Flask - WSGI - Нет модуля с именем 'flask'
И попробовал предлагаемое решение, используя директиву python-path
в моей конфигурации Apache, например: Итак:
WSGIScriptAlias / /var/www/MyApp/MyApp.wsgi
# WSGIDaemonProcess MyApp python-home=/var/www/MyApp/MyApp/venv
WSGIDaemonProcess MyApp python-path=/var/www/MyApp:/var/www/MyApp/MyApp/venv/lib/python3.8/site-packages
WSGIProcessGroup MyApp
И БАМ, мое приложение снова работает, но ЭЙ, почему оно все еще использует Python 2.7.17? Я перешел по ссылке, которую опубликовал один из комментаторов, относительно использования виртуальных сред с WSGI: https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html
Из того, что я собрал, я должен был установить mod_wsgi перед установкой pyenv и Python 3.8.1. Таким образом, mod_wsgi «скомпилирован» со старой версией Python, и вы не можете использовать виртуальную среду, чтобы заставить mod_wsgi использовать версию python, отличную от той, с которой он был установлен / скомпилирован. Как переустановить и скомпилировать mod_wsgi, чтобы он работал на моей любимой Python версии?
Редактировать: Я пытался сделать
sudo apt-get --purge remove libapache2-mod-wsgi
sudo apt-get install libapache2-mod-wsgi-py3
Однако теперь мой приложение использует Python 3.6.9 (системная версия, которая шла с Ubuntu 18.04). Похоже, этот метод установки игнорирует мои настройки pyenv (Python 3.8.1). Могу ли я переопределить это и указать версию python как-нибудь?