Проблема соединения WebSocket с каналами Django в Gunicorn
Я пытался реализовать чат с помощью Django Channels и Daphne. Он отлично работает на моем локальном сервере, но теперь я хочу реализовать его в продакшене, используя Gunicorn, nginx. Однако, когда я перезагружаю и запускаю nginx, я получаю ошибку (как показано на изображении ниже) в сервисе. Я попробовал изменить свои службы, но это все еще не работает. Я не могу понять причину, так как нет конкретной ошибки. Я читал некоторую документацию, нужно ли мне делать миграции? Любые идеи будут очень признательны.
вот что я пробовал
Служебный Гуникорн
[Unit]
Description=Tris application daemon services
Requires=tev.socket
After=network.target
[Service]
User=dswdcaraga
Group=www-data
WorkingDirectory=/opt/apps/tev
Environment=DJANGO_SETTINGS_MODULE=tev.settings
ExecStart=/opt/apps/env/bin/daphne -u /run/tev/tev.sock tev.asgi:application --bind 0.0.0.0:8000
[Install]
WantedBy=multi-user.target
Nginx
server {
server_name caraga-tris-staging.dswd.gov.ph;
listen 80;
return 301 https://caraga-tris-staging.dswd.gov.ph$request_uri;
}
server {
server_name caraga-tris-staging.dswd.gov.ph;
listen 443 ssl;
#ssl_certificate /etc/ssl/certs/caraga/server-cer.pem;
#ssl_certificate_key /etc/ssl/certs/caraga/server-key.key;
ssl_certificate /etc/ssl/certs/caraga/ssl_nginx/server-cer.pem;
ssl_certificate_key /etc/ssl/certs/caraga/ssl_nginx/server-key.key;
location / {
include proxy_params;
proxy_pass http://unix:/run/tev/tev.sock;
#WebSocket support
proxy_http_version 1.1;
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_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;
asgi.py configuration
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
#from django.core.asgi import get_asgi_application
from channels.auth import AuthMiddlewareStack
from main import routing
import main.routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tev.settings')
django.setup()
django_asgi_app = get_asgi_application()
#application = get_asgi_application()
application = ProtocolTypeRouter({
#"http": get_asgi_application(),
"http": django_asgi_app,
"websocket": URLRouter(
main.routing.websocket_urlpatterns
)
})
Вам просто нужно переместить эти строки в верхнюю часть файла asgi.py.
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings")
import django
django.setup()
и не забудьте направить сокеты в вашем nginx
сервисе на /ws url:
location /ws/ {
proxy_pass http://unix:/run/daphne/daphne.sock;
proxy_http_version 1.1;
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-Proto $scheme;
}