我有Apache httpd(2.2.22)configuration为反向代理。
在这种情况下,我需要将我的Web服务器(代理请求的接收者)离线几毫秒。 在此期间,Web服务器不应收到任何请求,但我也不想拒绝任何请求。
我想要做的是以某种方式让httpd延迟这段时间的所有请求。 在步骤中:
一个固定的延迟也可以做到这一点,但由于我无法预见Web服务器将离线的实际时间(除此之外它将不到一秒),dynamic方法将更适合。
我已经看过mod_proxy或mod_balancer如何能够帮助我,但我没有find一个明显的解决scheme。
我会很高兴你可以给我的任何指针。
编辑:
看起来像一个静态的方法就足够了。 一些有用的资源:
替代scheme:
我们将把systemd部署到我们的服务器上。 systemd将解决我的问题,因为它可以保留在一端closures的套接字的请求。 这意味着,当我停止后端服务器很短的时间,所有的请求将排队,直到我再次启动并连接到套接字。 这就是我所说的优雅:)
ProxyPass指令接受许多参数来configuration如何处理与后端服务器的连接。
在这些参数中,您可能感兴趣的是:
connectiontimeout <n> : Apache等待创build到后端的连接完成的秒数。 timeout <n> : Apache等待由/发送到后端的数据的秒数。 ttl <n> : 非活动连接和关联连接池条目的生存时间,以秒为单位。 更好的解决scheme是拥有多个后端服务器,并平衡成员的负载,并使用ping参数检测离线服务器。 所以,当你重新启动一个后端服务器时,另外一个可以接受中继。
您可以使用Web服务器上的Iptables来代替Apache,以下面的方式来获取它:
由于新连接被防火墙悄悄丢弃,反向代理将继续向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的正常重启。 它已经有了这些属性