Nginx除了实现基本的Web Server功能以外还能够做为正向代理与反向代理。正向代理与反向代理的区别在于代理的对象不同。正向代理的对象是客户端,反向代理的对象是服务端。作正向代理时,当客户端发起请求其访问目标应该是后端真实服务器;作反向代理时,客户端发起请求其目标应该是代理服务器自己,但由代理服务器把后端真实服务器上的数据发给了客户端。反向代理一般是做为负载均衡来分发流量给后端的应用程序服务器,以此来提升性能。好比前端是一台Nginx做为负载均衡的分发器,后端是多台Apache搭建的Web Server,当访问流量很大时,就让Nginx分发请求给后端多台服务器,让它们分工响应。Nginx实现负载均衡用到的模块是proxy_pass代理模块,经过该模块将客户端请求转发到一组upstream服务池,因此还须要用到ngx_http_upstream_module模块,该模块只能配置于http字段中,支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。html
1、Nginx经常使用负载均衡算法:前端
一、轮询(默认算法):每一个请求会依次分配给后端不一样的应用程序服务器,不理会后端服务器的实际压力linux
二、加权轮询:权重越大的服务器,被分配到的次数就会越多,一般用于后端服务器性能不一致的状况nginx
三、IP HASH:当同IP进行重复访问时会被指定到上次访问到的服务器,能够解决动态网站SESSION共享问题web
2、upstream模块中的经常使用参数说明:算法
server:负载均衡后端服务器的IP或域名,不写端口的话默认是80。高并发场景用域名,再经过DNS进行负载均衡 后端
weight:后端服务器权重,默认为1,权重越大接收的请求越多。例:weight=5服务器
max_fails:检查节点的健康状态并容许请求失败的次数,达到该次数就将节点下线。默认为1,0表示禁止失败尝试。例:max_fails=2并发
fail_timeout:max_fails失败次数达到限制后暂停该节点服务的时间,默认是10秒。例:fail_timeout=10s负载均衡
backup:热备配置,当服务池中全部服务器均出现问题后会自动上线backup服务器
down:标志服务器不可用,不参与负载均衡。这个参数一般配合IP_HASH使用
max_conns:限制最大链接数,一般对后端服务器硬件不一致的状况进行配置
1 |
upstream linuxe_backend { |
2 |
server 192.168.1.110 down; #该节点不可用 |
3 |
server 192.168.1.120 backup; #其余节点挂了后该节点自动上线 |
4 |
server 192.168.1.130 max_failes=1 fail_timeout=10s weight-5; |
5 |
server backend1.linuxe.cn 8080 weight=3 |
6 |
} |
3、Nginx负载均衡调度算法介绍(若是调度策略使用不当会对后端节点形成压力过大)
这些调度算法做用域都是upstream中
一、轮询负载,也是默认的负载均衡配置
01 |
http { #upstream模块包含在http模块下 |
02 |
upstream myserver{ #定义upstream名字,下面会引用 |
03 |
server 192.168.1.100; #指定后端服务器地址 |
04 |
server 192.168.1.110; #指定后端服务器地址 |
05 |
server 192.168.1.120; #指定后端服务器地址 |
06 |
} |
07 |
08 |
server { |
09 |
listen 80; |
10 |
server name www.myserver.com; |
11 |
location / { |
12 |
proxy_pass http://myserver; #引用upstream |
13 |
} |
14 |
} |
15 |
} |
在上面的例子中,当用户访问www.myserver.com站点时,Nginx会负载平衡分配给后端的三个服务器。使用ab作压力测试能够看到在加了负载均衡后Time per request(每一个请求平均消耗时间)下降、Request per second(每秒请求数)提高。若是没有配置upstream模块而只使用proxy_pass模块,能够实现反向代理的做用。
二、加权负载均衡
01 |
http { |
02 |
upstream myserver{ |
03 |
server 192.168.1.100 weight=3; #指定后端服务器地址,权重为3 |
04 |
server 192.168.1.110; |
05 |
} |
06 |
07 |
server { |
08 |
listen 80; |
09 |
server name www.myserver.com; |
10 |
location / { |
11 |
proxy_pass http://myserver; |
12 |
} |
13 |
} |
14 |
} |
在上面配置中,每3个请求都分配给192.168.1.100,而后第4个请求会分配给192.168.1.110,如此循环下去。
三、IP HASH负载均衡
1 |
upstream myserver { |
2 |
ip_hash; #采用IP HASH算法 |
3 |
server 192.168.1.100; |
4 |
server 192.168.1.110; |
5 |
server 192.168.1.120; |
6 |
} |
若是须要将客户与后端一台服务器“绑定”起来,可使用ip-hash负载平衡。这样能够确保来自相同客户机的请求老是指向相同的服务器除非该服务器不可用。
四、基于URL的HASH,当客户端屡次访问同一个地址时分配到固定的节点
1 |
upstream myserver { |
2 |
hash $request_uri; |
3 |
server 192.168.1.100; |
4 |
server 192.168.1.110; |
5 |
server 192.168.1.120; |
6 |
} |
五、最少链接数轮询,哪一个节点当前的链接数少就分配给哪一个节点处理
1 |
least_conn; |
4、如何获取客户端真实IP
因为Nginx做为了反向代理,帮客户取到数据并反馈给客户,因此在后端的服务器访问日志中记录的将会是Nginx这台负载均衡服务器的IP而不是客户端真实IP,要解决这个问题的话就须要使用proxy_set_header模块。
proxy_set_header:让后端服务器能获取到前端用户真实IP,而不仅是代理服务器的IP。配置示例以下(还需将后端Apache日志格式中的%h替换为%{X-Real-IP}i):
1 |
location /{ |
2 |
proxy_pass http://localhost:8080/web/; |
3 |
#如下三个proxy_set_header配置项是重点 |
4 |
proxy_set_header Host $host; |
5 |
proxy_set_header X-Real-IP $remote_addr; |
6 |
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
client_body_buffer_size:客户端请求主体缓冲区大小
proxy_connect_timeout:代理服务器和后端真实服务器握手链接超时时间
proxy_send_timeout:后端服务器回传数据给Nginx的时间,须要在设置的时间范围内发送完全部数据,不然Nginx将断开链接
proxy_read_timeout:代理服务器和后端服务器链接成功后,等待后端服务器响应时间
5、Nginx高可用的实现:
利用backup标签能够实现高可用,当全部节点挂掉后backup服务器会自动接管服务,当有任意一台节点恢复后backup也会自动放弃服务
01 |
http { |
02 |
upstream myserver{ |
03 |
server 192.168.1.100 |
04 |
server 192.168.1.110 backup; |
05 |
} |
06 |
server { |
07 |
listen 80; |
08 |
server name www.myserver.com; |
09 |
location / { |
10 |
proxy_pass http://myserver; |
11 |
} |
12 |
} |
13 |
} |
从上面多个配置示例来看Nginx的upstream模块至关因而创建一个服务池,把后端的服务器都放在池子里,而proxy模块则是从这个池子里调用这些服务器。
6、线上配置示例:
01 |
#先在nginx.conf中定义一组upstream |
02 |
upstream pre-cloud_Backend { |
03 |
server pre-cloud.website.com:8080; |
04 |
ip_hash; |
05 |
check interval=5000 rise=1 fall=3 timeout=30000; |
06 |
check_http_expect_alive http_2xx http_3xx; #tengine的健康检查模块 |
07 |
} |
08 |
09 |
#conf.d/下定义一个文件 |
10 |
server{ |
11 |
listen 80; |
12 |
server_name cloud.website.com; |
13 |
limit_conn perserver 10000; |
14 |
15 |
location / { |
16 |
proxy_next_upstream error timeout http_503 http_504 http_502; |
17 |
proxy_connect_timeout 500s; |
18 |
proxy_read_timeout 500s; |
19 |
proxy_send_timeout 500s; |
20 |
proxy_set_header Host $http_host; |
21 |
proxy_set_header X-Real-IP $remote_addr; |
22 |
proxy_set_header X-Forwarded-For $remote_addr; |
23 |
proxy_pass http://pre-cloud_Backend; |
24 |
} |
25 |
} |