Nginx搭建负载均衡实现动静分离的方法

来自:互联网
时间:2019-08-07
阅读:

当网站访问量增大后,后端一台服务器可能无法保证业务的正常运行,这时候就需要增加服务器来共同分担访问压力,那么就用到了负载均衡方法,这里主要介绍使用Nginx来搭建负载均衡,Nginx我们一般知道的功能是直接作为http server(代替apache,对PHP需要FastCGI处理器支持),其实他还有另外一个功能就是作为反向代理服务器实现负载均衡。

以下我们就来举例说明如何使用 nginx 实现负载均衡。因为nginx在处理并发方面的优势,现在这个应用非常常见。当然了Apache的 mod_proxy和mod_cache结合使用也可以实现对多台app server的反向代理和负载均衡,但是在并发处理方面apache还是没有 nginx擅长。

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;
    }
}
返回顶部
顶部