Jusene's Blog

nginx负载均衡

字数统计: 1.4k阅读时长: 5 min
2017/05/24 Share

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 为不同的响应码设定不同的缓存时长
CATALOG
  1. 1. nginx的负载均衡
  2. 2. nginx负载均衡配置时实例
  3. 3. upstream调度算法
  4. 4. http_proxy_module
  5. 5. ngx_http_upstream_hc_module
  6. 6. proxy_net_upstream
  7. 7. ngx_http_headers_module
  8. 8. proxy缓存