Как запустить Дафну и Гуникорна одновременно?

Я использую django-channels, поэтому мне нужно использовать daphne, но для статических файлов и других вещей я хочу использовать gunicorn. Я могу запустить daphne вместе с gunicorn, но не могу запустить их оба одновременно.

Мой вопрос в том, должен ли я запускать их оба одновременно или есть лучший вариант? Если я должен, как я могу это сделать?

Вот моя рабочая команда сервера:

gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload && daphne -b 0.0.0.0 -p 8089 app.asgi:application

PS: я разделил location из / и /ws/ на gunicorn и daphne на nginx.conf.


person John    schedule 08.04.2020    source источник


Ответы (2)


Ваша проблема в том, что вы вызываете оба процесса в одном контексте/строке, и один никогда не вызывается, потому что первый никогда не заканчивается.

этот процесс: gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload

не завершится в любой момент, поэтому команда && никогда не будет запущена, если вы не убьете эту команду вручную, и в этот момент я не уверен, что это не убьет всю цепочку процессов полностью.

если вы хотите запустить оба, вы можете фонировать оба процесса с &, например.

(не могу проверить, но это должно работать)

gunicorn app.wsgi:application --bind 0.0.0.0:8000 --reload & daphne -b 0.0.0.0 -p 8089 app.asgi:application &

Научить человека вылавливать информацию по этому типу проблем можно следующим образом: a-single-line">здесь

Я совершенно уверен, что вы потеряете нормальное ведение журнала консоли, которое вы обычно имели бы, запустив их в фоновом режиме, поэтому я бы посоветовал изучить nohup вместо & или отправить журналы куда-нибудь с помощью утилиты ведения журнала, чтобы вы не летали слепой.

Что касается других вариантов, если вы планируете масштабироваться до большого количества пользователей, возможно, более 100, я бы просто запустил два сервера: один для http-запросов wsgi django и один для запросов asgi daphne ws. Имейте прокси-сервер nginx между ними для всего, что вам нужно, и все готово. Это также то, что каналы рекомендуют для больших приложений.

Рекомендуется использовать общий префикс пути, такой как /ws/, чтобы отличать соединения WebSocket от обычных соединений HTTP, поскольку это упростит развертывание каналов в производственной среде в определенных конфигурациях.

В частности, для больших сайтов можно будет настроить HTTP-сервер производственного уровня, такой как nginx, для маршрутизации запросов на основе пути либо к (1) производственному серверу WSGI, такому как Gunicorn+Django, для обычных HTTP-запросов, либо (2) производственному ASGI-сервер высокого класса, такой как Daphne+Channels для запросов WebSocket.

Обратите внимание, что для небольших сайтов вы можете использовать более простую стратегию развертывания, при которой Daphne обслуживает все запросы — HTTP и WebSocket — вместо отдельного сервера WSGI. В этой конфигурации развертывания не требуется общий префикс пути, такой как /ws/.

person aericks1337    schedule 01.05.2020

для запуска обоих не требуется. Daphne - это сервер протоколов HTTP, HTTP2 и WebSocket. взгляните на README по этой ссылке: https://github.com/django/daphne

person Hossein Yazdani    schedule 10.10.2020
comment
Пожалуйста, внимательно прочитайте вопрос, я сказал, что хочу использовать пушку. Лучший. - person John; 12.10.2020