跳到主要内容

二十一、Nginx 负载均衡模块

负载均衡模块

负载均衡模块用于从upstream指令定义的后端主机列表中选取一台主机。Nginx 先使用负载均衡模块找到一台主机,再使用 upstream 模块实现与这台主机的交互。为了方便介绍负载均衡模块,做到言之有物,以下选取 Nginx 内置的 ip hash 模块作为实际例子进行分析。

配置

要了解负载均衡模块的开发方法,首先需要了解负载均衡模块的使用方法。因为负载均衡模块与之前书中提到的模块差别比较大,所以我们从配置入手比较容易理解。

在配置文件中,我们如果需要使用 ip hash 的负载均衡算法。我们需要写一个类似下面的配置:

upstream test {
ip_hash;
server 192.168.0.1;
server 192.168.0.2;

从配置我们可以看出负载均衡模块的使用场景:

1、 核心指令ip_hash只能在upstream{}中使用这条指令用于通知Nginx使用iphash负载均衡算法如果没加这条指令,Nginx会使用默认的roundrobin负载均衡模块请各位读者对比handler模块的配置,是不是有共同点?;
2、 upstream{}中的指令可能出现在server指令前,可能出现在server指令后,也可能出现在两条server指令之间各位读者可能会有疑问,有什么差别么?那么请各位读者尝试下面这个配置:;

upstream test {
server 192.168.0.1 weight=5;
ip_hash;
server 192.168.0.2 weight=7;

神奇的事情出现了:

nginx: [emerg] invalid parameter "weight=7" in nginx.conf:103
configuration file nginx.conf test failed

可见ip_hash 指令的确能影响到配置的解析。

指令

配置决定指令系统,现在就来看 ip_hash 的指令定义:

static ngx_command_t  ngx_http_upstream_ip_hash_commands[] = {
{ ngx_string("ip_hash"),
NGX_HTTP_UPS_CONF|NGX_CONF_NOARGS,
ngx_http_upstream_ip_hash,
0,
0,
NULL },
ngx_null_command
};