私はdjango appを持っており、 channelsとchannels 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;
}
}