使用nginx作为http负载均衡
- 负载均衡机制
- 默认的负载均衡配置
- 最小连接负载均衡
- 持久性会话
- 权重负载均衡
- 健康检查
- 拓展阅读
介绍
负载均衡是一个通用的技术, 横跨多个应用实例, 能够优化资源利用率, 最大限度地提高吞吐量, 降低延迟, 并确保容错配置.
使用nginx作为一个高效的http负载均衡器能够分配流量到多个应用服务器, 提高了性能和web应用的可靠性,可拓展性.
负载均衡机制
nginx支持以下的负载均衡算法:
- round-robin —- nginx以轮询的方式分配请求到应用服务器.
- least-connected —- nginx把请求分配给拥有最少活跃连接的应用服务器.
- ip-hash —- nginx通过hash客户端ip地址来决定将请求分配到哪个应用服务器.
默认的负载均衡配置
下面的配置算是最简单的nginx负载均衡的配置:
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
在上面的例子中, srv1, srv2和srv3服务器都运行着相同的应用程序. 当在配置文件中没有配置负载均衡的方法时, nginx默认采用round-robin
的方法. 配置proxy_pass http://myapp1
将使所有的请求都代理到服务器组myapp1中, 然后nginx再通过http负载均衡分配请求到具体的应用服务器上.
nginx的反向代理实现包括负载均衡http, https, fastcgi, uwsgi, scgi和memcached.
用https负载均衡代替http, 只需要使用https协议.
当为fastcgi, uwsgi, scgi和memcached设置负载均衡时, 分别使用fastcgi_pass
, uwsgi_pass
, scgi_pass
和memcached_pass
指令.
最小连接负载均衡
least-connected机制可以控制应用服务实例的负载. 对于需要花费更多时间来完成任务的请求, 这样更加公平.
如果使用了least-connected的负载均衡算法, nginx将不会过度地分配请求给那些繁忙的应用服务器, 而是分配给那些相对不忙的服务器.
当least_conn
指令在服务器组配置中被使用, 那么least-connected负载均衡算法将被激活:
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
持久性会话
需要注意的是, 如果使用了round-robin
或者least-connected
负载均衡算法, 那么随后每个请求都可能被分配到不同的服务器中. 这样就不能保证相同的客户端指向相同的服务器.
如果有需要绑定客户端到一个特殊的应用服务器, 换句话说, 尝试选择一台特殊的服务器来持久化客户端会话, 那么ip-hash
负载均衡算法就能够实现.
如果使用了ip-hash
的负载均衡算法, nginx将使用hash算法哈希客户端ip地址来决定哪个服务器来处理这个请求. 这个算法确保了相同客户端的请求能够指向相同的服务器上, 除非这台服务器挂掉了.
为了配置配置ip-hash
负载均衡算法, 只需要在服务器组中添加ip-hash
指令就可以了:
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
权重负载均衡
另外通过使用服务器权重也会影响nginx的负载均衡算法.
在上面的例子中没有配置服务器权重, 那么对于特定负载均衡算法来说所有的服务器都是一样的.
如果使用round-robin
的算法分配请求, 但是被代理的服务器的性能有好有坏, 有些能够快速处理大量的请求, 而有些服务器则只能允许处理少量的请求. 那么我们就希望能够手动给各个性能不一的服务器配置不同的权重.
当使用了weight
参数后, 权重也将参与到负载均衡的分配决定之中:
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
在上面这个配置中, 每5个请求将会像如下被分配: 3个请求将引导到srv1服务器, 1个请求引导到srv2服务器, 还有1个引导到srv3服务器.
权重在least-connected
和ip-hash
策略中也同样适用.
健康检查
nginx的反向代理实现包含内置(或第三方)的服务器健康检测. 如果应用服务器响应失败(返回error), nginx会标记该台服务器失效, 并且在随后一段时间内
都不会再把请求分发到该台服务器上.
我们可以用max_fails
指令设置nginx在fail_timeout
时间内连续连接服务器失败的次数. 默认的max_fails
为1. 当把它设置为0时, nginx将不会对这个服务器做健康检查.
fail_timeout
参数定义了多长时间后服务器将被标记为失败. 如果在fail_timeout
时间服务器失败, 那么nginx就会用请求去检测服务器是否存活, 如果检测成功, 则标记这个服务器没有挂掉.
拓展阅读
除此之外, 还有很多的指令和参数可以控制服务器负载均衡, 例如: proxy_next_upstream
, backup
, down
和keepalive
.
最后, application load balancing, application heal checks, activity monitoring 和 on-the-fly reconfiguration 是nginx的插件插件订阅.
下面是关于负载均衡的nginx插件的更多细节: