Nginx - 负载均衡及其配置(Balance)
一、概述
定义
:在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载目标
:最佳化资源使用、最大化吞吐率、最小化响应时间、避免过载功能
:使用多台服务器提供单一服务(服务器农场)- ⭐ 工作流程
- 负载均衡器(server)监听 1~n 个外部端口(port)
- 客户端访问端口,向服务器(server)发起请求
- 负载均衡器根据负载均衡策略选择后端内网服务器(upstream)
- 负载均衡器将用户请求发送到选定的后端内网服务器(upstream)
- 内网服务器将请求的响应返回给负载均衡器(server)
- 负载均衡器再将响应发送到客户端
- 优点
- 安全性:向客户端隐藏内网结构,阻止了用户直接访问后台(内网)服务器,可以阻止对核心网络栈和运行在其它端口服务的攻击
- 可用性:当所有后台服务器出现故障时,负载均衡器转发请求到一个备用的负载均衡器、显示一条关于服务中断的消息等,提高容错能力
二、上游服务器组(upstream)
⭐ 调度算法
算法 | 说明 |
---|---|
轮询(默认) | 请求按时间顺序逐一分配到不同的后端服务器,Weight 指定轮询权值,Weight 值越大访问机率越高,用于后端服务器性能不均的情况 |
ip_hash | 按访问 IP 的 hash 结果将请求分配给服务器,来自同一个 IP 的访客固定访问一个后端服务器,解决动态网页的 session 共享问题 |
fair | 根据后端服务器的响应时间来分配请求,响应时间短的优先分配(必须下载 Nginx 的 upstream_fair 模块) |
url_hash | 按访问 url 的 hash 结果将请求分配给服务器,每个 url 定向到同一个后端服务器,进一步提高后端缓存服务器的效率 |
least_conn | 将请求转发给当前连接数最少的后端服务器,能够有效地将请求分配给负载较轻的服务器 |
hash |
状态参数
状态参数 | |
---|---|
down | 当前服务器废了,当前的 server 暂时不参与负载均衡 |
backup | 预留的备份机器,当所有非 backup 机器故障或者繁忙时,才会请求 backup 机器,因此这台机器的压力最轻 |
max_fails | 允许请求失败的次数,默认为 1,当超过最大次数时,返回 proxy_next_upstream 模块定义的错误 |
fail_timeout | 经历 max_fails 次失败后,暂停服务的时间 |
注意:负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能有 backup server,因为ip_hash不会基于可用性分配,仍会分给目标服务器
backup 服务器
-
功能:所有服务器都不能提供服务时,避免降低用户体验,配置 backup 服务器显示错误信息
-
backup server 配置
- backup upstream 服务器错误时的备份服务器
- localhost:8080 upstream 服务器错误时访问的 IP 和端口号
- /data/www/errorpage/index.html:错误时显示的页面的地址
-
示例
upstream webservers { server 192.168.18.201 weight=1 max_fails=2 fail_timeout=2; server 192.168.18.202 weight=1 max_fails=2 fail_timeout=2; server 127.0.0.1:8080 backup; } server { listen 8080; server_name localhost; root /data/www/errorpage; index index.html; } server { ... }
三、示例
-
功能
- 设置一个 backend 上游服务器组
- 设置一个 backup 备份服务器
-
代码实现
# 定义一个名为 `backend` 的上游服务器组 upstream backend { # 定义负载均衡算法,这里使用 `least_conn` 算法 least_conn; # 定义上游服务器,并设置不同的状态参数 server backend1.example.com weight=3 max_fails=2 fail_timeout=30s; server backend2.example.com weight=2 max_fails=3 fail_timeout=30s; server backend3.example.com weight=1 max_fails=2 fail_timeout=20s; # 定义一个备份服务器,当所有主服务器都不可用时,流量将转发到备份服务器 server backup.example.com backup; } # 定义一个虚拟主机 server { listen 80; server_name www.example.com; # 配置静态文件路径 location / { root /data/www; index index.html; } # 配置负载均衡 location /api/ { # 将所有 /api/ 开头的请求代理到 `backend` 上游服务器组 proxy_pass <http://backend>; # 传递必要的头部信息给上游服务器 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_set_header X-Forwarded-Proto $scheme; # 设置超时时间和连接选项 proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } # 配置错误页面处理 error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # 配置日志文件 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log warn; }
-
配置解析
- upstream backend
- least_conn: 使用最少连接数算法,优先选择连接数最少的服务器来处理请求。
- 服务器配置:
- weight: 指定服务器的权重,权重越高,被选中的概率越大。
- max_fails: 允许的最大失败尝试次数,超过这个次数后,服务器将被标记为不可用。
- fail_timeout: 如果服务器达到 max_fails 限制,将在指定的时间段内被标记为不可用。
- 备份服务器: 当所有主服务器都不可用时,请求将被转发到备份服务器 backup.example.com。
- server:
- 监听端口: 配置监听在 80 端口。
- 静态文件路径: 配置根目录为 /data/www,默认首页为 index.html。
- 负载均衡配置: 将 /api/ 路径下的请求代理到 backend 上游服务器组。
- 头部信息传递: proxy_set_header 指令用于传递客户端请求的头部信息到上游服务器。
- 超时和缓冲设置: 配置请求超时时间和缓冲区大小,以优化代理请求的性能。
- 错误页面处理: 当发生 500、502、503 或 504 错误时,重定向到 /50x.html 错误页面。
- 日志文件: 配置访问日志和错误日志的存储路径及日志级别。
- upstream backend