当网站访问量增大后,后端一台服务器可能无法保证业务的正常运行,这时候就需要增加服务器来共同分担访问压力,那么就用到了负载均衡方法,这里主要介绍使用Nginx来搭建负载均衡,Nginx我们一般知道的功能是直接作为http server(代替apache,对PHP需要FastCGI处理器支持),其实他还有另外一个功能就是作为反向代理服务器实现负载均衡。
以下我们就来举例说明如何使用 nginx 实现负载均衡。因为nginx在处理并发方面的优势,现在这个应用非常常见。当然了Apache的 mod_proxy和mod_cache结合使用也可以实现对多台app server的反向代理和负载均衡,但是在并发处理方面apache还是没有 nginx擅长。

如上图所示,一台nginx服务器和两台后端服务器,nginx用来作为反向代理服务器,放置到两台后端服务器之前,作为用户访问的入口;nginx服务器仅仅处理静态页面,动态的页面(php请求)统统都交付给后端的两台apache来处理。
也就是说,我们可以把网站的静态页面或者文件放置到nginx的目录下;动态的页面和数据库访问都保留在后端的apache服务器上,如果是纯静态页面网站也可以把静态页面分配给后端的两台服务器,动态页面分配给后端服务器_1处理,毕竟网站以静态页面为主。
三台服务器,nginx服务器安装好nginx,后端两台服务器分别安装apache+php,nginx服务器配置文件如下:
upstream one {
server 116.85.26.2x weight=5;
server 116.85.22.3x weight=7;
}
upstream two {
server 116.85.26.2x;
}
server {
listen 80;
server_name 116.85.42.1x;
index index.htm index.html index.php;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~* .(htm|html|txt)$ {
proxy_pass http://one;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://two;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
当在upstream配置块中没有指定使用的负载均衡算法时,默认使用的是加权轮询。
按照上述配置,Nginx每收到12个客户端的请求,会把其中的5个转发给后端116.85.26.2x,把其中的7个转发给后端116.85.22.3x 。
其中http.server.localtion基本语法如下:
location [=|~|~*|^~]/uri/{...}
= 严格匹配, 如果这个查询匹配,将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~* 不区分大小写匹配(可用正则表达式)
!~ 区分大小写匹配
!~* 不区分大小写匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式
如下:
location = /{
#只匹配/查询
}
location /{
#匹配任何查询,因为所有请求都以/开头。但是正则表达式和长的块规则将被优先查询匹配
}
location ^~ /images/{
#匹配任何以/images/开头的查询并停止搜索。任何正则表达式将不会被测试。
}
location ~*.(gif|jpg|jpeg)${
#匹配任何以gif|jpg|jpeg结尾的请求
}
location ~*.(gif|jpg|swf)${
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if($invalid_referer){
#防盗链
rewrite ^/ http://$host/logo.png;
}
}
