Прежде всего, извините за длинный вопрос, я надеюсь, что у некоторых из вас хватит на это терпения.
TL; ДР: Как мне правильно загрузить настройки django в systemd?
Я следую этому руководству, Развертывание каналов Django с помощью Дафны, поэтому я могу запускать некоторые приложения в реальном времени (используя WebSockets). Без nginx и при запуске из командной строки рабочего (python manage.py runworker) и интерфейса (daphne) я могу получить доступ к правильному классу потребителей каналов, как можно увидеть в журнале ниже (они были запущены из клиента javascript) :
2017-10-09 21:10:35,210 - DEBUG - worker - Got message on websocket.connect (reply daphne.response.CYeWgnNQoY!mwuQrazQtv)
2017-10-09 21:10:35,211 - DEBUG - runworker - websocket.connect
2017-10-09 21:10:35,211 - DEBUG - worker - Dispatching message on websocket.connect to api.consumers.OrderConsumer
2017-10-09 21:10:48,132 - DEBUG - worker - Got message on websocket.receive (reply daphne.response.CYeWgnNQoY!mwuQrazQtv)
2017-10-09 21:10:48,132 - DEBUG - runworker - websocket.receive
2017-10-09 21:10:48,132 - DEBUG - worker - Dispatching message on websocket.receive to api.consumers.OrderConsumer
Эти события были вызваны следующими вызовами javascript:
ws = new WebSocket("ws://localhost:8000/order/1/")
ws.send("test")
С nginx и запуском интерфейса и worker на systemd я получаю следующий журнал, несмотря на то, что использую тот же самый ввод триггера.
2017-10-09 20:38:35,503 - DEBUG - worker - Got message on websocket.connect (reply daphne.response.PPGuXtBmQD!EgUfaNZjUj)
2017-10-09 20:38:35,503 - DEBUG - runworker - websocket.connect
2017-10-09 20:38:35,503 - DEBUG - worker - Dispatching message on websocket.connect to channels.routing.connect_consumer
2017-10-09 20:38:42,993 - DEBUG - worker - Got message on websocket.receive (reply daphne.response.PPGuXtBmQD!EgUfaNZjUj)
2017-10-09 20:38:42,993 - DEBUG - runworker - websocket.receive
2017-10-09 20:38:42,993 - DEBUG - worker - Dispatching message on websocket.receive to channels.routing.null_consumer
Обратите внимание, что канал приема направляется на null_consumer
. Я считаю, что проблема здесь просто в том, что channels.routing
плохо настроен. Поскольку я использую один и тот же параметр (файл настроек Django) в обеих версиях, это, вероятно, означает, что сам параметр загружается неправильно. Обратите внимание на следующие файлы.
## rest-api/farmaApp/settings.py
...
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'asgi_redis.RedisChannelLayer',
'CONFIG': {
'hosts': [('localhost', 6379)],
},
'ROUTING': 'farmaApp.routing.channel_routing',
}
}
...
Что должно настроить channels.routing
на:
## rest-api/farmaApp/routing.py
from channels.routing import route
from api.consumers import ws_connect, ws_disconnect, OrderConsumer
channel_routing = [
route('websocket.connect', ws_connect, path=r'^/users/'),
route('websocket.disconnect', ws_disconnect, path=r'^/users/'),
OrderConsumer.as_route(path=r'^/order/(?P<order_id>[\d+])/'),
]
Опять же, я не думаю, что сама конфигурация неправильная, поскольку она работает без systemd. Наконец, вот мои системные конфигурации:
## /etc/systemd/system/daphne.service
[Unit]
Description=daphne daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/rest-api
Environment=DJANGO_SETTINGS_MODULE=farmaApp.settings
ExecStart=/home/ubuntu/rest-api/env/bin/daphne --access-log /home/ubuntu/rest-api/access.log -b 0.0.0.0 -p 8001 farmaApp.asgi:channel_layer
[Install]
WantedBy=multi-user.target
## /etc/systemd/system/django_worker.service
[Unit]
Description=django_worker daemon
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/rest-api
Environment=DJANGO_SETTINGS_MODULE=farmaApp.settings
ExecStart=/home/ubuntu/rest-api/env/bin/python manage.py runworker -v 2
[Install]
WantedBy=multi-user.target
Обратите внимание на оба файла конфигурации, которые я экспортирую в среду, переменную DJANGO_SETTINGS_MODULE в соответствии со связанным руководством. Я считаю, что это работает не так, как ожидалось.