如何在Nginx服务器中配置Daphne通道

问题描述 投票:0回答:1

我有一个 Django 应用程序,可以同时处理 http 和 websocket 请求。该应用程序在本地正常运行。我已在 Nginx 服务器中配置了 Gunicorn 和 Daphne 服务,但即使未发出请求,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 状态 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)),
    ),
})

路由.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 服务在启动后几秒钟内自动停止。

python django nginx django-channels daphne
1个回答
0
投票

我也面临同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.