httpd:如何dynamic延迟请求转发到代理?

我有Apache httpd(2.2.22)configuration为反向代理

在这种情况下,我需要将我的Web服务器(代理请求的接收者)离线几毫秒。 在此期间,Web服务器不应收到任何请求,但我也不想拒绝任何请求。

我想要做的是以某种方式让httpd延迟这段时间的所有请求。 在步骤中:

  1. 告诉httpd延迟所有的请求,直到另行通知
  2. 停止Web服务器
  3. 启动networking服务器
  4. 继续从httpd转发请求

一个固定的延迟也可以做到这一点,但由于我无法预见Web服务器将离线的实际时间(除此之外它将不到一秒),dynamic方法将更适合。

我已经看过mod_proxy或mod_balancer如何能够帮助我,但我没有find一个明显的解决scheme。

我会很高兴你可以给我的任何指针。

编辑:

看起来像一个静态的方法就足够了。 一些有用的资源:

  • httpd ProxyPass
  • httpd ProxyTimeout
  • ProxyPass与mod_rewrite (无需明确使用ProxyPass;不需要使用ProxyPassInterpolateEnv)
  • 另请参阅这篇文章 ,讨论关于httpd返回503立即(代理和平衡器)的讨论。

替代scheme:

我们将把systemd部署到我们的服务器上。 systemd将解决我的问题,因为它可以保留在一端closures的套接字的请求。 这意味着,当我停止后端服务器很短的时间,所有的请求将排队,直到我再次启动并连接到套接字。 这就是我所说的优雅:)

ProxyPass指令接受许多参数来configuration如何处理与后端服务器的连接。

在这些参数中,您可能感兴趣的是:

  • connectiontimeout <n>Apache等待创build到后端的连接完成的秒数。
  • timeout <n>Apache等待由/发送到后端的数据的秒数。
  • ttl <n>非活动连接和关联连接池条目的生存时间,以秒为单位。

更好的解决scheme是拥有多个后端服务器,并平衡成员的负载,并使用ping参数检测离线服务器。 所以,当你重新启动一个后端服务器时,另外一个可以接受中继。

您可以使用Web服务器上的Iptables来代替Apache,以下面的方式来获取它:

  1. 将新的连接(tcp-SYN)放到networking服务器上
  2. 重新启动webserver
  3. 重新接受所有的连接

由于新连接被防火墙悄悄丢弃,反向代理将继续向networking服务器重新发送tcp-syn。 build立的连接不会受到影响。

如果周期在一秒钟内完成,则新客户端将看到(正好)1秒的延迟,等于第一次SYN重试的延迟

示例iptablesconfiguration(比如INPUT链有一个空的接受策略):

 /sbin/iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT /sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j DROP 

重新启动networking服务器后:

 /sbin/iptables -F 

您也可以将策略应用于反向代理的OUTPUT链上,但这些操作的快速同步可能会更加混乱。

一个低技术的方法,类似iptables的build议,但对客户端是完全透明的:只要停止apache与kill -stop并重新启动与kill -cont 。 根据传入数据包的数量,内核应该在短时间内缓冲所有内容。 可能这个缓冲甚至可以configuration。

如果它只是停留几毫秒,那么只需使用Apache的正常重启。 它已经有了这些属性

  • 正在进行的请求可以完成一个现有的连接
  • 新的连接将会在收听积压了一秒钟左右