Apache:使用mod_proxy_balancer(Debian Etch)创建一个会话感知的负载均衡器

Apache:使用mod_proxy_balancer(Debian Etch)创建一个会话感知负载均衡器

版本1.0
作者:Falko Timme

由于Apache 2.1,一个名为mod_proxy_balancer的新模块是可用的,可让您将具有Apache安装的系统转换为负载均衡器。 此负载平衡器从两个或更多后端Web服务器检索请求的页面,并将其传递到用户的计算机。 用户得到的印象是,他们只处理一个服务器(负载均衡器),实际上负载均衡器后面有多个系统来处理用户的请求。 通过使用负载均衡器,您可以降低Web服务器的负载平均值。 mod_proxy_balancer的一个重要功能是可以跟踪会话,这意味着单个用户总是处理同一个后端Web服务器。 大多数网站现在都是数据库驱动的用户登录等等,如果用户在一个后端网络服务器上登录,然后他的下一个请求将转到另一个后端网络服务器,这意味着他会再次注销。 您可以通过使用mod_proxy_balancer的会话感知来避免这种情况。

我不会保证这将为您工作!

1初步说明

应该注意的是,负载均衡器可以降低您的后端Web服务器的负载,但它不提供高可用性(只要您只使用一个负载均衡器)! 单个负载均衡器是单点故障(SPOF)。 如果您需要高可用性,则应至少使用两个负载平衡器(例如一个作为热备用)。

在这个例子中我将使用三个服务器:一个负载均衡器,地址为www.example.com / example.com ,两个后端服务器的地址为http1.example.comhttp2.example.com

所有这三个服务器都使用Debian Etch作为操作系统,所有这三个系统都安装了Debian的Apache2(版本为2.2.3,默认情况下是mod_proxy_balancer )。 在http1.example.comhttp2.example.com上,我已经安装了一个数据库驱动的Web应用程序: phpBB2 ,一个着名的论坛软件。 两个phpBB2安装是相同的,并使用相同的数据库。 为了进行调试,我在这两个安装中内置了一个小小的区别:如果该页面由http1.example.com提供 ,则在标题中显示http1.example.com

如果由http2.example.com传送 ,则会显示http2.example.com

这样我可以通过mod_proxy_balancer控制会话是否正确处理。 当然,在生产系统上,两个页面都是一样的。

会话跟踪在mod_proxy_balancer中有点棘手,因为它需要一定的cookie格式,会话变量的名称可能因应用程序而异。 幸运的是,我发现这个页面: http : //www.markround.com/archives/33-Apache-mod_proxy-balancing-with-PHP-sticky-sessions.html它有一个伟大和容易的解决这个问题,我'在这里使用。

2准备后端服务器

首先,我们必须准备我们的后端Web 服务器http1.example.comhttp2.example.com 。 我们启用这样的mod_rewrite

http1.example.com / http2.example.com:

a2enmod rewrite
/etc/init.d/apache2 force-reload

然后,我们在http1.example.com上打开我们的phpBB2站点的Apache vhost配置,并添加以下行:

http1.example.com:

[...]
RewriteEngine On
RewriteRule .* - [CO=BALANCEID:balancer.http1:.example.com]
[...]

(确保您根据需要替换http1.example.com !)

之后重新启动Apache:

http1.example.com:

/etc/init.d/apache2 restart

现在我们在http2.example.com上执行相同操作

http2.example.com:

[...]
RewriteEngine On
RewriteRule .* - [CO=BALANCEID:balancer.http2:.example.com]
[...]

(确保您根据需要替换http2.example.com !)

之后重新启动Apache:

http2.example.com:

/etc/init.d/apache2 restart

这就是我们必须在后端服务器上进行配置。

3配置负载均衡器

在我们的负载平衡器www.example.com上,我们必须启用几个Apache模块:

www.example.com:

a2enmod proxy
a2enmod proxy_balancer
a2enmod proxy_http
a2enmod status

然后重新启动Apache:

/etc/init.d/apache2 force-reload

我假设我们不会在负载均衡器上运行任何其他网站,所以我们可以使用Debian的默认文档root / var / www作为负载均衡器。

mod_proxy_balancer带有一个“平衡器管理器”,一个小型的Web界面,您可以在其中调整几个设置。 我们为其创建目录/ var / www / balancer-manager ,这是我们的密码保护,以便只有我们可以访问它:

mkdir /var/www/balancer-manager
htpasswd -c /var/.htpasswd admin

(您可以使用您喜欢的任何用户名替换admin 。)

vi /var/www/balancer-manager/.htaccess
AuthType Basic
AuthName "Members Only"
AuthUserFile /var/.htpasswd
<limit GET PUT POST>
require valid-user
</limit>

现在我们来到负载均衡器的vhost配置。 Apache在Debian Etch上的默认vhost配置位于/ etc / apache2 / sites-available / default中 ,所以我们用自己的配置替换它:

cp /etc/apache2/sites-available/default /etc/apache2/sites-available/default_orig
cat /dev/null > /etc/apache2/sites-available/default
vi /etc/apache2/sites-available/default
NameVirtualHost *
<VirtualHost *>
        ServerName www.example.com
        ServerAlias example.com
        DocumentRoot /var/www/
        ProxyRequests Off

        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>

        ProxyPass /balancer-manager !
        ProxyPass / balancer://mycluster/ stickysession=BALANCEID nofailover=On
        ProxyPassReverse / http://http1.example.com/
        ProxyPassReverse / http://http2.example.com/
        <Proxy balancer://mycluster>
          BalancerMember http://http1.example.com  route=http1
          BalancerMember http://http2.example.com  route=http2
          ProxySet lbmethod=byrequests
        </Proxy>

        <Location /balancer-manager>
          SetHandler balancer-manager

          Order deny,allow
          Allow from all
        </Location>
</VirtualHost>

这是非常重要的,您设置所有斜杠(/)如此示例所示,特别是尾部斜杠!

请确保stickysession的值是第2章重写规则中的cookie( BALANCEID )的名称。另外, BalancerMember行中的路由值必须是我们在重写规则中设置的相应值( http1http2 )。 stickysessionroute值负责处理mod_proxy_balancer的正确会话。

同样重要的是,您有与您的BalancerMember行(每个BalancerMember一个ProxyPassReverse行)一样多的ProxyPassReverse行。

ProxyPass /平衡器管理器! 行确保对www.example.com/balancer-manager的请求不会路由到后端服务器。

您可以在http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypasshttp://httpd.apache.org/docs/2.2上找到有关所有设置和进一步微调选项的更多详细信息/mod/mod_proxy_balancer.html

现在我们已经完成了配置,我们必须重新启动Apache:

/etc/init.d/apache2 restart

4测试我们的设置

我们的设置现在可以使用了。 要测试会话是否正确处理,我打开两个不同的浏览器(因为cookies),例如Firefox和Internet Explorer,然后访问http://www.example.comhttp://example.com 。 在这两种情况下,您都应该看到phpBB2论坛,由后端服务器(您看不到,您应该始终拥有www.example.com或浏览器地址栏中的example.com )提供。

两台浏览器中的页面都可能由相同的后端服务器传送 - 如果是这样,请删除浏览器中的Cookie或打开另一个浏览器(Opera,Seamonkey,...),然后重试,直到看到您的两个不同的浏览器来自不同的后端服务器(我可以看到它,因为我更改了标题,如第1章所述)。 然后使用您之前创建的两个不同用户(例如falkountil )登录,并使用这两个不同的用户浏览论坛。 在我的情况下, falko的内容总是由http1.example.com提供

直到内容来自http2.example.com

所以会话由mod_proxy_balancer正确处理!

5平衡机经理

将您的浏览器引导http://www.example.com/balancer-managerhttp://example.com/balancer-manager 。 系统将提示您输入用户名和密码(您在第3章中创建的用户名和密码)。

登录后,您将看到一个用于管理负载均衡器的简单Web界面:

您可以在http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass上找到可能的配置选项的概述

6链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏