2

私はdjango appを持っており、 channelschannels apiでwebsocketサポートを実装しています。モデルへのバインディングでデマルチプレクサを使用しています。たとえば、モデルを保存すると、開いている websocket 接続に変更が送信されます。私が実行./manage.py runserver 0:80してすべてを1つのコンテナに収めれば、すべてが正常に機能します。しかし、アプリを UWSGI、daphne、および docker を使用するワーカー コンテナーに分離すると、シグナルはトリガーされません。たとえば、セロリ ワーカー (タスク) が信号をトリガーし、websocket 経由で更新を送信するようにします。マルチコンテナのセットアップでは、WebSocket 接続は正常に確立され、Web は正常に動作しますが、そのシグナルをトリガーするものは何もありません。

シグナルがどのように定義されているかは、こちらのgithubで確認できます。

私はdjango 1.9.12、python 2.7、dockerを使用しており、debian stretchでビルドしています。

docker-compose.yml

  web:
    build: .
    ports: ["8001:80"]

  daphne:
    build: .
    command: daphne -b 0.0.0.0 -p 8000 --access-log - -v 2 my_proj.asgi:channel_layer 

  ws_worker:
    build: .
    command: ./manage.py runworker -v 2

  celery_worker:
    build: .
    command: /usr/local/bin/celery -A my_proj worker

nginx.conf

upstream django {
    server unix:/home/docker/app.sock; 
}

server {
    listen 80;
    server_name 127.0.0.1;
    charset utf-8;
    client_max_body_size 1000M;

    location /static/ {
        alias /home/docker/static/;
    }

    # proxy to other container
    location /ws/ {
        proxy_pass http://daphne:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location / {
        uwsgi_pass  django;
        include     /home/docker/uwsgi_params;
    }

}
4

1 に答える 1