Nginx可以作为一个非常高效的负载均衡系统,通过分发HTTP请求到多个应用服务器来提高整个系统的吞吐量,性能和可用性。
负载均衡的算法/机制
下面是Nginx支持的机制
轮询机制
轮询算法
- 最少连接,把下一个请求分发到活动负载最少的服务器
ip哈希,根据客户端的IP地址的哈希值来映射到处理请求的服务器
默认负载均衡配置
最简单的负载均衡配置:
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
在上面的例子中,有三个相同的应用服务运行在ser1-ser3三个服务器中。如果没有指定均衡机制,默认为轮询方法。所有的请求都被代理到myapp1 服务组
,Nginx会使用轮询算法分发请求。
Nginx还可以代理HTTPS,gRPC等协议的请求,如果要支持HTTPS请求只要修改http-> https即可
最少连接机制
相比轮询方法,在有些请求需要更多处理时间的情况下,最少连接方式可以获得更好的平衡。
基于最少连接机制,Nginx不会分发请求到负载过多的服务器,而是把新请求分发到负载最少的服务器。
least_conn 指令为服务组(server group)
配置的一部分
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
会话持久化
如果使用轮询或者最少连接机制,同一个客户端的请求可能会分发给不同的服务器。如果需要保持一个会话来保存例如:用户登录状态、购物车信息。需要把同一个客户端的请求分发到同一个服务器来使用会话,这种情况下IP哈希算法派上了用场。
IP哈希算法机制,用客户端的IP地址作为哈希算法的key来决定处理请求的服务器。 配置如下..
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
基于权重的负载均衡
在上面的例子中没有配置服务器的权重,所以对于特定的负载均衡机制每台服务器都是等价的。但是如果有的服务器配置更高,可以通过配置更高的权重使权重高的服务器处理更多请求。
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
在这个配置中,如果有5个请求,那么3个请求会被分发给sev1,1个分发给sev2,1个分发给sev3.这里是轮询机制,但对于其他机制也是同样的配置。
健康检查
如果一个服务器的请求返回失败,Nginx会把这个服务器标识为失败,在一段时间内接下来的请求会避开失败的服务器。max_fails指令配置失败多少次才把服务标识为失败,默认为1.如果设置为0则标识不启用健康检查。fail_timeout指令配置如果服务标识为失败了,多少时间后才重试。如果重试的时候成功了标识为失败的服务器会重新标识为正常。