Djangoチャネルを使用してWebアプリケーションを作成しましたが、スーパーバイザーシステムでセットアップしようとすると問題が発生します。
まず、アプリケーションはローカルでうまく機能します。
リモートで(Ubuntu Server 18.04LTSでAWSEC2インスタンスを使用しています)、コマンドdaphne -b 0.0.0.0 -p 8000 mysite.asgi:application
で実行するとうまく機能します。
ただし、スーパーバイザーで動作させることはできません。私は公式のDjango Channels docs( https://channels.readthedocs.io/en/latest/deploying.html )の指示に従います。したがって、次のようになります。
nginx構成ファイル:
upstream channels-backend {
server localhost:8000;
}
server {
server_name www.example.com;
keepalive_timeout 5;
client_max_body_size 1m;
access_log /home/ubuntu/Django_app/logs/nginx-access.log;
error_log /home/ubuntu/Django_app/logs/nginx-error.log;
location /static/ {
alias /home/ubuntu/Django_app/mysite/staticfiles/;
}
location / {
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_pass http://channels-backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
listen 80;
server_name www.example.com;
if ($Host = www.example.com) {
return 301 https://$Host$request_uri;
} # managed by Certbot
return 404; # managed by Certbot
}
スーパーバイザー構成ファイル:
[fcgi-program:asgi]
socket=tcp://localhost:8000
directory=/home/ubuntu/Django_app/mysite
command=/home/ubuntu/Django_app/venv/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers mysite.asgi:application
numprocs=4
process_name=asgi%(process_num)d
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/Django_app/logs/supervisor_log.log
redirect_stderr=true
このように設定すると、Webページは機能しません(504ゲートウェイタイムアウト)。スーパーバイザーログファイルには、次のように表示されます。
2018-11-14 14:48:21,511 INFO Starting server at fd:fileno=0, unix:/run/daphne/daphne0.sock
2018-11-14 14:48:21,516 INFO HTTP/2 support enabled
2018-11-14 14:48:21,517 INFO Configuring endpoint fd:fileno=0
2018-11-14 14:48:22,015 INFO Listening on TCP address 127.0.0.1:8000
2018-11-14 14:48:22,025 INFO Configuring endpoint unix:/run/daphne/daphne0.sock
2018-11-14 14:48:22,026 CRITICAL Listen failure: [Errno 2] No such file or directory: '1416' -> b'/run/daphne/daphne0.sock.lock'
2018-11-14 14:48:22,091 INFO Starting server at fd:fileno=0, unix:/run/daphne/daphne2.sock
2018-11-14 14:48:22,096 INFO HTTP/2 support enabled
2018-11-14 14:48:22,097 INFO Configuring endpoint fd:fileno=0
2018-11-14 14:48:22,135 INFO Starting server at fd:fileno=0, unix:/run/daphne/daphne3.sock
2018-11-14 14:48:22,152 INFO HTTP/2 support enabled
2018-11-14 14:48:22,153 INFO Configuring endpoint fd:fileno=0
2018-11-14 14:48:22,237 INFO Listening on TCP address 127.0.0.1:8000
2018-11-14 14:48:22,241 INFO Listening on TCP address 127.0.0.1:8000
2018-11-14 14:48:22,242 INFO Configuring endpoint unix:/run/daphne/daphne3.sock
2018-11-14 14:48:22,242 CRITICAL Listen failure: [Errno 2] No such file or directory: '1419' -> b'/run/daphne/daphne3.sock.lock'
2018-11-14 14:48:22,252 INFO Configuring endpoint unix:/run/daphne/daphne2.sock
2018-11-14 14:48:22,252 CRITICAL Listen failure: [Errno 2] No such file or directory: '1420' -> b'/run/daphne/daphne2.sock.lock'
等.
スーパーバイザーコマンドでは、Daphneプロセスが以前に実行したのとは別の方法で(他のパラメーターセットを使用して)呼び出されることに注意してください。アドレスとポートのパラメーターの代わりに、ソケットとファイル記述子のパラメーターがあります(これについては説明しません)。よく知っている)。発生したエラーの原因だと思います。
どんな助けや提案も大歓迎です。
関連するパッケージのバージョン:
channels==2.1.2
channels-redis==2.2.1
daphne==2.2.1
Django==2.1.2
編集:
ソケットファイル用の空のファイル(スーパーバイザー構成ファイルのDaphneのコマンドに存在する)を作成すると、つまり、 /run/daphne/daphne0.sock
、/run/daphne/daphne1.sock
などの場合、ログファイルには次のように記録されます。
2018-11-15 10:24:38,289 INFO Starting server at fd:fileno=0, unix:/run/daphne/daphne0.sock
2018-11-15 10:24:38,290 INFO HTTP/2 support enabled
2018-11-15 10:24:38,280 INFO Configuring endpoint fd:fileno=0
2018-11-15 10:24:38,458 INFO Listening on TCP address 127.0.0.1:8000
2018-11-15 10:24:38,475 INFO Configuring endpoint unix:/run/daphne/daphne0.sock
2018-11-15 10:24:38,476 CRITICAL Listen failure: Couldn't listen on any:b'/run/daphne/daphne0.sock': [Errno 98] Address already in use.
質問:これらのファイルは空であってはなりませんか?それらは何を含めるべきですか?
エンドポイントパラメータのファイル記述子パラメータを置き換えるFabioの答えは、この問題(Daphneコードのバグのように見えた)の簡単な回避策を示しています。
ただし、元の手順が適切に機能するように、Daphneリポジトリの修正はすぐにコミットされました。
補足として(元の質問で書いた重大なリッスンの失敗がまだ発生している人のために)、ソケットファイルの物理的な場所(私の場合は/run/daphne/
)にアクセスできることを確認してください-私は時間がかかりすぎました/run
カタログにdaphne
フォルダーを作成するだけで、(すべてをSudo
で実行している場合でも)ジョブが実行されることを発見するだけです...予防措置として、ソケットのリダイレクトを検討することができます。別のフォルダへのファイル、例えば/tmp
これにより、Sudo
権限なしでディレクトリを作成できます。
スーパーバイザASGI設定ファイルの次の行
command=/home/ubuntu/Django_app/venv/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers mysite.asgi:application
--fd 0
を--endpoint fd:fileno=0
に置き換えます。