如何在仍然使用 WebSocket 的同时运行 Gunicorn

Posted

技术标签:

【中文标题】如何在仍然使用 WebSocket 的同时运行 Gunicorn【英文标题】:How to run Gunicorn while still using WebSocket 【发布时间】:2020-01-30 02:07:47 【问题描述】:

所以我在这个 python 聊天应用项目中使用了一个 docker。

我最初在 docker-compose 中使用 python manage.py runserver 0.0.0.0:8000 作为我的命令。

我发现如果我想在 web 上部署我的应用程序(比如 heroku),我应该切换到 gunicorn。我发现的教程说只需将 docker-compose 中的命令更改为gunicorn myproject.wsgi -b 0.0.0.0:8000。我这样做了,所有的 websocket 连接都断开了。由于 websocket 仍处于 CONNECTING 状态,发送失败,然后握手失败,状态码为 404。所有设置都与以前相同,除了一行。只是想知道我还需要更改什么才能使 websocket 与 gunicorn 一起工作?谢谢

编辑:在互联网上进行一些挖掘之后,gunicorn 似乎不应该与 websocket 一起运行(我想是 wsgi asgi 的区别?)如果有人能告诉我一些我可以使用的东西,而不是 gunicorn 用于网络服务器,那就是非常感谢,或者如果我有什么方法可以在我的 django 频道仍然工作的情况下运行 gunicorn?谢谢!!

【问题讨论】:

【参考方案1】:

在使用 ASGI 时,对于异步服务器 (websockets),您应该使用异步服务器,例如 Daphne 或 Uvicorn,Django documentation 提供了如何部署它们的示例。

如果你想直接使用 uvicorn,你可以这样做:

uvicorn myproject.asgi:application --host 0.0.0.0 --port 8000

您还可以使用工人类通过 gunicorn 运行 uvicorn:

gunicorn myproject.asgi:application -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000

【讨论】:

以上是关于如何在仍然使用 WebSocket 的同时运行 Gunicorn的主要内容,如果未能解决你的问题,请参考以下文章

websocket 升级是不是仍然允许 http ajax 请求?

如何在仍然运行 HTML 验证(最小长度、最大长度、模式...)的同时使用 JavaScript 提交表单

如何使用 Amphp 捕获 php websocket 断开的 TCP 连接异常?

使用 Google Cloud Platform 运行 Websocket

如何在仍然使用 Dagger2 的同时解决循环依赖?

websocket 和 websocket-client,如何同时使用?