君玉自牧 君玉自牧
首页
  • Linux
  • Nginx
  • MySQL
  • Redis
  • Kafka
  • Docker
  • Jenkins
  • Oneindex
  • Bitwarden
  • Confluence
  • Photogallery
  • 智能手机
  • 上古卷轴
  • 健身记录
  • 站点相关
  • 未完待续
GitHub (opens new window)
首页
  • Linux
  • Nginx
  • MySQL
  • Redis
  • Kafka
  • Docker
  • Jenkins
  • Oneindex
  • Bitwarden
  • Confluence
  • Photogallery
  • 智能手机
  • 上古卷轴
  • 健身记录
  • 站点相关
  • 未完待续
GitHub (opens new window)
  • 技术架构

  • 桌面维护

  • 网络工程

  • 系统运维

    • Linux

    • Apache

    • Nginx

      • Nginx 安装部署 & 项目实践
      • Nginx 反向代理
      • Nginx 负载均衡
        • 实现原理
        • 转发策略
          • 设置权重
          • ip_hash
          • least_conn
        • 其他策略
          • fair
          • url_hash
      • Nginx 动静分离
      • Nginx 其他技巧
      • 高可用实现:Keepalived
    • MySQL

    • Redis

    • MQ

    • ELK

    • Nacos

    • PostgreSQL

    • MongoDB

  • 环境搭建

  • 容器编排

  • 持续集成

  • 监控告警

  • 项目实践

  • 脚本开发

  • 前端开发

  • 后端开发

  • 效率工具

目录

Nginx 负载均衡

  • 转发功能:按照指定的规则进行轮询将请求转发给所有应用服务器,减轻单机压力,提高并发量
  • 故障移除:通过心跳检测判断应用服务器状态,自动标记宕机服务器并将请求发送给其他应用服务器
  • 恢复添加:检测到发生故障的应用服务器恢复正常,会自动将其添加到处理用户请求的服务器集群中

# 实现原理

Nginx 利用自身反向代理功能,在conf配置文件中添加反向代理地址,以代理服务器的身份接受客户端发送过来的请求,然后将请求转发给内部网络上的应用服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器,不过它只负责转发请求,不负责处理。

值得注意的是,Nginx 默认只支持七层代理转发(基于 HTTP),负载均衡需要从四层进行代理转发(基于 TCP/UDP),也就需要在编译安装时增加相应的参数

./configure --with-stream
make && make install
1
2

# 转发策略

客户端请求由多个服务器进行处理,客户端请求默认按时间顺序依次转发(轮询)到不同的应用服务器,并且会自动剔除停机的后端服务

参数 说明
weight 默认为 1,数值越大,负载的权重就越大
max_fails 请求超时次数,默认为 1,与 fail_timeout 结合使用
fail_timeout 请求超时时间,与 max_fails 结合使用
backup 标记为备用服务器,其他服务器忙碌时,请求会被转到这里
down 标记为服务器停机,不参与负载
upstream hyperf {
  server 127.0.0.1:9501 weight=1 max_fails=3 fail_timeout=10s;
  server 127.0.0.1:9502 weight=1 max_fails=3 fail_timeout=10s;
  server 127.0.0.1:9503 weight=1 max_fails=3 fail_timeout=10s;
  server 127.0.0.1:9504 weight=1 max_fails=3 fail_timeout=10s;
  server 127.0.0.1:9505 weight=1 max_fails=3 fail_timeout=10s;
}

server {
  listen			80;
  listen			443 ssl http2;
  listen			[::]:443 ssl http2;
  server_name			api.yuwei.cc;

  ssl_certificate		/etc/nginx/ssl/api.yuwei.cc.pem;
  ssl_certificate_key		/etc/nginx/ssl/api.yuwei.cc.key;

  access_log  /dev/null;
  error_log   /var/log/nginx/error_api.yuwei.cc.log;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://hyperf;
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 设置权重

指定轮询几率,即 weight

upstream hyperf {
  server 127.0.0.1:9501 weight=3;
  server 127.0.0.1:9502 weight=2;
  server 127.0.0.1:9503;
  server 127.0.0.1:9504;
  server 127.0.0.1:9505 weight=2;
}
......
1
2
3
4
5
6
7
8
  • 权重越高分配到需要处理的请求越多
  • 可以与 least_conn 和 ip_hash 结合使用
  • 比较适合服务器的硬件配置差别比较大的情况

# ip_hash

请求按访问 ip 的 hash 分配,每个访客会固定访问一个后端服务,可以解决 Session 不能跨服务器的问题

upstream hyperf {
  ip_hash;
  server 127.0.0.1:9501 weight=1;
  server 127.0.0.1:9502 weight=2;
  server 127.0.0.1:9503 weight=3;
  server 127.0.0.1:9504 weight=4;
  server 127.0.0.1:9505 weight=5;
}
......
1
2
3
4
5
6
7
8
9
  • nginx v1.3.1 之前的版本不能在 ip_hash 中使用权重(weight)
  • ip_hash 不能与 backup 同时使用
  • 此策略适合有状态服务,比如 Session
  • 当有服务器需要剔除,必须手动 down 掉

# least_conn

选取活跃连接数与权重的比值最小的服务器处理下一个请求,上一次已选和已达到最大连接数的不在选择范围; 适合请求处理时间长短不一造成服务过载的情况

upstream hyperf {
  least_conn;
    server 127.0.0.1:9501 weight=1;
  server 127.0.0.1:9502 weight=2;
  server 127.0.0.1:9503 weight=1;
  server 127.0.0.1:9504 weight=1
    server 127.0.0.1:9505 weight=1;
}
......
1
2
3
4
5
6
7
8
9

# 其他策略

以下策略已经十多年没更新,不确定新版 Nginx 能正常用,建议忽略

# fair

需要在编译安装时添加 nginx-upstream-fair (opens new window) 模块,Nginx 官网 (opens new window)

./configure --add-module=/absolute/path/to/nginx-upstream-fair
make && make install
1
2

请求按响应时间来分配,响应时间短的优先分配

upstream hyperf {
  fair;
  server 127.0.0.1:9501;
  server 127.0.0.1:9502;
  server 127.0.0.1:9503;
  server 127.0.0.1:9504;
  server 127.0.0.1:9505;
}
......
1
2
3
4
5
6
7
8
9

# url_hash

需要在编译时添加 nginx_upstream_hash (opens new window) 模块

./configure --add-module=/path/to/this/directory
make && make install
1
2

请求按访问 URL 的 hash 分配,使每个 URL 定向到同一个后端服务,后端服务为缓存时比较有效

upstream hyperf {
  #在 upstream 中加入 hash 语句,server 语句中不能写入 weight 等其他的参数,hash_method 是使用 hash 算法
  hash $request_uri;
  hash_method crc32;
  server 127.0.0.1:9501;
  server 127.0.0.1:9502;
  server 127.0.0.1:9503;
  server 127.0.0.1:9504;
  server 127.0.0.1:9505;
}
......
1
2
3
4
5
6
7
8
9
10
11

Nginx TCP 负载均衡原理上和 LVS 等是一致的,工作在更为底层,性能比 HTTP 负载均衡高不少;
不过比不上 LVS,Nginx 工作在用户态,LVS 直接是内核模块,Nginx 相对比较重。

网页编辑 (opens new window)
最近提交: 2023/03/22, 11:52:35
Nginx 反向代理
Nginx 动静分离

← Nginx 反向代理 Nginx 动静分离→

Theme by Vdoing | Copyright © 2011-2023 | 君玉自牧
粤ICP备15057965号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式