Nginx 负载均衡算法

本贴最后更新于 1960 天前,其中的信息可能已经事过景迁

Nginx 是一个高性能的 HTTP 和反向代理服务,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

当 Nginx 作为代理服务,后端可支持的应用也是多种类型的,比如基于 python 的 uwsgi、php 的 fastcgi 以及 TCP、HTTP、UDP 等协议;

1 配置 NGINX 代理后端应用

1.1 代理 uwsgi

upstream service {
   server localhost:8888;
   server 192.168.0.2:8889;
   server example.shiguofu.cn:8899;
}

server {
   location /app/service{
      uwsgi_pass service;
      include uwsgi_params;   #uwsgi参数表,在/etc/nginx/目录
   }
}

以上配置表示,主要使用 nginx 的指令 uwsgi_pass,使用 Nginx 的 uwsgi 模块将匹配到 location 的路径转发到有 upstream 块级指令代理的 uwsgi 服务,这里默认是轮询的方式;
所有的 uwsgi 服务在 upstream 中由 server 指令完成,server 指令接收 UNIX 套接字、IP 地址、FQDN 名及一些可选参数,参数下文会提及;

1.2 代理 HTTP

upstream service {
   server localhost:8888;
   server 192.168.0.2:8889;
   server example.shiguofu.cn:8899;
}

server {
   location /app/service{
      proxy_pass http://service;
      include proxy_params;      
   }
}

使用 Nginx 的 porxy_pass 指令,将匹配 location 的路径的请求转发到 upstream 块级指令代理的 HTTP 服务,同样采用轮询的方式;
所有的 HTTP 服务在 upstream 中由 server 指令完成,server 指令接收 UNIX 套接字、IP 地址、FQDN 名及一些可选参数,参数下文会提及;
不同的地方在于 proxy_pass 要加上 http,因为 upstream 并没有指定协议;

1.3 代理 fastcgi 协议

upstream service {
   server localhost:8888;
   server 192.168.0.2:8889;
   server example.shiguofu.cn:8899;
}

server {
   location /app/service{
      fastcgi_pass http://service;
      include fastcgi_params;       #fastcgi参数表,在/etc/nginx/目录
   }
}

使用 Nginx 的 fastcgi_pass 指令,将匹配 location 的路径的请求转发到 upstream 块级指令代理的 HTTP 服务,同样采用轮询的方式;
所有的 fastcgi 服务在 upstream 中由 server 指令完成,server 指令接收 UNIX 套接字、IP 地址、FQDN 名及一些可选参数,参数下文会提及;

1.4 代理 TCP

stream {
   upstream mysql_backend{
      server localhost:3306;
	   server mysql.shiguofu.cn:3306;
   }
   server{
     listen 3307;
     proxy_pass mysql_backend;
   }
}

使用 Nginx 的 stream 块指令,它与 http 指令同一级别,写的时候要注意,在 ubuntu 系统中,http 块写在/etc/nginx/nginx.conf 中;因此笔者当时在/etc/nginx/nginx.conf 中添加的这段配置;

访问服务器的 3307 端口,测试 OK

root@VM-0-15-ubuntu:/etc/nginx# mysql -h 127.0.0.1 -P 3307 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 27868
Server version: 5.7.23-0ubuntu0.16.04.1-log (Ubuntu)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

2 Nginx 负载均衡

Nginx 能够广泛使用,不仅是因为它可以作为代理服务,它还提供了适应于不同业务的负载均衡算法以及判断目标服务的可用性等强大的功能;

2.1 轮询算法

最简单的算法,也是 Nginx 默认的负载均衡算法;

upstream service {
   server localhost:8888 weight=1 max_fails=3 fail_timeout=30;
   server 192.168.0.2:8889 weight=2;
   server tbk.shiguofu.cn:80 backup;
}

server {
   location /app/service{
      proxy_pass http://service;
      include proxy_params;      
   }
}

以上配置是在轮询的基础上,增加了权重的配置,在上面示例中,Nginx 会将三个请求中的两个分发到 8889 端口对应的服务,将另一个请求分发到本地的 8888 端口的服务,并将将 tbk.shiguofu.cn 上的服务作为备用,当分发请求失败会启用备份服务;

  1. 使用 Nginx 的指令 weight 指令为轮询的 service 配置权重;
  2. max_fails 与 fail_timtou 为服务的高可用配置;表示在 30 秒内如果有 3 个失败的请求,则认为该服务已经宕掉,在这 30 秒结束之前不会有新的请求会发送到对应的服务上;等这 30 秒结束后,Nginx 会尝试发送一个新的请求到该服务,如果还是失败,则等待 30 秒...以此循环;

2.2 最少连接数

upstream service {
   least_conn;
   server localhost:8888;
   server 192.168.0.2:8889;
   server tbk.shiguofu.cn:80;
}

上面的 least_conn 指令为所负载的应用服务指定采用最少连接数负载均衡;
它会将访问请求分发到 upstream 所代理的服务中,当前打开连接数最少的应用服务器;它同时支持轮询中的 weight、max_fails、fail_timeout 选项,来决定给性能更好的应用服务器分配更多的访问请求;

2.3 最短响应时间

upstream service {
   least_time;
   server localhost:8888;
   server 192.168.0.2:8889;
   server tbk.shiguofu.cn:80;
}

该指令 least_time 仅仅在 NGINX PLUS 版本中支持,不多说。

2.4 散列算法

分为通用散列算法与 ip 散列算法;

upstream service {
   hash $host;
   server localhost:8888;
   server 192.168.0.2:8889;
   server tbk.shiguofu.cn:80;
}

通过 hash 指令实现,根据请求或运行时提供的文本、变量或者其他变量的组合生成散列值;
一般情况, 在需要对访问请求进行负载可控,或将访问请求负载到已经有数据缓存的应用服务的场景下,该算法会非常有用;
需要注意的是,在 upstream 中有应用服务的加入或者删除时,会重新计算散列值进行分发;

upstream service {
   ip_hash;
   server localhost:8888;
   server 192.168.0.2:8889;
   server tbk.shiguofu.cn:80;
}

指令 ip_hash 实现,通过计算客服端的 ip 地址来生成散列值。

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 34 关注
  • 负载均衡
    7 引用 • 4 回帖
  • 配置
    15 引用 • 159 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...