【问题标题】:infinite timeout for reverse proxy in ApacheApache中反向代理的无限超时
【发布时间】:2013-06-02 11:21:37
【问题描述】:

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

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

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

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

现在,我将指令修改为

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

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

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

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

【问题讨论】:

  • 嘿,我的回答对你有帮助吗?你能评论一下答案吗?

标签: apache tornado reverse-proxy long-polling


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 2017-11-24
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2023-01-27
    相关资源
    最近更新 更多