модули numpy, pandas не найдены при развертывании фляжного приложения за apache с помощью pyenv и virtualenv

Я создал интерфейс flask для довольно подробного приложения, и после большого количества кода он отлично работает локально. Итак, теперь я хочу сделать его видимым для публики, поэтому читал, что ему нужен интерфейс Apache или nginx. Я вычислил нужный мне размер инстанса, включил его на AWS и запустил эти два учебники, которые доказывают, что базовый вариант работает. После завершения настройки Apache страница приветствия Apache отображается, когда я перехожу к IP-адресу экземпляра AWS. Затем, когда я временно заменяю код «Hello World» для своего фляжного приложения и обновляю браузер с помощью IP-адреса, отображается приветственный мир. Кроме того, если я заменю код flasskapp.py из здесь он отлично передает через apache IP-адрес, введенный в браузере, список модулей, найденных pip, включая Numpy и Pandas, которые в противном случае он жалуется на то, что не нашел! Однако этот скрипт можно легко убить, добавив import numpy вверху, но он выдает следующие сообщения об ошибках:

ImportError: cannot import name 'multiarray'

а также

Importing the multiarray numpy extension module failed.  Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` 
(removes all files not under version control).  
Otherwise reinstall numpy.

оба в журнале апача.

Проблема возникает, когда я возвращаю свое приложение вместо приветствия, мир. Он просто отказывается импортировать pandas, вот последний раздел журнала Apache:

Mon Jul 03 19:42:14.691081 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560] Traceback (most recent call last):
[Mon Jul 03 19:42:14.691126 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]   File "/var/www/html/flaskapp/flaskapp.wsgi", line 30, in <module>
[Mon Jul 03 19:42:14.691130 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]     from similar_items_frontend import app as application
[Mon Jul 03 19:42:14.691137 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]   File "/var/www/html/flaskapp/similar_items_frontend.py", line 4, in <module>
[Mon Jul 03 19:42:14.691140 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]     from item_similar_to_doc import similar_to_doc
[Mon Jul 03 19:42:14.691145 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]   File "/home/ubuntu/find-similar/frontend/../item_similar_to_doc.py", line 1, in <module>
[Mon Jul 03 19:42:14.691148 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]     from PullVectors import p
[Mon Jul 03 19:42:14.691153 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]   File "/home/ubuntu/find-similar/frontend/../RunSimilarity.py", line 5, in <module>
[Mon Jul 03 19:42:14.691156 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]     import pandas as pd
[Mon Jul 03 19:42:14.691161 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]   File "/home/ubuntu/.pyenv/versions/miniconda3-latest/envs/find_similarProject/lib/python3.6/site-packages/pandas/__init__.py", line 19, in <module>
[Mon Jul 03 19:42:14.691164 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560]     "Missing required dependencies {0}".format(missing_dependencies))
[Mon Jul 03 19:42:14.691180 2017] [wsgi:error] [pid 12300:tid 140131159766784] [client 93.21.05.132:52560] ImportError: Missing required dependencies ['numpy']

Я чувствую, что перепробовал все, это было много мучительных часов, время выдергивания волос..

Вот 000-default.conf :

WSGIPythonPath /home/ubuntu/.pyenv/versions/miniconda3-latest/envs/vtenv4YTproject/lib/python3.6/site-packages/

<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        WSGIDaemonProcess flaskapp threads=5
        WSGIScriptAlias / /var/www/html/flaskapp/flaskapp.wsgi

        <Directory flaskapp>
              WSGIScriptReloading On
              WSGIProcessGroup %{GLOBAL}
              WSGIApplicationGroup %{GLOBAL}
              Order allow,deny
              Allow from all
        </Directory>



        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Я должен упомянуть, что мое фляжное приложение отлично работает (вплоть до того, что фляга обслуживает страницу) в своем virtualenv, когда я нахожусь на ssh в экземпляре AWS, конечно, было немного возиться, чтобы заставить это работать, но он находит все свои зависимости, не падающие при импорте pandas.

Чтобы попытаться исправить это, я посмотрел здесь , здесь, добавлен код из здесь просмотрела обширную документацию здесь, мой файл flaskapp.wsgi выглядит так:

import sys
import logging
import os.path
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
import config
import site

prev_sys_path = list(sys.path) 

site.addsitedir('/home/ubuntu/.pyenv/versions/miniconda3-latest/envs/find_similarProject/lib/python3.6/site-packages')

new_sys_path = []

for item in list(sys.path): 
    if item not in prev_sys_path:
        new_sys_path.append(item) 
        sys.path.remove(item)
sys.path[:0] = new_sys_path 

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/html/flaskapp")

from similar_vids_frontend import app as application
application.secret_key = config.WSGI_KEY

Я просто не могу понять, почему импорт pandas/numpy не работает с apache, но работает нормально, когда просто запускается в virtualenv. Интересно, есть ли что-то связанное с разрешениями и группами, согласно документам:

Имейте в виду, что пользователь, от имени которого Apache запускает ваш код, должен иметь доступ к виртуальной среде Python. В некоторых дистрибутивах Linux домашний каталог учетной записи пользователя недоступен для других пользователей. Вместо того, чтобы изменять разрешения для вашего домашнего каталога, лучше рассмотреть возможность размещения кода вашего приложения WSGI и любой виртуальной среды Python за пределами вашего домашнего каталога.

Но является ли Ubuntu одним из тех дистрибутивов, и что тогда, устанавливать виртуальные среды и проецировать в папку /?

Благодарен за любые советы или решения.


person cardamom    schedule 03.07.2017    source источник
comment
Помогает ли вам этот вопрос?   -  person syntonym    schedule 04.07.2017
comment
Спасибо. Я видел это, но понятия не имел, что такое режим демона и использовал ли я его. Я начинаю думать, что я использую github.com/pyenv/pyenv-virtualenv, но на самом деле не сделал sudo apt install virtualenv, хотя все работает, если apache не пытается его запустить   -  person cardamom    schedule 04.07.2017
comment
Вы используете WSGIDaemonProcess, поэтому я думаю, что вы действительно используете режим демона, о котором говорит ответ. Вы пробовали исправить ответ, который предлагает ответ?   -  person syntonym    schedule 04.07.2017
comment
Да, я убрал эту строку вверху WSGIPythonPyth и добавил строку посередине WSGIDaemonProcess flaskapp threads=5 python-path=/home/ubuntu/.pyenv/versions/miniconda3-latest/envs/find_similarProject/bin, но проблема осталась ImportError: Missing required dependencies ['numpy']   -  person cardamom    schedule 04.07.2017
comment
Параметр python-path должен указывать на ваши пакеты сайтов, поэтому, вероятно, WSGIDaemonProcess flaskapp threads=5 python-path=/home/ubuntu/.pyenv/versions/miniconda3-latest/envs/find_similarProject/lib/python3.6/site-packages.   -  person syntonym    schedule 04.07.2017
comment
Спасибо, я попробовал это. Вероятно, что-то с pyenv/virtualenv и Python 3.6 не смешивается с этой штукой wsgi/apache посмотрю, смогу ли я ее решить   -  person cardamom    schedule 04.07.2017
comment
Под каким пользователем работает apache, apache? Если вы запускаете свое приложение от имени этого пользователя с терминала, оно все еще работает?   -  person syntonym    schedule 04.07.2017
comment
Давайте продолжим обсуждение в чате.   -  person cardamom    schedule 04.07.2017
comment
Вы указали процесс демона для mod_wsgi, но не используете его, так как вы неправильно задали WSGIProcessGroup, он должен называть группу процессов демона, а не %{GLOBAL}. Вы также настраиваете всю виртуальную среду с помощью mod_wsgi нерекомендуемым образом. Прочитайте modwsgi.readthedocs.io/en/develop/user- руководства/   -  person Graham Dumpleton    schedule 04.07.2017
comment
Вы также не можете заставить mod_wsgi, скомпилированный для определенной версии Python, использовать виртуальную среду Python, созданную с помощью другой версии или установки Python. Если вы хотите использовать несистемную установку Python, вам потребуется скомпилировать mod_wsgi из исходного кода для установки Python, которую вы хотите использовать. Предлагаем вам не использовать системный пакет mod_wsgi и использовать pip метод его установки, как описано в pypi.python.org/pypi /mod_wsgi   -  person Graham Dumpleton    schedule 04.07.2017
comment
Спасибо @GrahamDumpleton. Я немного подозрительно отношусь к тому, что он говорит мне mod_wsgi/4.3.0 Python/3.5.2 configured, когда я скомпилировал его для Python 3.6. На данный момент я избавился от virtualenv и просто использую miniconda3-latest в pyenv, но это ничего не помогло. Я прочитаю о группе процессов демона и перезапущу ее.   -  person cardamom    schedule 04.07.2017
comment
Итак, вы говорите мне НЕ устанавливать для него значение %{GLOBAL}, но я вижу, что еще в феврале вы сказали кому-то с похожей проблемой сделать именно это, что-то еще должно быть по-другому..   -  person cardamom    schedule 04.07.2017
comment
Значение, присвоенное WSGIProcessGroup, должно соответствовать имени директивы WSGIDaemonProcess. Тот другой пост был о WSGIApplicationGroup, который отличается.   -  person Graham Dumpleton    schedule 04.07.2017
comment
Есть ли у WSGI проблемы с Python 3.6.1? Я думал попробовать anaconda3-4.4.0 на случай, если это произойдет, но тогда мой собственный код больше не будет работать локально, вылетит с ужасным стеком сообщений об ошибках.   -  person cardamom    schedule 04.07.2017
comment
Python 3.6 работает нормально, но для него должен быть скомпилирован mod_wsgi. Вы не можете, как я уже говорил, пытаться заставить mod_wsgi, скомпилированный для версии 3.5, использовать виртуальную среду, созданную с помощью версии 3.6. Используйте процедуры в modwsgi.readthedocs.io/en/develop /user-guides/ для проверки того, как был собран ваш mod_wsgi.   -  person Graham Dumpleton    schedule 05.07.2017
comment
Я изо всех сил пытался настроить mod_wsgi с Apache и Python в Windows. Все, чего мне не хватало, это WSGIProcessGroup %{GLOBAL}. Спасибо за размещение вопроса. Примечание. Я поместил конфигурацию не в раздел «Каталог», а чуть ниже WSGIScriptAlias.   -  person Vikram3891    schedule 27.11.2019


Ответы (1)


Теперь это работает, в основном благодаря рецепту Грэма здесь, а также этот ответ о загрузке модулей в apache. Доказательством того, что это работает, является следующий вариант приложения hello world:

from flask import Flask
import numpy
app = Flask(__name__)

@app.route('/')
def hello_from_np():
  a = numpy.array([4,5,6])
  return str(a)

if __name__ == '__main__':
  app.run()

дает вам это в браузере, когда вы переходите на IP:

введите здесь описание изображения

... а не куча ошибок в журнале apache о numpy. Все настроено для Python 3.6:

AH00489: Apache/2.4.7 (Ubuntu) mod_wsgi/4.5.15 Python/3.6 configured

Хотел записать несколько деталей в качестве заметки для себя, и на случай, если у кого-то возникнут проблемы и он попытается воспроизвести это, возможно, избавить вас от дней, когда вы будете лаять не на то дерево.

Поэтому я переключился с Ubuntu Server 16.04 на 14.04.5 LTS на случай, если это было частью проблемы, а также потому, что pyenv работал плохо, вылетая на полпути установки многих старых версий Python, которые я тестировал. Также решил не указывать pyenv-virtualenv, так как для этого экземпляра не планировалось несколько проектов, и одной ошибкой было меньше.

Из чистой установки Ubuntu, в дополнение к установке apache2, pyenv, libapache2-mod-wsgi, активации его с помощью a2enmod, я намеренно выполнил следующие строки перед установкой требований с помощью pip, который включал numpy, поэтому он не жалуется:

sudo apt-get install gcc
sudo apt-get install g++

Это также необходимо:

sudo apt-get install apache2-dev

Затем внутри среды, после требований,

pip install mod_wsgi
mod_wsgi-express module-config

Вторая строка вернула:

LoadModule wsgi_module "/home/ubuntu/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/home/ubuntu/.pyenv/versions/miniconda3-latest"

Затем при загрузке модуля docs рекомендует вам вставить в файл httpd.conf, которого, по крайней мере, в моей версии apache и ubuntu не существует. После долгого чтения я избегал его создания, а также избегал вставки его в apache2.conf, который выглядит как связанный. Скорее, следуя инструкциям для Ubuntu, указанным вверху,

отредактируйте этот файл:

sudo vi /etc/apache2/mods-available/wsgi.load

вставьте в него эту строку и сохраните:

LoadModule wsgi_module /path/to/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

затем запустите это и при необходимости перезапустите сервер apache:

sudo a2enmod wsgi

000-default.conf выглядит так:

WSGIPythonHome "/home/ubuntu/.pyenv/versions/miniconda3-latest"

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
        WSGIDaemonProcess helloapp threads=5 python-path=/var/www/html/frontend/  
        WSGIScriptAlias / /var/www/html/frontend/helloapp.wsgi

        <Directory flaskapp>
        WSGIProcessGroup helloapp
        WSGIApplicationGroup %{GLOBAL}
        Order allow,deny
        Allow from all
        </Directory>

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>
person cardamom    schedule 06.07.2017
comment
В то время как для целей исходного вопроса работает этот 000-default.conf, то есть импорт Numpy, ну это странно, чем фантастика, но scipy НЕ импортирует! Более того, он даже не выдает сообщение об ошибке, как import numpy! Чтобы исправить это, см. здесь строка WSGIApplicationGroup %{GLOBAL} нуждается быть перемещенным с того места, где он находится, прямо под строкой WSGIScriptAlias - person cardamom; 07.07.2017
comment
Там, где у вас есть <Directory flaskapp>, должно быть <Directory /var/www/html/frontend>. Как бы то ни было, вы бы даже не использовали режим демона. То, что Apache не отклонил запрос из-за запрета доступа, говорит о том, что ваши разрешения в другом месте в Apache невелики и позволяют Apache обслуживать данные из любого места в файловой системе. Предлагаем вам добавить WSGIRestrictEmbedded On вне VirtualHost, чтобы вызвать сбой, если встроенный режим используется по ошибке. - person Graham Dumpleton; 09.07.2017
comment
Ваша команда (размещенная под нижней частью VirtualHost) действительно сломала его после того, как он отлично работал с субботы: Embedded mode of mod_wsgi disabled by runtime configuration: /var/www/html/frontend/flaskapp.wsgi Мне он нужен онлайн сейчас, поделился ссылкой, так что, надеюсь, никто не найдет способ взломать его тем временем, удалено WSGIRestrictEmbedded On снова. Вероятно, предоставления прав execute файлам в папке внешнего интерфейса было достаточно, не нужно было добавлять весь репозиторий Python в группу www-data. Узнаю какие безопасные настройки и восстановлю в спокойное время суток. - person cardamom; 11.07.2017
comment
Должно вызвать какие-либо проблемы с безопасностью, использование встроенного режима имеет проблемы с производительностью и возможностью восстановления, если сервер Apache использует типичную конфигурацию, подходящую больше для статических файлов и приложений PHP. Прочтите blog.dscpl.com .au/2012/10/ - person Graham Dumpleton; 11.07.2017
comment
Спасибо за ссылку, не обязательно будет работать очень хорошо для динамического веб-приложения с большим объемом памяти, которое работает лучше, если постоянно хранится в памяти. Хорошо, что его не взломают, он использует много памяти и до сих пор один раз зависал. Попытаюсь правильно преобразовать его в режим демона в течение недели или около того. - person cardamom; 11.07.2017