如何在仍然使用 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 连接异常?