Как настроить каналы Daphne в сервере Nginx
У меня есть приложение Django, которое обслуживает http и websocket запросы. Приложение нормально работает в локальном режиме. Я настроил службы gunicorn и daphne на сервере Nginx, но служба Daphne автоматически останавливается через несколько секунд после запуска, даже если запрос не выполняется. В результате соединение по websocket не устанавливается. Я сталкиваюсь с этой ошибкой уже несколько месяцев и пробовал различные доступные решения, но ничего не помогает.
/etc/nginx/sites-available/myapp
upstream websocket{
server 0.0.0.0:8001;
}
server {
listen 80;
server_name mydomain.com;
location = /favicon.png {
access_log off;
log_not_found off;
}
location /static/ {
root /home/ubuntu/projects/my_app;
}
# WSGI
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
# ASGI
location /ws/ {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Origin "ws://mydomain.com:8001";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
}
}
/etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/projects/my_app
ExecStart=/home/ubuntu/projects/my_app/env/bin/gunicorn \
--access-logfile - \
-k uvicorn.workers.UvicornWorker \
--workers 3 \
--bind unix:/run/gunicorn.sock \
my_app.asgi:application
[Install]
WantedBy=multi-user.target
/etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
/etc/systemd/system/daphne.service
[Unit]
Description=WebSocket Daphne Service
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/projects/my_app
ExecStart=/home/ubuntu/projects/my_app/env/bin/python /home/ubuntu/projects/my_app/env/bin/daphne -b 0.0.0.0 -p 8001 my_app.asgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl status daphne.service
● daphne.service - WebSocket Daphne Service
Loaded: loaded (/etc/systemd/system/daphne.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2024-05-02 17:50:38 IST; 11s ago
Process: 803584 ExecStart=/home/ubuntu/projects/my_app/env/bin/python /home/ubuntu/projects/my_app/env/bin/daphne -b 0.0.0.0 -p 8001 my_app.asgi:application (cod>
Main PID: 803584 (code=exited, status=0/SUCCESS)
May 02 17:50:36 gold-01-0518 systemd[1]: Started WebSocket Daphne Service.
May 02 17:50:38 gold-01-0518 systemd[1]: daphne.service: Succeeded.
sudo tail -F /var/log/nginx/access.log
[02/May/2024:17:52:12 +0530] "GET / HTTP/1.0" 200 4071 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
[02/May/2024:17:52:12 +0530] "GET /ws/video/start/ HTTP/1.0" 404 2400 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
my_app/asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from features.home.routing import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings.__init__')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(URLRouter(websocket_urlpatterns)),
),
})
routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r"ws/video/start/$", consumers.VideoStartConsumer.as_asgi()),
]
Я пытаюсь настроить каналы Daphne для обработки запросов websocket, но служба Daphne автоматически останавливается через несколько секунд после запуска.
пожалуйста, проверьте правильность и последнюю версию установленного канала [daphne], а также проверьте, что вы просто добавили daphne в начало списка installed_app в settings.py