2

我考虑部署高可用 Python Web 应用程序的场景:

  1. 负载均衡器 -* wsgi 服务器
  2. 负载均衡器 -* 生产 HTTP 服务器 - wsgi 服务器
  3. 生产 HTTP 服务器(具有负载平衡功能,如 Nginx)-* wsgi 服务器

对于负载均衡器,我考虑HAProxy
对于生产 HTTP 服务器,我考虑Nginx
对于wsgi 服务器,我的意思是直接处理 wsgi 应用程序(gevent、waitress、uwsgi...)的服务器
-* 表示一对多连接
- 表示一对一连接

没有可提供的静态内容。所以我想知道是否需要生产 HTTP 服务器。

  1. 每种解决方案的优缺点是什么?
  2. 对于每个场景(1-3),代替wsgi 服务器使用 wsgi 容器服务器(uWSGI、gunicorn)而不是原始 wsgi 服务器(gevent、tornado ..)有什么优势吗?
  3. 我还想知道哪种解决方案最适合 websockets 或长轮询请求?
4

2 回答 2

2

编辑:在撰写本文时,这个答案反映了uWSGInginx中 WebSocket 支持的状态(他们没有),但从那时起,他们已经越来越支持它。出于历史的兴趣,我将保留完整的答案。

1:你几乎肯定想要一个像 nginx 这样的 HTTP 反向代理来处理“勺子喂”缓慢或愚蠢的客户端程序;您的一些用户的连接速度会很慢;反向代理通常可以在联系应用程序之前等待请求被完全接收,然后快速吞下应用程序的完整响应(以便它可以转移到其他请求),然后将其反馈给客户端,速度尽可能慢他们需要。如果您仍然使用反向代理,那么也没有太多理由考虑使用 tcp 级别的负载均衡器;因为反向代理已经可以解决这个问题。尤其如此,因为 tcp 负载平衡器不支持应用程序,并且不能跳过“可访问”但“生病”的上游主机,它们会很乐意代理返回的服务器“

2:哪个应用程序容器适合您,这取决于应用程序和工作负载的形状;要利用像龙卷风这样的异步容器,您的应用程序必须以特殊方式编写;并且不能使用通常可用于 wsgi 的所有漂亮/方便的框架;另一方面,您将需要它们来实现长轮询,尤其是 websocket 等一些功能,这些功能在 uwsgi 之类的东西中是不实用的(甚至是不可能的)。

但是,并非所有容器都是平等的;许多人只说 HTTP,这不是一个 CPU 友好的协议,像 uwsgi 这样的容器旨在优化 http 解析工作,因此只有反向代理必须这样做,从那里,易于解析的二进制协议从一个进程传递到下一个。

3:websocket还是很新的,python中的支持比较少。最成熟的选项似乎是tornado 和twisted 中可用的实现;两者都不能托管在 uwsgi 中,也不能在 nginx 后面进行代理。还有其他可以处理 websocket 的反向代理,例如 varnish。

于 2013-01-03T23:06:57.850 回答
0

在这三个选项中,只有选项 1 有可能使用 websockets。Nginx 和大多数标准网络服务器不能很好地配合它们。

于 2013-01-03T23:21:01.980 回答