用于 Python wsgi 应用程序的 HA 部署
Posted
技术标签:
【中文标题】用于 Python wsgi 应用程序的 HA 部署【英文标题】:HA deploy for Python wsgi application 【发布时间】:2012-12-18 06:45:59 【问题描述】:我认为部署高可用 Python Web 应用的场景如下:
-
负载平衡器 -* wsgi 服务器
负载平衡器 -* 生产 HTTP 服务器 - wsgi 服务器
生产 HTTP 服务器(具有负载平衡功能,如 nginx)-* wsgi 服务器
对于负载均衡器,我考虑 HAProxy 对于生产 HTTP 服务器,我考虑 Nginx 对于 wsgi 服务器,我的意思是直接处理 wsgi 应用程序的服务器(gevent、waitress、uwsgi...) -* 表示一对多连接 - 表示一对一连接
没有可提供的静态内容。所以我想知道是否需要生产 HTTP 服务器。
-
每种解决方案的优缺点是什么?
对于每个场景 (1-3),代替 wsgi 服务器 使用 wsgi 容器服务器(uWSGI、gunicorn)而不是原始 wsgi 服务器(gevent、tornado..)是否有任何优势?
我还想知道哪种解决方案最适合 websocket 或长轮询请求?
【问题讨论】:
【参考方案1】:编辑: 在撰写本文时,此答案反映了 uWSGI 和 nginx 中 WebSocket 支持的状态(他们没有),但从那时起,他们已经越来越支持它。出于历史的兴趣,我将保留完整的答案。
1:您几乎肯定想要一个像 nginx 这样的 HTTP 反向代理来处理“勺子喂食”缓慢或愚蠢的客户端程序;您的一些用户的连接速度会很慢;反向代理通常可以在联系应用程序之前等待请求被完全接收,然后快速吞下应用程序的完整响应(以便它可以转移到其他请求),然后将其反馈给客户端,速度尽可能慢他们需要。如果您仍然使用反向代理,那么也没有太多理由考虑使用 tcp 级别的负载均衡器;因为反向代理已经可以解决这个问题。尤其如此,因为 tcp 负载均衡器不是应用程序感知的,并且不能跳过“可访问”但“生病”的上游主机,它们会很乐意代理返回“500 内部服务器错误”响应到健康检查的服务器要求。它们通常仅在负载非常高的网络的极端边缘才需要。
2:哪个应用程序容器适合您,这取决于应用程序和工作负载的形状;要利用像龙卷风这样的异步容器,您的应用程序必须以特殊方式编写;并且不能使用通常可用于 wsgi 的所有漂亮/方便的框架;另一方面,对于长轮询,尤其是 websocket 等一些功能,您将需要它们,这些功能在 uwsgi 之类的东西中是不实用的(甚至是不可能的)。
但是,并不是所有的容器都是一样的;许多人只说 HTTP,这不是一个 CPU 友好的协议,像 uwsgi 这样的容器旨在优化 http 解析工作,以便 只有 反向代理必须这样做,从那里开始,易于解析的二进制协议从一个进程传递到下一个进程。
3:websocket 还是很新的,python 中的支持很少。最成熟的选项似乎是tornado 和twisted 中可用的实现;两者都不能托管在 uwsgi 中,也不能在 nginx 后面进行代理。还有其他可以处理 websocket 的反向代理,例如 varnish。
【讨论】:
广告。 2. 我理解同步和异步编程的区别。问题是关于使用容器(如 gunicorn + tornado workers )而不是单独的 wsgi 服务器(tornado) 单独的 wsgi 服务器无一例外地对任何类型的异步处理都没有用处;您不能将它们用于 websocket,它们不太适合长轮询。 很抱歉我的误导,但我总是为每个场景考虑一些负载均衡器服务器(nginx / haproxy)。所以单独的 wsgi 服务器并不孤单。所以问题是:是否值得拥有例如:nginx -* gunicorn + tornado worker
,而不是nginx -* tornado
。感谢您的参与!
nginx 和 uwsgi 都对 websocket 没有帮助!要将 websocket 服务放在与两者相同的端口后面,需要一个 辅助 反向代理,它可以区分 websocket 应用程序的流量和 http/1.1 流量。 Varnish 可以做到这一点,但它在其他方面不如 nginx 通用:它不能说 fastcgi/scgi/uwsgi 并且它不能提供静态文件:你可能需要所有 Varnish、Nginx、Tornado 和 uWSGI。 【参考方案2】:
在三个选项中,只有选项 1 有可能使用 websockets。 Nginx 和大多数标准网络服务器不能很好地配合它们。
【讨论】:
谢谢。虽然这只是我 3. 问题的答案。以上是关于用于 Python wsgi 应用程序的 HA 部署的主要内容,如果未能解决你的问题,请参考以下文章
哪个简单的基于 python 的 WSGI 兼容 jsonrpc 库在服务器端用于“睡衣”?
如何在Ubuntu中将mod_wsgi安装到特定的python版本?