nginx 反向代理及负载均衡

1. 负载均衡的概念,负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.负载均衡能够平均分配客户请求到服务器阵列,藉此快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能.

2.反向代理方式和包过滤方式或普通代理方式并无冲突,因此可以在防火墙设备中同时使用这两种方式,其中反向代理用于外部网络访问内部网络时使用,正向代理或包过滤方式用于拒绝其他外部访问方式并提供内部网络对外部网络的访问能力.

3.常见负载均衡模式:

(1)用户手动选择方式,(比较古老的方式了,如华军软件园,选择下载站点)

(2)DNS轮询方式,大多数域名注册商都支持对同一主机名添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.(linux下面可以使用dig命令来查看一个网站的域名解析情况)

缺点:可靠性低,负载分配不均衡.

(3)四/七层负载均衡设备

(4)多线多地区智能DNS解析与混合负载均衡

4.DNS轮询负载分配不均衡:

DNS服务器是按照一定的层次结构组织的,本地DN-------------S服务器会缓存已解析的域名到IP地址的映射,这会导致使用该DNS服务器的用户在一段时间内访问的是同一台web服务器,导致Web服务器间的负载不均衡.因此,DNS轮询方式仅适用于一些可靠性要求不高的服务器集群,例如图片服务器集群,纯静态网页服务器集群.

5.四/七层负载均衡设备

现代负载均衡技术通常操作于OSI网络模型的第四层或第七层.第四层负载均衡将一个Internet上合法注册的Ip地址映射为多个内部服务器的IP地址,对每次TCP连接请求动态使用其中一个内部IP地址,达到负载均衡的目的.在第四层交换机中,此种均衡技术得到广泛的应用,一个目标地址是服务器群VIP(虚拟IP)连接请求的数据包流经交换机,交换机根据源端和目的IP地址,TCP或UDP端口号和一定的负载均衡策略,在服务器IP和VIP间进行映射,选取服务器群众最好的服务器来处理连接请求.

第七层负载均衡控制应用层服务的内容,提供了一种对访问流量的高层控制方式,适合对HTTP服务器群的应用.第七层负载均衡技术通过检查流经的HTTP报头,根据报头内的信息来执行负载均衡任务.

(1)硬件四/七层负载均衡交换机(新浪,百度,雅虎大都采用这种技术)

(2)软件四层负载均衡(LVS)LVS集群采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障。

(3)软件七层负载均衡大多基于HTTP反向代理方式,代表产品有Nginx.Nginde代理负载均衡能够很好地支持虚拟主机,可配置性很强.可以按轮询,IP哈希,URL哈希,权重等方式对服务端做负载均衡.

6.Nginx反向代理的配置

upstream 指令用于设置一组可以在proxy_pass和fastcgi_pass指令中使用的代理器集合.如果不另外设置的话,默认的负载均衡方式为轮询.upstream模块中的server模块内通过proxy_pass和fastcgi_pass指令指定后端用于反向代理的upstream服务器集群的名称和参数,服务器的名称可以是域名,IP地址,端口或Unix Socket

proxy_set_header指令用于为客户端访问后端服务器指定Header头信息.

proxy_set_header Host $host ;

proxy_set_header X-Forwarded-For $remote_addr ;

$host表示的是客户端请求的域名

$remote_addr表示的是客户端IP地址

配置反向代理后$_SERVER["REMOTE_ADDR"]获取的是Nginx负载均衡服务器的IP,通过在Nginx反向代理时添加Header头信息X-Forwared-For之后就可以通过$_SERVER["HTTP_X_FORWARDED_FOR"]获得到用户的真实IP.

代码如下:

#允许客户端请求的最大单个文件字节数

client_max_body_size 300m

#缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户

client_body_buffer_size 128k

#跟后端服务器连接的超时时间,发起握手等候相应超时时间

proxy_connect_timeout 600;

#连接成功后,等候后端服务器响应时间,其实已经进入后端的排队之中等候处理.

proxy_read_timeout 600;

#后端服务器数据回传时间,就是在规定时间内后端服务器必须传完所有数据.

proxy_send_timeout 600;

#代理请求缓存区,这个缓存区间会保存用户的头信息以供Nginx进行规则处理,一般只要能保存下头信息即可.

proxy_buffer_size 16k;

#同上告诉Nginx保存单个用的几个Buffer最大用多大空间

proxy_buffers 4 32k ;

#如果系统很忙的时候可以申请更大的proxy_buffers

proxy_busy_buffers_size 64k;

#proxy缓存临时文件的大小

proxy_temp_file_write_size 64k;

upstream php_server_pool{

server 192.168.1.10:80 weight=4 max_fails=2 fail_timeout=30s ;

server 192.168.1.11:80 weight=4 max_fails=2 fail_timeout=30s ;

server 192.168.1.12:80 weight=2 max_fails=2 fail_timeout=30s ;

}

upstream message_server_pool{

server 192.168.1.13:3245 ;

server 192.168.1.14:3245 down;

}

upstream bbs_server_pool{

server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s ;

server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s ;

server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s ;

server 192.168.1.18:80 weight=1 max_fails=2 fail_timeout=30s ;

}

#第一个虚拟主机,反向代理php_server_pool 这组服务器

server

{

listen 80;

server_name www.yourdomain.com;

location /

{

#如果后端的服务器返回502,504,执行超时等错误,自动将请求转发到upstream

#负载均衡池中的另一台服务器,实现故障转移.

proxy_next_upstream http_502 http_504 error timeout invalid_header ;

proxy_pass http://php_server_pool ;

proxy_set_header Host www.yourdomain.com ;

proxy_set_header X-Forwarded-For $remote_addr ;

}

access_log /data1/logs/www.yourdomain.com_access.log ;

}

#第二个虚拟主机

server

{

listen 80 ;

server_name www1.yourdomain.com ;

#访问http://www1.yourdomain.com/message/***地址,反向代理 #message_server_pool 这组服务器

location /message/

{

proxy_pass http://message_server_pool ;

proxy_set_header Host $host;

}

#访问除了/message/之外的http://www1.yourdomain.com/***地址,反向代理

#php_server_pool这组服务器

location /

{

proxy_pass http://php_server_pool ;

proxy_set_header Host $host ;

proxy_set_header X-Forwarded-For $remote_addr ;

}

access_log /data1/logs/message.yourdomain.com_access.log ;

}

#第三个虚拟主机

server{

listen 80 ;

server_name bbs.yourdomain.com *.bbs.yourdomain.com ;

location /

{

proxy_pass http://bbs_server_pool ;

proxy_set_header Host $host ;

proxy_set_header X-Forwarded-For $remote_addr ;

}

access_log off ;

}

用upstream定义服务器,然后server中location引用,并且获取客户端的IP和域名请求.

相关推荐