9

我在apache后面运行龙卷风。我已经创建了代理服务器。

ProxyRequests On
ProxyPass /chat/ http://localhost:8888/chat/

此代码运行良好,并将我的所有请求传递给龙卷风并将响应返回给客户端。

现在,我正在使用龙卷风进行长轮询。一些在短时间内完成的请求说不到 1 分钟,这个反向代理工作正常。但是某些长轮询请求会产生 502 代理错误。这个代理错误的原因是 Apache 可以保持一分钟的长轮询请求(默认情况下)。它关闭请求,因此收到代理错误。

现在,我将指令修改为

ProxyRequests On
ProxyPass /chat/ http://localhost:8888/chat/ timeout=12000

即我将默认超时更改为 12000 秒。

这对我来说目前工作正常。但这不是解决问题的最佳方法。理想情况下,长轮询请求可以超过指定的任何超时。所以我的问题是

  1. 如何使超时无限?即请求永远不会被 Apache 关闭。
  2. 还请评论:通过Apache作为代理服务器是否会降低tornado的性能?
4

1 回答 1

2

我在 Nginx 上遇到了类似的问题,并以与您相同的方式解决了它。但是我将超时更改为 1 天,因为在我的情况下它已经足够大了。

我认为你不能取消这一点。这背后的基本原理是 Apache(或与此相关的任何代理服务器)必须保持其性能,如果它必须保持陈旧或不活动的连接,它显然不能。你宁愿让你的代理服务器代理更多的活动连接而不是非活动连接。

因此,在 Apache 甚至 Nginx 中(使用 proxy_read_timeout 配置)都没有办法关闭 ProxyTimeout。因此,如果您的代理服务器在超时时间内没有发送任何响应,那么您的应用程序服务器响应时间过长或者您的应用程序服务器出现问题,或者客户端没有请求任何响应。在第一种情况下,您可以进行安全估计以设置适当的超时。在第二种情况下,您需要修复您的应用程序服务器。在第三种情况下,您必须优雅地处理客户端上的情况并在需要时重新连接。

谈到第二个问题,除了 Apache 和 Tornado 服务器之间的延迟之外,应该没有任何区别。您可以很好地将您的 Tornado 服务器直接暴露给世界,但这会带来一些挑战: 1. 更多操作工作 - 确保 Tornado 进程始终启动并运行。2. 代理和负载均衡将变得更加困难。3. 更糟糕的安全性,因为您编写了代码而不是成千上万的专家贡献者。因此,您不应该考虑以 root 身份运行此服务器。但是你仍然可以安全地使用 Apache 或 Nginx 做同样的事情。

当然上述问题是可以解决的,但为什么要解决一个已经解决的问题。:)

于 2014-06-29T20:48:11.903 回答