5

まず最初に、長い質問で申し訳ありません。何人かの方がこれに我慢してくださることを願っています。

TL; DR: systemd で django 設定を正しくロードするにはどうすればよいですか?

Daphne を使用して Django チャネルをデプロイするこのガイドに従っているので、(WebSocket を使用して) いくつかのリアルタイム アプリを実行できます。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 を使用し、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 がなくても動作するため、構成自体が間違っているとは思いません。最後に、私の 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変数を環境にエクスポートする両方の構成ファイルに注意してください。これは期待どおりに機能していないと思います。

4

3 に答える 3