我有一个 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 服务在启动后几秒钟内自动停止。
我也面临同样的问题