チャンネルを使用するプロジェクトがあり、ローカルではすべてうまくいきましたが、Heroku にデプロイすると、接続しようとするたびに 403 が発生しました。最初は、Heroku をローカルでテストし、Heroku のデータベースと redis インスタンスをローカルで使用し、すべてが機能したため、Heroku に問題があると考えました。
しかし、ngrokを使用してローカルホストへのパブリック トンネルを開くと、Heroku と同じ結果になることがわかりました。リクエストごとに 403 が返され、それをデバッグしようとしても、イベント ループが突然制御を取得したり、タイムアウト エラーが発生したりするため、あまり役に立ちません。セットアップは、一方がローカルにアクセスされ、もう一方がリモートにアクセスされているという保存とまったく同じです。これが私が Daphne を開始する方法です:
daphne weout.asgi:application --port 8000 --bind 0.0.0.0 -v 3
.
私のライブラリのバージョン:
- ジャンゴ==2.0.7
- チャンネル==2.2.0
- チャネル-redis==2.4.0
- ダフネ==2.3.0
Daphne の冗長性を最大に設定すると、接続しようとすると次のようになります。
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,489 [asyncio] DEBUG: poll 101.195 ms took 0.023 ms: 1 events
Nov 22 07:16:34 weout-staging app/web.1 10.12.43.130:10299 - - [22/Nov/2019:15:16:33] "WSCONNECTING /api/v1/ws/" - -
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,513 [daphne.http_protocol] DEBUG: Upgraded connection ['10.x.x.x', 10299] to WebSocket
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,648 [asyncio] WARNING: Executing <Task pending coro=<AsyncConsumer.__call__() running at /app/.heroku/python/lib/python3.6/site-packages/channels/consumer.py:59> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7fe01e6979d8>()] created at /app/.heroku/python/lib/python3.6/asyncio/base_events.py:276> created at /app/.heroku/python/lib/python3.6/site-packages/daphne/server.py:209> took 0.131 seconds
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,655 [daphne.server] INFO: failing WebSocket opening handshake ('Access denied')
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,656 [daphne.server] WARNING: dropping connection to peer tcp4:10.12.43.130:10299 with abort=False: Access denied
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,656 [daphne.ws_protocol] DEBUG: WebSocket ['10.x.x.x', 10299] rejected by application
Nov 22 07:16:34 weout-staging app/web.1 10.12.43.130:10299 - - [22/Nov/2019:15:16:33] "WSREJECT /api/v1/ws/" - -
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,660 [aioredis] DEBUG: Parsing Redis URI 'redis://xxxx@xxxxx'
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,660 [aioredis] DEBUG: Creating tcp connection to ('xxx.compute.amazonaws.com', 14059)
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,663 [asyncio] DEBUG: Get address info xxx, type=<SocketKind.SOCK_STREAM: 1>
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,667 [asyncio] DEBUG: Getting address info xxx.compute.amazonaws.com:14059, type=<SocketKind.SOCK_STREAM: 1> took 3.777 ms: [(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('x.x.x.x', 14059))]
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,669 [daphne.ws_protocol] DEBUG: WebSocket closed for ['10.x.x.x', 10299]
Nov 22 07:16:34 weout-staging app/web.1 10.12.43.130:10299 - - [22/Nov/2019:15:16:33] "WSDISCONNECT /api/v1/ws/" - -
Nov 22 07:16:34 weout-staging app/web.1 2019-11-22 15:16:33,671 [asyncio] DEBUG: connect <socket.socket fd=16, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('0.0.0.0', 0)> to ('x.x.x.x', 14059)
Daphne を使用して、通常の Django ビューと WebSocket コンシューマーの両方にサービスを提供しています。Djangoビューではすべてがうまく機能するため、問題はコンシューマーに接続するときにのみ発生します
リモートで Dapnhe にアクセスしているときに、同様の問題が発生した人はいますか? 最初は uvicorn を gunicorn と一緒に試してみましたが、最初の接続フェーズでコンシューマーを閉じるとバグが発生したため、Daphne に切り替えました。