Nginx反向代理及负载均衡配置

发布时间:2020-01-29编辑:脚本学堂
Nginx反向代理及负载均衡配置

nginx无论是作为apache/ target=_blank class=infotextkey>http服务器,还是用来作为反向代理或负载均衡,都会是不错的选择。

首先,了解负载均衡的相关知识

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

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

3.常见负载均衡模式
(1)用户手动选择方式,(比较古老的方式了,如华军软件园,选择下载站点)
(2)DNS轮询方式,大多数域名注册商都支持对同一主机名添加多条A记录,这就是DNS轮询,DNS服务器将解析请求按照A记录的顺序,随机分配到不同的IP上,这样就完成了简单的负载均衡.(linux下面可以使用dig命令来查看一个网站的域名解析情况)
缺点:可靠性低,负载分配不均衡.
(3)四/七层负载均衡设备
(4)多线多地区智能DNS解析与混合负载均衡

4.DNS轮询负载分配不均衡
DNS服务器是按照一定的层次结构组织的,本地DNS服务器会缓存已解析的域名到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和域名请求。

注解

1.ip_hash指令:
ip_hash指令用来保证客户端IP的请求始终在后端同一Web服务器,以免SESSION不一致,出现用户未登录的情况.但是ip_hash无法保证后端服务器的负载均衡.
如果后端服务器有时要从Nginx负载均衡中摘除一段时间,必须将其标记为"down",而不是直接从配置文件中删掉或者注释掉该后端服务器信息.以免Nginx会按照n-1台服务器进行重新哈希,这样原来的客户端IP会被定为到其他后端web服务器.

2.server指令:
server name [parameters]
weight=NUMBER 设置服务器的权重,值越高被分配的客户端请求就越多.默认为1.
max_fails=NUMBER允许对后端服务器请求失败的次数.(后端服务器无法连接及发生服务器错误404除外,就标记失败1次)默认值为1,设置为0将关闭这项检查.
fail_timeout=TIME在经历max_fails设置的失败次数后,暂停客户端请求的时间.
down标记服务器为永久离线状态,用于ip_hash指令.
backup仅仅在非backup服务器全部宕机或繁忙的时候才启用.

3.upstream相关变量
从Nginx0.5.18版本开始,可以支持用log_format指令设置日志格式。日志格式中可以使用变量.upstream模块拥有以下变量.
$upstream_addr
处理请求的upstream服务器地址
$upstream_status
upstream服务器的应答状态
$upstream_response_time
upstream服务器响应时间(毫秒),多个响应以逗号和冒号分割.
$upstream_http_$HEADER
任意的HTTP协议头信息,例如$upstream_http_host

4.Nginx负载均衡服务器的双机高可用的两种方法
(1)一台主服务器加一台热备服务器,正常情况下主服务器绑定一个公网虚拟IP,提供负载均衡,热备服务器处于空闲状态,当主服务器发生故障时,热备服务器接管主服务器的虚拟IP,提供负载均衡服务;这种方法比较常见,但是有一台服务器处于空闲状态,浪费了负载均衡处理能力。
(2)两台负载均衡服务器都处于活动状态,各自绑定一个公网虚拟IP,提供负载均衡服务,当其中一台服务器发生故障时,另一台服务器接管发生故障服务器的虚拟IP,这种方法需要多用一个公网IP.但是可以将两台服务器都用于实际的负载均衡处理。

5.Nginx负载均衡服务器双机高可用方法一:
(1)www.yourdomain.com域名解析到虚拟IP61.1.1.2上.
(2)正常情况下,主机A绑定虚拟IP61.1.1.2
(3)用户访问www.yourdomain.com(虚拟IP61.1.1.2)实际访问的是主机A,而备机B则处于空闲状态.
(4)如果主机61.1.1.4发生故障,备机B将在几秒钟内接管虚拟IP61.1.1.2,与自己绑定,并发送ARPing包给IDC的公网网关刷新mac地址.
(5)这时,用户访问www.yourdomain.com(虚拟IP61.1.1.2)实际上访问的是备机B,从而实现故障转移与高可用,避免了单点故障.

6.Nginx负载均衡服务器双机高可用方法二:
(1)www.yourdomain.com域名通过DNS轮询解析到虚拟IP61.1.1.2和61.1.1.3上.
(2)正常情况下,服务器A绑定虚拟IP61.1.1.2服务器B绑定虚拟IP61.1.1.3.
(3)用户访问www.yourdomain.com实际上是根据DNS轮询访问两台负载均衡服务器,两台服务器均处于活动状态.
(4)如果服务器A发送故障,服务器B将在几秒钟内接管服务器A的虚拟IP61.1.1.2,与自己绑定,并发送ARPing包给IDC的公网网关刷新MAC地址.这时,服务器B同时绑定61.1.1.2和61.1.1.3两个虚拟IP.