Дафна в Google App Engine Flexible для приложения Django Channels: ошибка 502 Bad Gateway nginx

Я новичок в веб-разработке, поэтому ценю помощь умных людей. Я пытаюсь переключиться с gunicorn на Daphne для моего приложения Django на GAE Flex, так как мне нужно использовать каналы Django.

Раньше сайт нормально работал с Gunicorn в качестве точки входа (в файле app.yaml). Я просто заменил его на daphne (я бы хотел избежать сложностей, изменив конфигурации nginx, сокеты Unix и т. Д., поэтому я думаю, что меня устраивает, что Дафна обслуживает запросы HTTP и ws). Итак, теперь мой app.yaml выглядит так:

runtime: python
env: flex

runtime_config:
  python_version: 3

entrypoint: daphne -b 0.0.0.0 -p 8001 my_project_name.asgi:application

Я уже сделал файл .asgi рядом с моим файлом .wsgi и объявил там приложение.

В файле requirements.txt я убедился, что пакеты daphne (2.4.1) и asgiref (3.2.3) являются последними версиями.

Наконец, когда я выполняю «развертывание приложения gcloud», развертывание происходит плавно, и в журналах сборки я вижу запуск Дафны:

Step #1: Step 9/9 : CMD exec daphne -b 0.0.0.0 -p 8001 my_project_name.asgi:application
Step #1:  ---> Running in c6f3762a5ce2

Но я получаю на сайте ошибку 502 Bad Gateway с «nginx» в следующей строке.

Вопрос: Что я делаю не так? Это потому, что Дафна не обслуживает HTTP-запросы? Могу ли я сделать что-нибудь другое, чтобы Дафна обслуживала HTTP-запросы? Прямо сейчас мои http-пути обслуживаются в Django модулем urls.py, а не модулем routing.py (который заботится только о ws-запросах). Должен ли я как-то это изменить?

Если вы считаете, что разделение входящих запросов и отправка http на gunicorn - единственный способ, опишите эти шаги. Что произойдет с точкой входа в файле app.yaml, если я это сделаю?

Мои усилия на данный момент: я вижу много вопросов по SO (например, это и this) и другие онлайн-руководства по использованию daphne на автономных машинах Linux, но не на движках приложений, таких как GAE Flex. Единственный пост, связанный с GAE, который я видел, был this, но это другая проблема, чем моя.


person oktested    schedule 18.01.2020    source источник
comment
Привет, @oktested, мне кажется, что между сервером Daphne и вашим сервером приложений есть некоторая неправильная конфигурация. вы тестировали приложение локально? Можете ли вы предоставить мне журналы, связанные с этой ошибкой, вы можете найти их в Stackdriver logging в Google Cloud? на каком порту вы запускаете приложение локально?   -  person Methkal Khalawi    schedule 21.01.2020
comment
Привет, @MethkalKhalawi - вот журналы из консоли gcloud: Для ясности, Дафна работает на порту 8001. В последней сборке я изменил хост на 127.0.0.1 вместо 0.0.0.0. Также я добавил файл с именем nginx.conf в папку моего проекта, который объявил вышестоящий сервер, а затем выполнил для него proxy_pass в папке /. Журналы сервера Django: `2020-01-21 13: 05: 52,608 INFO Запуск сервера по tcp: port = 8001: interface = 127.0.0.1 2020-01-21 13: 05: 52,611 INFO Настройка конечной точки tcp: port = 8001: interface = 127.0.0.1 2020-01-21 13: 05: 52,612 INFO Прослушивание TCP-адреса 127.0.0.1:8001 `   -  person oktested    schedule 21.01.2020
comment
Журналы ошибок Nginx: '[ошибка] 33 # 33: * 341 connect () не удалось (111: соединение отклонено) при подключении к восходящему потоку, клиент: 172.217.194.153, сервер:, запрос: GET / HTTP / 1.1, восходящий поток: 172.17.0.1:8080, хост: projectoktested.appspot.com '   -  person oktested    schedule 21.01.2020
comment
Я понятия не имею, что это за IP-адреса, начинающиеся со 172. Я предполагаю, что 8080 - это просто порт, который GAE прослушивает по умолчанию. Журналы Django для самой ошибки 502 совершенно бесполезны - там просто написано 502, и все.   -  person oktested    schedule 21.01.2020
comment
вы тестировали свое приложение локально?   -  person Methkal Khalawi    schedule 21.01.2020
comment
Да, но это без Дафны. Локально работает нормально. Дафна мне нужна только при развертывании в облако. Кроме того, когда я запускаю ту же команду локально daphne -b 127.0.0.1 -p 8001 my_project_name.asgi: application, оно создает те же журналы, что и на сервере Django, поэтому все в порядке (запускающий сервер, настройка конечной точки и т. Д.). Поэтому я подозреваю, что проблема в конфигурации nginx. Как изменить адрес восходящего потока в журналах ошибок (172.17.0.1:8080) или конфигурацию nginx в GAE Flex, поскольку добавление файла с именем nginx-app.conf, похоже, не делает этого.   -  person oktested    schedule 21.01.2020
comment
вы видите какие-либо ошибки нехватки памяти? проверьте ведение журнала. если да, добавьте их в свой app.yaml resources: memory_gb: 4 и повторно разверните приложение.   -  person Methkal Khalawi    schedule 21.01.2020
comment
Не вижу ошибок нехватки памяти. Это единственная ошибка, которую я вижу. [ошибка] 33 # 33: * 921 connect () не удалось (111: соединение отклонено) при подключении к восходящему потоку, клиент: xx.xx.xx.xx, сервер:, запрос: GET / HTTP / 1.1, восходящий поток: 172.17.0.1:8080, host: projectoktested.appspot.com Похоже, мое приложение не отвечает на nginx на порту 8080 . Как правильно настроить обработчики приложений, чтобы правильно принимать и отвечать на входящие запросы?   -  person oktested    schedule 22.01.2020
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Methkal Khalawi    schedule 22.01.2020
comment
Я подозреваю, что вы, вероятно, уже решили проблему, но для всех, кто придет, 172 IP-адреса являются частью частной адресации (например, 192.168) и являются внутренними IP-адресами для механизма докеров / приложений. Если Дафна настроена на прослушивание только 127.0.0.1, то она будет отклонять любые внешние подключения (включая другие докер-контейнеры или хост), что, по-видимому, и происходит здесь. Дафна также прослушивает порт 8001, что также могло быть проблемой, поскольку nginx ищет порт 8080.   -  person Scott Stevens    schedule 07.02.2021