Apache 作为负载均衡器 – 强制中断持久连接

Apache 作为负载均衡器 – 强制中断持久连接

mod_proxy我通过和使用 Apache 2.2 设置了一个负载平衡器mod_proxy_balancer。负载平衡工作正常,但有一种情况我找不到任何配置选项,即在使用与后端服务器的持久连接时,当其中一个服务器死机(关闭、崩溃等)时,与它的现有连接仍会尝试访问它。

有没有办法配置 apache 负载均衡器,使其退出或重新创建与死机后端服务器的连接?在 LVS 世界中,Ldirector 在 Proc FS 下有一个选项可以控制这一点:

/proc/sys/net/ipv4/vs/expire_quiescent_template

当设置此项时,持久会话/连接或死亡的后端服务器将被刷新,以便在下一个客户端请求时可以重新创建它们。

Apache 世界中是否存在类似的东西?

PS Apache 以什么方式检查后端服务器的状态?它是否尝试连接到某个端口或类似的东西?如果有人能对此进行解释那就太好了!

这是我的虚拟主机配置文件:

服务器管理员[电子邮件保护] 服务器名称 myapp.mysite.com

DocumentRoot /srv/www/vhosts/myapp.mysite.com

ErrorLog /var/log/apache2/myapp.mysite.com-error_log
CustomLog /var/log/apache2/myapp.mysite.com-access_log combined

HostnameLookups Off
UseCanonicalName Off
ServerSignature On
ScriptAlias /cgi-bin/ "/srv/www/vhosts/myapp.mysite.com/cgi-bin/"

<Location /balancer-manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    Allow from all
</Location>

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from bmf.intern.netz
</Location>

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://myapp>
    BalancerMember http://172.22.1.133:777/ loadfactor=10 route=1 connectiontimeout=200ms
    BalancerMember http://172.22.1.134:777/ loadfactor=10 route=2 connectiontimeout=200ms
    ProxySet stickysession=ROUTEID
    ProxySet lbmethod=byrequests
</Proxy>

ProxyPass /balancer-manager !
ProxyPass /server-status !
ProxyPass / balancer://myapp/ lbmethod=byrequests
ProxyPassReverse / balancer://myapp/

<Directory "/srv/www/vhosts/myapp.mysite.com/cgi-bin">
    AllowOverride None
    Options +ExecCGI -Includes
    Order allow,deny
    Allow from all
</Directory>

<IfModule mod_userdir.c>
    UserDir public_html
    Include /etc/apache2/mod_userdir.conf
</IfModule>


#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory "/srv/www/vhosts/myapp.mysite.com">

    Options Indexes FollowSymLinks
    AllowOverride None

    Order allow,deny
    Allow from all

</Directory>

答案1

如果你将 mod_proxy 切换为使用 ajp13 连接(我认为需要 Java 后端),你也许能够实现会话粘性

我认为您正在寻找的“过期”选项存在于HAProxy

option redispatch no option redispatch 在连接失败的情况下启用或禁用会话重新分配 可用于以下部分:默认 | 前端 | 监听 | 后端 是 | 否 | 是 | 是 参数:无

在 HTTP 模式下,如果 cookie 指定的服务器宕机了,客户端肯定会坚持使用该服务器,因为它们无法刷新 cookie,所以它们将无法再访问该服务。

指定“选项重新分派”将允许代理打破其
持久性并将其重新分配到工作服务器。

它还允许在多次连接失败的情况下重试与另一台服务器的最后一次连接。当然,它要求将“重试”设置为非零值。

此形式是首选形式,它取代了“redispatch”和“redisp”关键字。

如果已在“默认”部分启用此选项,则可以在特定实例中通过在其前面添加“no”关键字来禁用它。

另请参阅:“重新分派”、“重试”、“强制持久”

相关内容