Nginx进阶使用-负载均衡原理及配置实例

时间:2023-03-09 17:11:59
Nginx进阶使用-负载均衡原理及配置实例

介绍

跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。可以将Nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用Nginx改善Web应用程序的性能,可伸缩性和可靠性。

负载均衡

什么是负载均衡,单从字面理解可以解释为N台服务器平均分担负载,不会因为某台服务器负载高宕机而出现某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,目的是达到整个系统的高性能和高可用性。

Nginx负载均衡介绍

严格地说,Nginx仅仅是作为Nginx Proxy反向代理使用的,因为这个反向代理功能表现的效果是负载均衡集群的效果,所以我们称之为Nginx负载均衡。

Nginx负载均衡组件

实现Nginx负载均衡的组件主要有两个:

  • ngx_http_upstream_module

负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

  • ngx_http_proxy_module

proxy代理模块,用于把请求转发给服务器节点或upstream服务器池

http_upstream模块

upstream模块介绍

upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应upstream组的名字上,具体写法为:

proxy_pass http://server_pool_name

其中server_pool_name就是一个upstream节点服务器组名字。

upstream典配
upstream server_pool_name {
server 192.168.0.2; #这行标签和下行是等价的
server 192.168.0.3:80 weight=1 max_fails=1 fail_timeout=10s; #这行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以。
server 192.168.0.4:80 weight=1 max_fails=2 fail_timeout=20s backup; #server最后面可以加很多参数,具体参数作用看下文的表格
}
upstream模块参数
  • server

负载后面的RS配置,可以是ip或者域名。

  • weight

请求服务器的权重。默认值为1,越大表示接受的请求比例越大。

  • max_fails

nginx 尝试连接后端主机失败的次数。

这个数值需配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream这三个参数来使用的。

当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404,502,503

  • fail_timeout

在max_fails定义的失败次数后,距离下次检查的时间间隔,默认10s

  • backup

热备配置,标志这台服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求

  • down

表示这个服务器永不可用,可配合ip_hash使用

  • 举例
upstream web_pools {
server 192.168.0.3:80 weight=5;
server 192.168.0.4:80 max_fail=5 fail_timeout=10s;// 当5次连续检查失败后,间隔10s后重新检测。
server 192.168.0.5:80 backup; // 指定备份服务器。作用:等上面服务器全部不可访问时就向它转发请求。
}

http_proxy模块

proxy_pass指令介绍

proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器。在实际的反向代理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池,就location指令具体如何配置和使用,会在后续文章中专题介绍,敬请期待。

        location / {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
http proxy模块参数
  • proxy_set_header

设置http请求header项传给后端服务器节点。例如,可以实现让代理后端的服务器节点获取访问客户端用户真实的IP地址

  • client_body_buffer_size

用于指定客户端请求主题缓冲区大小

  • proxy_connect_timeout

表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间

  • proxy_send_timeout

表示代理后端服务器的数据回传时间,即在规定时间之内,后端服务器必须传完所有的数据,否则,nginx将断开这个连接

  • proxy_read_timeout

设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx在后端排队等候处理的时间

  • proxy_buffer_size

设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小

  • proxy_buffers

设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会放置在缓冲区

  • proxy_busy_buffers_size

用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_bufer*2

  • proxy_temp_file_write_size

指定proxy缓存临时文件的大小

Nginx负载均衡调度算法

Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html

round-robin(轮询)

默认调度算法,按照客户端请求逐一分配到不同的后端服务器,宕机的服务器会自动从节点服务器池中剔除。

upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

注意:对于服务器性能不同的集群,该算法容易引发资源分配不合理等问题。

least-connected(最少连接)

最少连接允许在某些请求需要较长时间才能完成的情况下更公平地控制应用程序实例上的负载。使用最少连接的负载平衡,nginx将尝试不使繁忙的应用程序服务器因过多的请求而过载,而是将新的请求分配给不太繁忙的服务器。可以将nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用nginx改善Web应用程序的性能,可伸缩性和可靠性

upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

ip-hash

每个请求按访问 IP 的hash结果分配,每个访客固定访问一个后端服务器,可解决session不共享的问题。

upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

参考

结语

欢迎关注微信公众号『码仔zonE』,专注于分享Java、云计算相关内容,包括SpringBoot、SpringCloud、微服务、Docker、Kubernetes、Python等领域相关技术干货,期待与您相遇!

Nginx进阶使用-负载均衡原理及配置实例