上次说到 nginx 的正向代理和反向代理,而 nginx 负载均衡其主要是利用 nginx反向代理来实现的,也就是表面上我们访问的是这个服务,其实访问的是该服务背后支撑的众多服务器中的其中一台。
比如说全中国同一时间有这么多人同时在访问百度这个网站,那它是怎么能够承受住这么大的访问量呢?这时我们就应该知道百度这个网站的背后其实有很多的服务器在支撑着众多用户的访问。这里就引出一个问题,用户的请求是如何分发给它背后众多的服务器呢?有了需求自然就会有解决方案出来,于是就出现了满足各种需求的负载均衡策略。
今天我们要说的 nginx 它自己就可以实现负载均衡,它有自己内置的一些负载均衡策略,也有第三方扩展的一些负载均衡策略。今天主要说一下 nginx 内置的几种负载均衡策略,主要有四种:轮询(默认)、加权轮询、最少连接 least_conn、IP 哈希 ip_hash,下面将一一进行介绍。
下面是基于 Ubuntu 16.04 系统测试的,采用的 nginx 版本是 nginx/1.12.0。
nginx 安装
首先我们先安装好 nginx 服务器,下载基于 Linux 系统的 nginx/1.12.0 版的 nginx 服务器进行解压编译安装,下面是解压安装命令。
上面安装成功后,nginx 默认安装在目录 /usr/local/nginx/ 下面,当然你也可以自定义安装目录,不过一般不建议这么做,以防以后忘了不知道到哪里去找配置文件,默认就好,安装成功后可以在 /usr/sbin/ 目录下创建一个软链接指向安装成功后的 nginx 启动脚本所在位置,默认是 /usr/local/nginx/sbin/nginx 文件,命令如下:
这样我们就不用每次启动 nginx 服务都切换到 /usr/local/nginx/sbin/ 目录下去执行 nginx 的启动命令,配置好了这些后就可以启动 nginx 服务器进行测试了。
执行上面的启动命令后在浏览器中输入 localhost 后回车出现对应的 nginx 服务器的欢迎页面就表示 nginx 服务器安装成功了,这里我们为了更好的测试首先将 nginx.conf 配置文件中 http 的默认端口 80 改成 10080,改了之后重新启动 nginx 服务器后接着在浏览器中输入 localhost:10080 后回车应该又会出现刚才的欢迎页面了。接下来就开始我们的 nginx 负载均衡策略之旅吧。
轮询(默认)
轮询这个策略是利用 nginx 进行负载均衡时默认采用的策略,也就是最基本的负载均衡配置,打开 /usr/local/nginx/conf/ 目录下的 nginx.conf 配置文件,我们配置一个最简单的负载均衡方式,在配置文件中 http 模块里面也就是和 http 模块里面的 server 模块同级加上以下内容:
然后在 http 模块里面的 server 模块下面的 location 模块加上一行配置,如下:
部分配置文件截图如下:
这样也就配置好了最基本的负载均衡,默认采用轮询策略将请求分发给后台服务器,当我们访问 localhost:10080 这个地址时页面轮流的展示 192.168.1.110 和 192.168.1.111 这两台主机的 nginx 服务器的欢迎页面,这里为了区分这两个欢迎页面需要修改一下这两台主机的 nginx 服务器的欢迎页面信息,欢迎页面默认存放在 /usr/local/nginx/html/ 目录下的 index.html 页面。我们只要稍微修改一下这两台主机的 nginx 欢迎页面使得每次访问的页面都是不同的,便于我们区分访问的是哪台主机的 nginx 服务器。
加权轮询
加权轮询则是在第一种轮询的基础上对后台的每台服务赋予权重,服务器的权重比例越大,被分发到的概率也就越大,配置如下:
上面只是给每个后台服务加上了一个权重比例,拿上面的配置举例:用户将会每访问三次 192.168.1.110 这个服务后访问一次 192.168.1.111 这个服务。这种适合后台的各个服务的性能不一样,这时我们就可以将性能好的服务器权重设置大一些,给性能不怎么样的服务器少点压力。
最少连接 least_conn
最少连接是每次请求都将请求分发给后台服务连接数最少的那台服务上,当然如果还给每台服务配置了权重,那么这时就会将请求分发给连接数和权重比值最小的那台服务,如果连接数和权重的比值都相同的话就会采取轮询的方式进行分发,配置如下:
上面的配置只是加了一个调度策略 least_conn,其他和轮询的方式一样,当然你也可以给每台服务加上权重比例,分发时就会选择 conn / weight 值最小的那台服务,这种方式适合请求处理时间长短不一造成服务器过载的情况。
IP 哈希 ip_hash
ip_hash 这种负载策略是根据客户端 IP 地址的 hash 结果来进行分发,这样的话能够确保每个访客访问后端固定的一台服务器,这种情况对于需要保存用户的 session 信息的应用就很方便了,它避免了同一个用户访问到不同的服务器上产生 session 共享的问题。配置如下:
上面的配置同样只是加了一个调度策略 ip_hash,其他和轮询的方式一样,这里你也可以给每台服务加上权重比例,分发时在该客户端 IP 第一次访问时就会优先选择 weight 值最大的那台服务。
其他配置说明
其实每个后台服务器的配置除了权重 weight 还有一些其他配置,比如说下面的这些配置:
配置说明:
1.weight 的值默认为1,weight 越大,服务器负载的权重就越大,访问的概率越高。
2.down 表示当前服务器暂时不参与负载。
3.backup 表示其它所有的非 backup 服务器 down 或者忙的时候才会请求 backup 服务器,所以这台服务器压力最轻,一般这台服务器当做是备用服务器。
3.max_fails 表示允许请求失败的次数,默认为 1,当超过最大次数时,将会返回proxy_next_upstream 模块定义错误。
4.fail_timeout 表示每次失败后暂停的时间。
到这里就全部介绍完了 nginx 负载均衡内置的一些策略,当然 nginx 还有一些第三方扩展的策略,未完待续………
励志成为一名菜鸟码农,共勉!
领取专属 10元无门槛券
私享最新 技术干货