Dash, развернутый на сервере Apache, не работает, и объект Dash не может быть вызван

Я пытаюсь развернуть приложение python dash на свой сервер apache. Я изучил скудную информацию об этой конфигурации, которую смог найти (официальные документы; эта ветка устранения неполадок была немного лучше). Когда я посещаю веб-сайт, страница возвращает 500 Internal Server Error, который в журнале ошибок сервера обозначен как "Dash object not callable". Это файлы конфигурации:

>> cat /var/www/html/wsgi/dashGAF.wsgi
#!/usr/bin/python
import sys
sys.path.insert(0,"/home/ubuntu/dashboards/")
from dashGAF import app as application
>> cat /etc/apache2/sites-available/dash.conf 
WSGIDaemonProcess dashGAF user=ubuntu group=ubuntu home=/home/ubuntu threads=5
WSGIScriptAlias /dashGAF /var/www/html/wsgi/dashGAF.wsgi
    <Directory /home/ubuntu/dashboards>
        WSGIProcessGroup dashGAF
            WSGIApplicationGroup %{GLOBAL}
            WSGIScriptReloading On
        Require all granted
    </Directory>
>> cat dashGAF.py
# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets, routes_pathname_prefix='/dashGAF/')
server = app.server

app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for Python.
    '''),

    dcc.Graph(
        id='example-graph',
        figure={
            'data': [
                {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'SF'},
                {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Montréal'},
            ],
            'layout': {
                'title': 'Dash Data Visualization'
            }
        }
    )
])

if __name__ == '__main__':
    app.run_server(debug=True, host='0.0.0.0')

Когда я захожу в свое приложение Dash по адресу the_ip_address/dashGAF, я получаю 500 Internal Server Error. Просматривая error.log, я вижу:

[Sat Jun 20 04:42:59.502528 2020] [wsgi:error] [pid 6064:tid 140622992238336] [client 118.210.193.245:50042] mod_wsgi (pid=6064): Exception occurred processing WSGI script '/var/www/html/wsgi/dashGAF.wsgi'.
[Sat Jun 20 04:42:59.502675 2020] [wsgi:error] [pid 6064:tid 140622992238336] [client 118.210.193.245:50042] TypeError: 'Dash' object is not callable

Любая помощь в решении этой проблемы будет БЛАГОДАРНА! Также будут полезны любые предложения по изменению файлов конфигурации.

Еще немного подробностей:

  • Я получал ошибку при импорте модуля, как показано ниже в моем /var/log/apache2/error.log:
[Sat Jun 20 03:38:58.556219 2020] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574]   File "/home/ubuntu/dashboards/dashGAF.py", line 2, in <module>
[Sat Jun 20 03:38:58.556265 2020] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574]     import dash
[Sat Jun 20 03:38:58.556285 2020] [wsgi:error] [pid 583:tid 140297735726848] [client 118.210.193.245:55574] ImportError: No module named dash

Что я смог исправить, выполнив sudo pip install dash==1.13.2.

  • Я создал все файлы * .py и * .wsgi -rwxr-xr-x

  • Я включил конфигурацию сайта с помощью sudo a2ensite dash.conf и перезагрузил конфигурацию с помощью udo systemctl reload apache2.

  • Я считаю, что запущенная версия python - python2.7 (на основе apache error.log); Не знаю точно, как указать 2,7 или 3.

  • Если я редактирую файл dashGAF.wsgi так, чтобы он имел from dashGAF import server as application, я получаю внутреннюю ошибку 500, но со следующими данными в журнале сервера:

[Sun Jun 21 06:33:28.181450 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] mod_wsgi (pid=12237): Target WSGI script '/var/www/html/wsgi/dashGAF.wsgi' cannot be loaded as Python module.
[Sun Jun 21 06:33:28.181512 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] mod_wsgi (pid=12237): Exception occurred processing WSGI script '/var/www/html/wsgi/dashGAF.wsgi'.
[Sun Jun 21 06:33:28.181545 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] Traceback (most recent call last):
[Sun Jun 21 06:33:28.181577 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221]   File "/var/www/html/wsgi/dashGAF.wsgi", line 4, in <module>
[Sun Jun 21 06:33:28.181685 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221]     from dashGAF import server as application
[Sun Jun 21 06:33:28.181714 2020] [wsgi:error] [pid 12237:tid 139670549669632] [client 118.210.193.245:52221] ImportError: cannot import name server

Возможно, есть полезная деталь в том месте, где говорится, что целевой сценарий WSGI «/var/www/html/wsgi/dashGAF.wsgi» не может быть загружен как модуль Python. ??

  • Если я отредактирую dashGAF.wsgi так, чтобы было application = app.server, я получу 404 Not Foun:
from dashGAF import app
application = app.server

person David_G    schedule 20.06.2020    source источник


Ответы (2)


Обычно вы ориентируетесь на сервер Flask, а не на приложение Dash в сценарии wsgi. То есть вместо

from dashGAF import app as application

должен быть

from dashGAF import server as application
person emher    schedule 20.06.2020
comment
Спасибо за предложения ... Но если я отредактирую свой сценарий * .wsgi на import server, я получу ошибку 404 Not Found для этой страницы. Соответственно отредактировали мой пост ... - person David_G; 20.06.2020
comment
Я проверил снова, и на этот раз я получаю другую ошибку (не 404 Not Found). Похоже, он неправильно читает мой файл wsgi. Не знаю, почему я не понял этого в первый раз. Интересно, нужно ли мне делать systemctl reload apache2 с каждым изменением файла wsgi? - person David_G; 21.06.2020

Я немного колебался, стоит ли отвечать на свой вопрос. Ответ @emher был частью проблемы, но не полным решением. Мне нужно было исправить несколько проблем, и большая часть этого устранения неполадок проводилась @GrahamDumpleton на github . Я более чем счастлив, что он даст ответ, если он захочет.

Тем не менее, вот проблемы и исправления, которые должны были возникнуть:

проблемы и исправления:

окончательная настройка:

/etc/apache2/sites-available/dash.conf

WSGIDaemonProcess dashGAF user=ubuntu group=ubuntu home=/home/ubuntu threads=5
WSGIScriptAlias /dashGAF /var/www/html/wsgi/dashGAF.wsgi

WSGIProcessGroup dashGAF
WSGIApplicationGroup %{GLOBAL}

/var/www/html/wsgi/dashGAF.wsgi

#!/usr/bin/python
import sys
sys.path.insert(0,"/home/ubuntu/dashboards/")
from dashGAF import server as application

dashboards / dashGAF.py То же, что и выше, но включает:

app = dash.Dash(__name__, external_stylesheets=external_stylesheets, requests_pathname_prefix='/dashGAF/')
server = app.server
person David_G    schedule 02.07.2020