代码之家  ›  专栏  ›  技术社区  ›  Aashutosh Prajapati

如何接受部署在vercel上的NextJS应用程序的websocket连接。在Django项目中,使用nginx和gunicorn部署在Ubuntu VPS上

  •  0
  • Aashutosh Prajapati  · 技术社区  · 3 年前

    我的django和nextjs的开发版本运行良好,但当我在vercel上部署nextjs项目,在ubuntu vps上部署django项目时,它不起作用!

    我的django项目使用django通道与前端进行内部通信,并通过websocket发送消息。

    这是我的nginx文件:

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
    
        ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
        ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
        server_name _;
    
        location = /favicon.ico { access_log off; log_not_found off; }
        location /static/ {
            root /home/ubuntu/projectdir;
        }
    
        location / {
            include proxy_params;
            proxy_pass http://unix:/run/gunicorn.sock;
        }
        location /ws {
    
            proxy_pass http://localhost;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
    }
    

    这是我的gunicorn.service文件

    [Unit]
    Description=gunicorn daemon
    Requires=gunicorn.socket
    After=network.target
    
    [Service]
    User=ubuntu
    Group=www-data
    WorkingDirectory=/home/ubuntu/projectdir
    ExecStart=/home/ubuntu/env/bin/gunicorn 
    --access-logfile - 
    --workers 4 
    --bind unix:/run/gunicorn.sock 
    --worker-class=geventwebsocket.gunicorn.workers.GeventWebSocketWorker 
    chatterboxBackend.wsgi:application
    
    [Install]
    WantedBy=multi-user.target
    

    这是我的routing.py文件:

    from django.urls import re_path
    
    from . import consumers
    
    websocket_urlpatterns = [
    re_path(r"^ws/message/(?P<room_name>w+)/$", consumers.ChatConsumer.as_asgi()),
    
    ]
    

    这是我项目的.asgi文件

    import os
    
    from channels.auth import AuthMiddlewareStack
    from channels.routing import ProtocolTypeRouter, URLRouter
    from channels.security.websocket import AllowedHostsOriginValidator
    from django.core.asgi import get_asgi_application
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "chatterboxBackend.settings")
    django_asgi_app = get_asgi_application()
    
    import message.routing
    
    application = ProtocolTypeRouter(
        {
            "http": django_asgi_app,
            "websocket": AllowedHostsOriginValidator(
                AuthMiddlewareStack(URLRouter(message.routing.websocket_urlpatterns))
            ),
        }
    )
    
    

    起初,当我尝试使用JavaScript连接到后端websocket时, 上面写着:连接失败。。。 但是,当我用命令行启动gunikorn服务器时,gunikor日志显示“未找到/ws/message/”

    我向ChatGPT和其他工具询问了这个问题,但它仍然不起作用。。。。

    0 回复  |  直到 3 年前