nginx的负载均衡
lvs的负载均衡能力虽然很出色,但是毕竟只是4层代理负载均衡,可以使用的功能毕竟有限,nginx的负载均衡的能力没有lvs的那样出色,但nginx可以为我们提供功能却比lvs多了许多,也更加灵活的控制整个负载均衡集群,nginx是个7层负载均衡。
nginx负载均衡代理的核心模块为:
ngx_http_proxy_module proxy代理模块,用于把请求抛给服务器节点或upstream服务器池。
ngx_http_upstream_module 负载均衡块,可以实现网站的负载均衡功能及节点健康状态检查。
nginx负载均衡配置时实例
1 | ~]# cat nginx.conf |
2 | worker_processes 1; |
3 | events { |
4 | worker_connections 1024; |
5 | } |
6 | http { |
7 | include mime.types; |
8 | default_type application/octet-stream; |
9 | sendfile on; |
10 | keepalive_timeout 65; |
11 | upstream server_pools { |
12 | server 10.211.55.18:80 ; |
13 | server 10.211.55.19:80 ; |
14 | } |
15 | server { |
16 | listen 80; |
17 | server_name www.jusene.com; |
18 | location / { |
19 | proxy_pass http://server_pools; |
20 | proxy_set_header Host $host; 多虚拟主机时区别虚拟主机头 |
21 | proxy_set_header X_Forwarded_For $remote_addr; |
22 | } |
23 | } |
24 | } |
25 | |
26 | ~]# curl www.jusene.com |
27 | 10.211.55.18 |
28 | ~]# curl www.jusene.com |
29 | 10.211.55.19 |
默认upstream server后的参数 weight=1 max_fails=1 fail_timeout=10s
在server中可用的参数:
- weight:服务器权重
- max_fails=number:最大失败尝试次数
- fail_timeout=time:设置服务器不可用的时长
- backup:备用主机
- down:手动标记不再处理任何用户请求
upstream调度算法
静态调度算法
rr轮询(默认调度算法)
按客户端请求吧客户端的请求逐一分配到不同的后端节点服务器,如果后端服务器宕机,请求分配给正常的服务器。wrr权重轮询
在rr轮询上加上权重,权重越大,转发请求量越大。ip_hash
每个客户端ip的hash结果分配,只要请求的ip hash相同就分配到同一服务器,可能导致负载部均衡的情况,但是可以解决动态网页的session共享问题。
动态调度算法
fair
此算法会根据后端节点服务器的响应时间来分配请求,响应时间短优先分配。需要nginx的相关模块upstrem_fair支持。least_conn
根据后端的节点的连接数分配情况,哪个连接数少就分发。hash
一致性算法一般用于代理后端为缓存服务的场景,通过指定uri或者指定字符或者字符串进行计算,然后调度到后端服务器,如:hash $request_uri,hash $remote_addr。
http_proxy_module
- proxy_set_header 设置http请求header项传给后端服务器节点,可以让代理后端的服务器节点获取访问客户端用户的真实ip地址。
- client_body_buffer_size 用于指定客户端请求的主体缓冲区大小
- proxy_connect_timeout 表示反向代理与后端服务节点连接超时时间,即发起握手等候响应的超时时间
- proxy_send_timeout 表示代理后端服务器数据回传时间,即在规定时间之内后端服务器必须传完所有数据。
- proxy_read_timeout 设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间。
- proxy_buffer_size 设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
- proxy_buffers 设置缓冲区的数量和大小。
- peoxy_busy_buffers_size 用于设置系统很忙的时可以使用的proxy_buffers的大小,官方推荐proxy_buffers * 2
- proxy_temp_file_write_size 指定proxy缓存文件的大小
proxy_set_header Host $host; 反向代理多虚拟主机的节点的服务器,在代理端向后端服务器发送http请求头中加入host字段信息,用于识别代理的是那个虚拟主机
proxy_set_header X_Forwarded_For $remote_addr; 节点服务器获取用户的真实ip,还需要配置日志格式 $http_x_forwarded_for
ngx_http_upstream_hc_module
定义后端主机的健康状态检测机制;只能应用于location上下文:
可用参数:
- interval=#:检测的频率,默认为5秒
- fails=number:判定为失败的检测次数
- passes=number:判定为成功的检测次数
- url=url:执行健康状态检查的请求url
- match=name:基于哪个match做检测结果为成功的“成功”或“失败”的判定
- port=number:向服务器的哪个端口发起健康状态检查请求
match只能定义在http上下文:
实例:
1 | http { |
2 | server { |
3 | ... |
4 | location / { |
5 | proxy_pass http://backend; |
6 | health_check match=welcome; |
7 | } |
8 | } |
9 | |
10 | match welcome { |
11 | status 200; |
12 | header Content-Type = text/html; |
13 | body ~ "Welcome to nginx!"; |
14 | } |
15 | } |
proxy_net_upstream
当nginx接受到后端服务返回proxy_next_upstream参数定义的状态码,会将这个请求转发给正常的后端服务器,此参数可以提高用户的访问体验:
1 | server { |
2 | listen 80; |
3 | server_name www.jusene.com; |
4 | location /{ |
5 | proxy_pass http://static_pool; |
6 | proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; |
7 | proxy_set_header Host $host; |
8 | proxy_set_header X-Forwarded-For $remote_addr; |
9 | proxy_connect_timeout 60; |
10 | proxy_send_timeout 60; |
11 | proxy_read_timeout 60; |
12 | proxy_buffer_size 4k; |
13 | proxy_buffers 4 32k; |
14 | proxy_busy_buffers_size 64k; |
15 | proxy_temp_file_write_size 64k; |
16 | } |
17 | } |
ngx_http_headers_module
proxy_set_header将客户机的请求报头重新封装再传到后端主机,而add_header将后端主机的响应报文重新打包封装给客户机。
1 | add_header X-addr $upstream_addr #在响应报文中显示真正请求的后端主机 |
2 | add_header X-Cache $upstream_cache_status #显示是否命中缓存 |
proxy缓存
1 | 在http上下文中定义缓存区域 |
2 | proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] |
3 | |
4 | 调用缓存 |
5 | proxy_cache zone|off(default) |
6 | proxy_cache_key string定义缓存键($request_uri) |
7 | proxy_cache_vaild [code...] time 为不同的响应码设定不同的缓存时长 |