Nginx负载均衡
- 什么是负载均衡?
- Nginx负载均衡配置
- Nginx负载均衡策略
- 1.轮询
- 2.加权轮询
- 3.ip_hash
- 4.least_conn
什么是负载均衡?
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。(来自百度百科)
其实这就跟早上地铁进站,存在多个入口一个道理。
Nginx负载均衡配置
Nginx的负载均衡主要是对 proxy_pass 和upstream 的配置。如下:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream tortoise_upstream {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 8888;
server_name localhost;
location ~ / {
proxy_pass http:// tortoise_upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Nginx负载均衡策略
nginx主要有轮询(默认)、加权轮询、ip_hash、least_conn 四种策略。
1.轮询
轮询是nginx默认的负载均衡策略,每个请求会按时间顺序逐一循环分配到不同的服务器。
参数 | 描述 |
fail_timeout | 与max_fails结合使用 |
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了 |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。 |
down | 标记服务器永久停机了。 |
注意:
- 在轮询中,如果服务器down掉了,会自动剔除该服务器。
- 缺省配置就是轮询策略。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
- 会存在状态服务信息不共享问题,如session。
2.加权轮询
在轮询策略上添加了权重(weight)的概念。权重越高,被访问的几率越高。
upstream tortoise_upstream {
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=4;
server 127.0.0.1:8083;
server 127.0.0.1:8084 backup;
server 127.0.0.1:8085 max_fails=5 fail_timeout=30s;
}
注意:
- 权重越高分配到需要处理的请求越多。
- 此策略可以与 least_conn 和 ip_hash 结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况。
- 会存在状态服务信息不共享问题,如 session。
3.ip_hash
nginx 根据客户端请求 ip 地址进行 hash 换算来分配服务器,可以确保相同客户端请求一直访问同一台服务器。解决了其他负载均衡策略状态服务信息不共享的问题。
upstream tortoise_upstream {
ip_hash;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=4;
server 127.0.0.1:8083;
server 127.0.0.1:8084 max_fails=5 fail_timeout=30s;
}
注意:
- 在 nginx 版本1.3.1之前,不能在 ip_hash 中使用权重(weight)。
- ip_hash 不能与 backup 同时使用。
- 此策略适合有状态服务,比如 session。
- 当有服务器需要剔除,必须手动 down 掉。
4.least_conn
least_conn 策略把请求转发给连接数较少的服务器。轮询算法是把请求平均分发给各个服务器,是每台服务器负载基本相同;但是,在实际业务中,会存在某些请求时间很长的情况,这样会导致在某个时间,当前服务器负载过大。least_conn 策略就比较适合这种情况。
upstream tortoise_upstream {
least_conn;
server 127.0.0.1:8081 weight=2;
server 127.0.0.1:8082 weight=4;
server 127.0.0.1:8083;
server 127.0.0.1:8084 backup;
server 127.0.0.1:8085 max_fails=5 fail_timeout=30s;
}
注意:
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
- 会存在状态服务信息不共享问题,如 session。