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.com
和http2.example.com
。
所有这三个服务器都使用Debian Etch作为操作系统,所有这三个系统都安装了Debian的Apache2(版本为2.2.3,默认情况下是mod_proxy_balancer
)。 在http1.example.com
和http2.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.com
和http2.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
行中的路由值必须是我们在重写规则中设置的相应值( http1
或http2
)。 stickysession
和route
值负责处理mod_proxy_balancer
的正确会话。
同样重要的是,您有与您的BalancerMember
行(每个BalancerMember
一个ProxyPassReverse
行)一样多的ProxyPassReverse
行。
ProxyPass /平衡器管理器!
行确保对www.example.com/balancer-manager
的请求不会路由到后端服务器。
您可以在http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass和http://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.com
或http://example.com
。 在这两种情况下,您都应该看到phpBB2论坛,由后端服务器(您看不到,您应该始终拥有www.example.com
或浏览器地址栏中的example.com
)提供。
两台浏览器中的页面都可能由相同的后端服务器传送 - 如果是这样,请删除浏览器中的Cookie或打开另一个浏览器(Opera,Seamonkey,...),然后重试,直到看到您的两个不同的浏览器来自不同的后端服务器(我可以看到它,因为我更改了标题,如第1章所述)。 然后使用您之前创建的两个不同用户(例如falko
和until
)登录,并使用这两个不同的用户浏览论坛。 在我的情况下, falko
的内容总是由http1.example.com提供
:
而直到
内容来自http2.example.com
:
所以会话由mod_proxy_balancer正确
处理!
5平衡机经理
将您的浏览器引导
至http://www.example.com/balancer-manager
或http://example.com/balancer-manager
。 系统将提示您输入用户名和密码(您在第3章中创建的用户名和密码)。
登录后,您将看到一个用于管理负载均衡器的简单Web界面:
您可以在http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypass上找到可能的配置选项的概述 。
6链接
- Apache: http : //httpd.apache.org
- mod_proxy: http : //httpd.apache.org/docs/2.2/mod/mod_proxy.html
- mod_proxy_balancer: http : //httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html
- Apache mod_proxy与PHP粘性会话平衡 : http : //www.markround.com/archives/33-Apache-mod_proxy-balancing-with-PHP-sticky-sessions.html
- Debian: http : //www.debian.org