HA部署为Python wsgi应用程序

我考虑部署高可用性Python Web应用程序的情况:

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

对于负载平衡器,我考虑HAProxy
对于生产HTTP服务器,我考虑Nginx
对于wsgi服务器,我的意思是直接处理wsgi应用程序(gevent,女服务员,uwsgi …)
– *表示一对多连接
– 意味着一对一的连接

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

  1. 每个解决scheme的优缺点是什么?
  2. 对于每个场景(1-3),取代wsgi服务器是否有使用wsgi容器服务器(uWSGI,gunicorn),而不是原始的wsgi服务器(gevent,龙卷风)的优势?
  3. 我也想知道哪个解决scheme最适合websockets或长时间轮询请求?

编辑:在写作的时候,这个答案反映了UWSGI和Nginx (他们没有)WebSocket支持的状态,但从那时起,他们已经增长了对它的支持。 为了历史的利益,我会留下完整的答案。

1:你几乎可以肯定需要像nginx这样的HTTP反向代理来处理“勺子喂食”慢或者愚蠢的客户端程序; 你的一些用户会连接速度慢; 反向代理通常可以在联系应用程序之前等待请求被完全接收,然后快速从应用程序中啜泣(这样它就可以转移到其他请求),然后反馈给客户端他们需要。 如果你反正使用反向代理,也没有太多的理由考虑一个tcp级别的负载均衡器。 因为反向代理已经可以解决这个问题。 这是特别真实的,因为tcp负载平衡器不是应用程序感知的,并且不能跳过“可达”但“不舒服”的上游主机,他们将愉快地代理正在返回对健康检查“500内部服务器错误”要求。 他们通常只需要在网络的极端高负载的情况下。

2:哪个应用程序容器适合您,取决于您的工作负载的形式; 为了利用像龙卷风这样的异步容器,你的应用程序必须以特殊的方式写入; 一般来说不能使用所有可用于wsgi的nice / convenient框架; 另一方面,你将需要他们的一些功能,如长轮询,特别是websocket,这些功能是不实际(甚至可能)在uwsgi的东西。

并不是所有的容器都是平等的; 许多人只会说HTTP,这不是一个CPU友好的协议,像uwsgi这样的容器被设计为优化http解析工作,以便只有反向代理才能做到这一点,从那里,容易解析的二进制协议从一个进程传递到下一个。

3:websocket还是很新的,在python中的支持很少。 最成熟的选择似乎是在龙卷风和扭曲的可用实现; 既不能在uwsgi中托管,也不能在nginx后面代理。 还有其他反向代理可以处理websocket,但是,例如,清漆。

在这三个选项中,只有选项1有任何使用websocket的机会。 Nginx,以及大多数标准的网络服务器将无法与他们打好。