同时运行Django的UWSGI和ASGI服务

17

我目前正在运行一个Django(2.0.2)服务器,使用uWSGI并有10个工作进程。

我正在尝试实现实时聊天,并查看了Channel。文档提到服务器需要使用Daphne运行,而Daphne需要名为ASGI的UWSGI的异步版本。

我成功安装和设置了ASGI,然后使用daphne运行服务器,但只有一个工作进程(据我所知,这是ASGI的限制),但负载过高。

是否可以使用10个工作进程的uWSGI运行服务器以响应HTTP / HTTPS请求,并使用ASGI / Daphne处理WS / WSS(WebSocket)请求? 或者也许可以运行多个ASGI实例?


2
如果您使用像nginx这样的负载均衡器/代理服务器,您可以根据它们的URL或Upgrade标头将请求路由到uWSGI或Daphne。请参见http://channels.readthedocs.io/en/1.x/deploying.html#running-asgi-alongside-wsgi - yofee
文档讨论了“在WSGI旁边运行ASGI”(我想要的),但是没有关于如何使用“Upgrade: WebSocket”实现此负载均衡器的示例代码。是否可以提供更多精确的信息和一些示例? - Buky
@yofee 你能看一下这个类似的问题吗? - shaik moeed
1个回答

27

在这里可以同时运行WSGI和ASGI,以下是一个Nginx配置的示例:

server {
    listen 80; 

    server_name {{ server_name }};
    charset utf-8;


    location /static {
        alias {{ static_root }};
    }

    # this is the endpoint of the channels routing
    location /ws/ {
        proxy_pass http://localhost:8089; # daphne (ASGI) listening on port 8089
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location / {
        proxy_pass http://localhost:8088; # gunicorn (WSGI) listening on port 8088
        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_connect_timeout 75s;
        proxy_read_timeout 300s;
        client_max_body_size 50m;
    }
}

为了正确使用 /ws/,你需要像这样输入你的 URL:

ws://localhost/ws/your_path

那么nginx将能够升级连接。


这个设置中的会话是否是共享的? - Diego Gallegos
是的,它们是共享的。 - Kim Desrosiers
你确定吗?这对我来说似乎意味着你最终将运行两个应用程序实例,一个由Daphne,另一个由gunicorn。 - itsafire
2
会话通常存储在数据库或其他共享位置中。 - Manel Clos
1
我们可以在Apache中实现吗? - shaik moeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接