烂泥:nginx负载均衡,烂泥nginx负载均衡


本文由秀依林枫提供友情赞助,首发于烂泥行天下。

今天我们来学习下有关nginx的负载均衡配置。nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的。

说明:有三台服务器,前端的A服务器使用nginx进行负载均衡配置。后端是两台配置的相同服务器,以访问a.ilanni.com这个域名为例。结构图,如下:

A服务器对外(公网)开放80端口,B、C服务器就是两台配置相同的服务器。B服务器开放8080端口,C服务器开放8090端口。当客户端访问a.ilanni.com域名时,A服务器根据nginx的upstream模块相应策略进行分配客户端访问到B服务器还是C服务器。

注意B服务器和C服务器内容是相同的。但是在此,我们为了看到实验效果,我在B、C服务器配置了不同的内容。B服务器的默认页面现实的内容为:The Server is web1_192.168.1.249:8080。C服务器的默认页面现实的内容为:The Server is web2_192.168.1.249:8090。如下:

nginx负载均衡的默认是使用轮询方式进行分配的,而且默认的权重为1,并且权重越大被访问的几率越大。

我们先配置A服务器的nginx,如下:

cat /usr/local/nginx/conf/nginx.conf|grep -v ^#|grep -v ^$

upstream a.ilanni.com {

server 192.168.1.248:8080;

server 192.168.1.249:8090;

}

location / {

proxy_pass http://a.ilanni.com;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

注意上图中,标记出来的第一部分。其中upstream就是做负载均衡使用的。http://a.ilanni.com;就是我们要访问的域名,通过proxy_pass反向代理到upstream下的服务器中。

第二部分就是我们要反向代理的域名,注意在此我们监听的是80端口,而且这个server标签中,我并没有配置server_name。其实配置server_name也是可以的,不过最后的效果是一样的,这个是经过测试的。

第三部分,在此我配置的就是一个虚拟主机。监听的是8080端口,并且在此我也配置了server_name。这个主要是为了做对比使用的。

我们现在先启动A服务器的nginx,并且访问a.ilanni.com:8080。如下:

可以看到目前A服务器的nginx已经可以正常访问了。注意我们在此访问的是http://a.ilanni.com:8080。

现在开始配置B、C服务器的nginx,配置内容如下:

B、C服务器的nginx配置完毕后,我们现在来启动各自的nginx服务并访问,如下:

通过上图,我们可以看到B、C服务器的nginx已经正常访问了。那么我现在来访问http://a.ilanni.com看看能不能达到我们所要的效果。如下:

可以看到我们现在访问http://a.ilanni.com已经反向代理到upstream下的B服务器,并且现在显示的是B服务器的内容。

再次刷新页面,显示如下:

刷新页面后,你会发现这次显示的是C服务器的内容。也说明http://a.ilanni.com已经反向代理到C服务器上。

你可以多次刷新页面,会发现显示的内容是B、C服务器交替出现。

为什么会是这样呢?

其实在文章前面,我已经介绍了nginx的upstream负载均衡,在没有其他配置的情况默认使用的策略是轮询方式的,而且默认的权重为1。

也就是说:upstream a.ilanni.com {

server 192.168.1.248:8080;

server 192.168.1.249:8090;

}

中B、C服务器的默认权重都是一样为1。那么在nginx轮询时,所以B、C服务器会交替出现。

如果我们现在把B服务器的权重设置为5,C服务器还是使用默认看看实际情况。配置如下:

upstream a.ilanni.com {

server 192.168.1.248:8080 weight=5;

server 192.168.1.249:8090;

}

再次访问http://a.ilanni.com,首先显示的还是B服务器的内容。然后刷新,你会发现大约大约刷新了5次左右,才会显示C服务器的内容。这就权重的作用,服务器的权重数值越高,被分配到客户端的请求次数越多。

注意以上实验,我们是在A、B、C服务器是在同一个局域网,对公网来说只是开放了A服务器的80端口。如果这三台服务器全部是公网IP的话,那就是我们下篇文章要介绍的内容了,有关nginx反向代理的使用。

到此,有关nginx的负载均衡我们基本上介绍完毕后。下面在辅助介绍下,nginx的upstream目前支持以下几种方式的分配:

1)、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2)、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。设置服务器的权重,权重数值越高,被分配到客户端的请求次数越多,默认值为1。

3)、ip_hash 每个请求按访问IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4)、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。

5)、url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。


多个nginx怎分发,达到负载均衡国内大型网站一般怎实现的?

这方面的资料,基本都是一块一块不完整的。我大概跟你说一个基本架构:
1、DNS服务器,如果资金充足的话,建议使用BGP机房,2-3台DNS服务器均衡,通常使用bind软件。如果资金紧的话,可以购买专业的dns服务,比如国内的dnspod。
2、CDN服务器,一开始如果想省事,可以买专业公司的服务,如chinacache,但随着发展成本会越来越高。自建的话,可能分别搭建,放电信、联通、移动等不同机房的服务器,通过dns做动态解析。超大网站的话,可以用Squid,普通中至大型用nginx,内部玩玩用varnish。
3、前端均衡,资金充足的话,可以使用硬件设备,几十万一台。自已有技术队伍的话,就用nginx/haproxy+keepalived等自已组建前端。均衡的方式都比较灵活,随机、权重、ip、url都有。
4、同步的问题要看同步什么东西,普通的可以实时文件同步。但数据库的话,要看具体类型选择同步方式了。
5、后端的应用服务器和数据库集群,要看流量规划了。
 

Nginx 负载均衡 问题

我的负载均衡是这样实现的。
upstream abc#com {
server 1.2.3.1:80;
server 1.2.3.4:80; }
server {
listen 80;
server_name abc#com;
location / {
proxy_pass abc#com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
}

请把#改成.
 

相关内容