一台服务器(xeon 3210 ,4G内存),采用nginx+php(fpm)+xcache+mysql 的架构,运行一个纯动态的php+mysql的网站,经过不懈的优化,在160万pv下运行的很稳定,负载很平稳。但随着访问量的增长,cpu终于还是在250万pv的时候被大量的php-cgi进程给吃光了。由于网站的特性导致不能使用varnish等cache server。为了解决cpu不够用的问题,又不能把网站停掉,临时决定把一台闲置的服务器用上,做了个简单的负载均衡。把过程写下来备忘。
服务器A(在用的服务器):内网地址 192.168.0.1 运行 nginx mysql php(fpm) xcache
服务器B:内网地址 192.168.0.2 运行 php(fpm) xcache

一。修改服务器B上的php(fpm)的访问权限
默认情况下 php(fpm)监听在 127.0.0.1:9000 并且只允许来自 127.0.0.1的连接。为了能让内网其它机器访问,需要修改服务器B上的 php-fpm.conf中的两行配置。修改后的这两行如下:
192.168.0.2:9000
192.168.0.2
然后重启服务器B上的php-fpm

二。修改服务器A上的mysql访问权限
原来mysql只允许localhost连接的。为了让内网其它机器能够访问,需要修改mysql权限表中的相应用户的host字段,把localhost改成 %
这里还有一个问题,默认的时候mysql启动时是不使用 skip-name-resolve选项的,这样的话,从服务器B上的连接会比较慢,因为mysql会对 192.168.0.2这个ip做dns反向查询,导致大量的从服务器B上的连接处于 login状态.....解决这个问题有两个办法,一是加入 skip-name-resolve参数重启mysql,二是在 /etc/hosts中加入一句 192.168.0.2 server2

三。把程序文件copy一份到服务器B,程序放置的路径,权限等要一致

四。接下来配置最关键的nginx.conf
很简单
原来对php的请求是直接交给 127.0.0.1:9000处理,现在要定义两台
先在http段中加入下面一段
upstream fastcgi {
server 127.0.0.1:9000 weight=1;
server 192.168.0.2:9000 weight=2;
}
然后把原来的 fastcgi_pass 127.0.0.1:9000;
改为 fastcgi_pass fastcgi;
重启nginx,看看服务器B的状态,cpu的使用率马上就上来了,而服务器A的cpu使用率和负载都下降了不少。

做这样的负载均衡,不需要什么复杂的配置,不影响原站点的访问。速度快,工作量少。还是有些可取之处的。