nginx实现负载均衡集群的方案分享

发布时间:2019-09-16编辑:脚本学堂
本文介绍下,用nginx实现负载均衡集群的方法,通过nginx的反向代理来实现,有需要的朋友参考下。

nginx的反向代理
反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接到客户端,此时代理服务器对外就表现为一个服务器,而此种工作模式类似于LVS-NET模型。

反向代理,即web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加的一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。

反向代理是针对web服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端web服务器的压力,提高响应速度。

因此Nginx还具有缓存功能。
 
nginx反向代理的工作流程
1)用户通过域名发出访问请求,该域名被解析为反向代理服务器的IP地址
2)反向代理服务器接收用户的请求;
3)反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;
4)如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中。
 
nginx反向代理的好处
1)解决了网站服务器对外可见的问题,提高了网站服务器的安全性;
2)节约了有限的IP地址资源,后端服务器均可使用私有IP地址与代理服务器进行通信;
3)加速了网站的访问速度,减轻了真是web服务器的负荷。

(一)、调度算法
Nginx的upstream指令用于指定proxy_pass和fastcgi_pass所使用的后端服务器,即nginx的反向代理功能,因此可以将两者结合起来使用以达到负载均衡的目的,而Nginx也支持多种调度算法:

1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,则会跳过该服务器分配至下一个监控的服务器。并且它无需记录当前所有连接的状态,所以它是一种无状态调度。
2、weight
指定在轮询的基础上加上权重,weight和访问比率成正比,即用于表明后端服务器的性能好坏,若后端服务器性能较好则可将大部分请求分配给它,已实现其力所能及。
例如:
我后端服务器172.23.136.148配置:E5520*2 CPU,8G内存
后端服务器172.23.136.148配置:Xeon(TM)2.80GHz * 2,4G内存
我希望在有30个请求到达前端时,其中20个请求交给172.23.136.148处理,剩余10个请求交给172.23.136.149处理,就可做如下配置
 

复制代码 代码示例:
upstream web_poll {
server 172.23.136.148 weight=10;
server 172.23.136.149 weight=5;
}

3、ip_hash
每个请求按访问ip的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法进行哈希出一个值,在随后的请求客户端IP的哈希值只要相同,就会被分配至同一个后端服务器,该调度算法可以解决session的问题,但有时会导致分配不均即无法保证负载均衡。
例如:
 

复制代码 代码示例:
upstream web_pool {
ip_hash;
server 172.23.136.148:80;
server 172.23.136.149:80;
}

4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
 

复制代码 代码示例:
upstream web_pool {
server 172.23.136.148;
server 172.23.136.149;
fair;
}

5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
 

复制代码 代码示例:
upstream web_pool {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
 

每个设备的状态设置为:
1.down 表示当前的server不参与负载,用于ip_hash中
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails 允许请求失败的次数默认为1.设为0则表示关闭该项功能,当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout 在max_fails定义的失败次数后,暂停的时间。
5.backup 可以将其理解为备机,其它所有的非backup机器down或者忙的时候,才会将请求分配给backup机器。所以这台机器压力会最轻。
 
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
 
(二)、指令的使用
1、upstream
声明一组可以被proxy_pass和fastcgi_pass引用的服务器;这些服务器可以使用不同的端口,并且也可以使用Unix Socket;也可以为服务器指定不同的权重。如:
 

复制代码 代码示例:
upstream web_pool {
    server coolinuz.9966.org weight=5;
    server 172.23.136.148:8080 max_fails=3  fail_timeout=30s;
    server unix:/tmp/backend3;
}

2、server
语法:server name [parameters]
其中的name可以是FQDN,主机地址,端口或unix套接字;如果FQDN解析的结果为多个地址,则每个地址都会被用到。

3、proxy_pass
语法:proxy_pass URL;
该指令用于指定代理服务器的地址和URL将被映射为的URL或地址和端口。即用来指定后端服务器的地址或URL[端口]。

4、proxy_set_header
语法:proxy_set_header header value;
该指令允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。
例如:
 

复制代码 代码示例:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 

注意:$proxy_add_x_forwarded_for包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr
 
Nginx的内置变量:
 

$args, 请求中的参数;
$is_args, 如果已经设置$args,则该变量的值为“?”,否则为“”。
$content_length, HTTP请求信息头里的"Content-Length";
$content_type, 请求信息头里的"Content-Type";
$document_root, 针对当前请求所属的root指令设置的根目录路径;
$document_uri, 与$uri相同;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate, 对连接速率的限制;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径
$request_body_file, 客户端请求主体的临时文件名。
$request_uri, 请求的URI,带参数;
$query_string, 与$args相同;
$scheme, 所用的协议,比如http或者是https,比如rewrite  ^(.+)$ $scheme://example.com$1  redirect;
$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$server_port, 请求到达的服务器端口号;
$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
 

5、proxy_read_timeout
语法:proxy_read_timeout time;
这个指令设置Nginx与后端服务器建立连接后。等待后端服务器的响应时间

6、proxy_send_timeout
语法:roxy_send_timeout time;
该指令指定请求转移到后端服务器的超时时间。整个传输的要求时间不超过超时时间,但只有两次写操作之间。如果在此时间之后的后端服务器将不采取新的数据,然后nginx将关闭连接。

7、proxy_connect_timeout
语法:proxy_connect_timeout time;
该指令用来设置分配到后端服务器的连接超时时间。

8、proxy_buffers
语法: proxy_buffers the_number is_size;
该指令设置缓冲区的数目和大小,缺省情况下,一个缓冲区的大小和页面大小相同。

9、proxy_buffer_size
语法:proxy_buffer_size buffer_size;
代理缓冲区,该指令用于保存用用户的头部信息。

10、proxy_busy_buffers_size
语法:proxy_busy_buffers_size size;
用于当系统负载较大,缓冲区不够用时,可以申请更大的proxy_buffers

11、proxy_temp_file_write_size
语法:proxy_temp_file_write_size size;
用于指定缓存临时文件的大小