当网站访问量增大后,后端一台服务器可能无法保证业务的正常运行,这时候就需要增加服务器来共同分担访问压力,那么就用到了负载均衡方法,这里主要介绍使用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; } }