负载平衡(3)–CentOS 5 之 Apache

负载平衡(1)中的构想是,3台Server,一个作为LoadBalance的Nginx,将请求转发给另外两台Server。不过这次并不适合我们。因为三台机器并不是在物理上一个局域网上,数据传输依然是使用WAN,所以这种阵列并不一定能解决负荷问题。

于是重新考虑布局。首先,决定这次使用DNSラウンドロビン(Round robin DNS)来实现轮叫调度,基本原理就是将一个域名解析到多个IP地址,这样每次访问的时候就会返回多个IP地址,会选择第一个IP作为返回地址。当然,这个负载平衡有一些局限性,一方面并不是完全均衡,是针对每个域名服务器的,有些域名服务器访问的机器明显比其他多,也不能分给其他IP,另外一方面会有一定的缓存影响,使得在一定时间内对于同一域名服务器,返回的地址都是相同。如果一台机器坏了,既是修改了域名解析,因为延时的原因,也会在一段时间返回瘫痪的机器给客户端。

不过话说回来,它还是适合我们的。一来他的平衡来自域名解析阶段,所以我们的机器都在WAN上,也不会受影响。另外,预想的用户相当庞大和平均,也不会出现某几台机器负荷过大的情况。

那么首先把昨天的推倒重来。这次准备先将三台中的一个较弱的(Intel Xeon E5520 @ 2.27GHz * 16 内存32G)作为我们的图片服务器(Nginx),svn服务器,rsync源文件管理服务器,后台管理网站的服务器(apache)。另外两台组成Round Robin DNS。今后如果需要增加Web Server,也可以很容易加入Round Robin DNS.

安装图片服务器(xxx.xx.xx.29)

之所以选在Ngix 0.8.53,因为在巨量静态访问响应上,它占用的资源要远远小于Apache。安装过程如昨日。另外这台机器还要作为后台管理网站的服务器,所以还是需要安装Apache的。之所以没有直接选用Ngix 的Fast CGI,主要还是考虑到,后台管理网站的负载不会很高,更多要求的是稳定性和扩张性。而这次后台还准备使用Symfony 1.4框架。综合考虑使用Ngix转发模式,把PHP请求转发给8080端口的Apache。

为了把Apache的DocumentRoot移到home底下(因为硬盘是home所在盘为1T,其他都较小),足足花了我2小时。

事情是这样的,按照Apache的httpd.conf的清晰说明,很容易地把原来的/var/www/html改为 /home/xxxx/vhdocs。可结果就一直是403 Forbidden画面。

网上说了各种可能,包括SELinux的设置种种都考虑了。权限也是设得不能再大。还是不行。当然我也知道,把Aapche的http.conf的启动User/Group改为那个/home/xxx的User是可以正常访问的。可是谁都知道这种丑陋的改发只是在回避问题。在最后,自己精疲力竭的时候,发现日本的一个网站做出了最好得解释。原来adduser的用户的/home/xxx目录竟然是770的,改成775就立马解决问题了。不过其实很早就知道这个信息“http.conf中设定用户必须能够访问DocumentRoot的从根目录开始的所有目录”,稍微想想,就不难得到775的结论。

Ngix和Apache的转发设定很简单(注意第二行,因为我的后台apache是有两个virtualhost的,所以要把header传过去

location ~ \.php$ {
proxy_pass   http://127.0.0.1:8080;
proxy_set_header Host $host;
}

安装Web服务器(xxx.xx.xx.30 xxx.xx.xx.31)

接着把其他两台的Apache也如法炮制就可以了。

设定Rsync

考虑到多台Web Server,更新程序会比较麻烦。故考虑在29上,建立一个svn client,将svn的最新程序Download到29的本地。然后在29的Apache上通过Dena的Sandbox进行Staging测试。测试完毕后,使用rsync通过ssh方式传送的几台WebServer上。

安装svn客户端非常简单,让后checkout一下就可以了。

至于rsync,其实是有一种Server/Client设置模式的,我用不了那么复杂的,简单点的ssh就可以了

rsync  -r -a -v -e  ssh /home/mbga/vhdocs root@xxx.xx.xxx.30:/home/xxx/

为了方便,做一个shell就可以了。不过每次都要手输入密码。不知道可以不可以解决。

完毕

基本环境就可以了。今后memcached,syslogd,squid等等也会渐渐导入