1. 前言

nginx有一个最大的功能就是可以实现服务器的负载均衡,本篇博文就利用nginx中的upstream模块来配置一个简单的负载均衡。关于nginx的安装和配置文件可以查阅博文:windows下安装nginx和基本配置,这里不再赘述。

2. 什么是负载均衡

所谓负载均衡,就是nginx可以配置代理多台服务器主机,当前端页面的请求到来时,nginx可以在多台服务器主机中选择一个当前负载压力较小的服务器,然后将该访问请求转发给被选择的服务器,这样就保证了当用户访问前端页面时,后端服务器集群中的每个服务器负载压力趋于平衡,分担了服务器压力,不至于累得累死,闲的闲死。

那么要实现负载均衡,就少不了nginx中的负载均衡模块upstream,负载均衡模块用于从nginx配置文件中的upstream指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。

说了这么多,不如直接看代码!

3. 具体配置

3.1 基本配置

  1. 首先在nginx.conf配置文件中的http节点内增加upstream节点,如下:

    http {
    # ...
    upstream demo {
    server 127.0.0.1:9000;
    server 127.0.0.1:9002;
    }
    # ...
    }

    上面的代码表示:我们选取了两个服务器主机,分别是127.0.0.1:9000127.0.0.1:9002,这两个主机就是我们准备用来接收前端请求的负载机,当然你有多个负载机都可以写入里面。

  2. 然后我们在server节点中配置反向代理,让前端的请求能够代理到上面配置的负载机上,如下:

    server {
    # ...
    location / {
    root html;
    index index.html index.htm;
    proxy_pass http://demo;
    }
    # ...
    }

    注意:这里的proxy_pass配置应为http://+upstream名称。

OK,负载均衡的基本配置就已经配置好了,接下来我们写一个demo来看看效果。

3.2 基本配置demo

首先,我们用node.js分别起了两个后端服务,代码如下:

// 127.0.0.1:9000

const express = require("express");
const app = express(); const router = express.Router(); router.get("/", function(req, res) {
res.json({
msg: `这是来自9000端口的响应`
});
}); app.use(router); const port = process.env.PORT || 9000;
module.exports = app.listen(port, () => {
console.log(`Server listening on http://localhost:${port}, Ctrl+C to stop`);
});
// 127.0.0.1:9002
const express = require("express");
const app = express(); const router = express.Router(); router.get("/", function(req, res) {
res.json({
msg: `这是来自9002端口的响应`
});
}); app.use(router); const port = process.env.PORT || 9002;
module.exports = app.listen(port, () => {
console.log(`Server listening on http://localhost:${port}, Ctrl+C to stop`);
});

分别在命令行中将这两个后端服务都起起来,然后按照上面基本配置方法配置好nginx,切记,修改过nginx配置文件后一定要nginx -s reload重启nginx哦。好了,我们打开浏览器看下效果:

上图中我们可以看到:当我们每刷新一次浏览器,就相当于发了一次访问请求,nginx将请求分别转发给了配置的两个负载机,从而页面上交替显示来自两个负载机的响应。

这就达到了两个负载机负载均衡的效果。

3.3 详细配置——ip_hash权重

上面的配置虽然基本实现了负载均衡,但是存在一个问题,就是我们的应用程序往往都会做用户的身份鉴别,即session会话控制,上面的配置方法不能保证把这次请求和下一次请求发送到同一台机器上,所以我们需要让每个请求第一次访问哪个服务器后就记录,之后再访问都是该服务器,这就需要使用到ip_hash了,配置如下:

upstream demo {
ip_hash;
server 127.0.0.1:9000;
server 127.0.0.1:9002;
}

当配置了ip_hash后,每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

demo如下:

我们可以看到,当配置了ip_hash后,响应的负载机就被固定下来了。

3.4 详细配置——weight权重

基本配置中每个负载机都是轮询响应的,但是在实际中,每个负载机的性能有高有低,我们更希望性能高的设备多承担一些负载,性能低的少承担一些,这就需要给负载机配置权重weight了,weight和访问比率成正比,weight值越高,被访问到的频率越高。配置如下:

upstream demo {
ip_hash;
server 127.0.0.1:9000 weight=10;
server 127.0.0.1:9002 weight=80;
}

demo如下:

我们可以看到,当配置了权重weight后,本该按照轮询顺序响应的9000负载机由于权重比9002低,所以响应被9002代理了。

3.5 详细配置——fair

weight分配策略相似。weight是按照负载机权重不同从而分配请求,而fair则是以负载机响应时间来分配请求,响应时间短的优先分配。配置如下:

upstream demo {
server 127.0.0.1:9000;
server 127.0.0.1:9002;
fair;
}

为了测试这一功能,我们将基本配置里的写好的后端服务做一下修改,我们给两个后端响应加个定时器,让9002服务器1秒后响应,让9000服务器3秒后响应,代码如下:

// 127.0.0.1:9000
setTimeout(()=>{
res.json({
msg: `这是来自9000端口的响应`
});
},3000) // 127.0.0.1:9002
setTimeout(()=>{
res.json({
msg: `这是来自9002端口的响应`
});
},1000)

demo如下:

我们可以看到,当配置了fair后,本该按照轮询顺序响应的9000负载机由于响应时间比9002长,所以响应被9002代理了。

3.6 详细配置——url_hash

url_hash按访问urlhash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。例如,在实际中有时候只有一台服务器上存储了用户的登录信息,因此我们需要把用户登录的所有请求都转发给这一台服务器。配置如下:

upstream demo {
server 127.0.0.1:9000;
server 127.0.0.1:9002;
hash $request_uri; # $request_url为nginx变量 表示请求url
hash_method crc32;
}

3.7 详细配置——down

当给某一负载机配置了down属性后,表示该负载机不参与负载,配置如下:

upstream demo {
server 127.0.0.1:9000 down;
server 127.0.0.1:9002;
}

3.8 详细配置——backup

backup表示备用的意思,当其他全部非backup负载机down或者忙的时候,此时backup负载机 就会接受负载,配置如下:

upstream demo {
server 127.0.0.1:9000 down;
server 127.0.0.1:9002;
server 127.0.0.1:9003 backup;
}

4. 总结

以上就是nginx中的负载均衡模块upstream的一些配置,下面给出一个基本负载均衡配置:

upstream demo{
ip_hash;
server 127.0.0.1:9000 down;
server 127.0.0.1:9001 weight=2;
server 127.0.0.1:9002;
server 127.0.0.1:9009 backup;
}

(完)

利用Nginx中的Upstream模块配置服务器负载均衡的更多相关文章

  1. Nginx 部署、反向代理配置、负载均衡

    Nginx 部署.反向代理配置.负载均衡 最近我们的angular项目部署,我们采用的的是Nginx,下面对Nginx做一个简单的介绍. 为什么选择Nginx 轻:相比于Apache,同样的web服务 ...

  2. linux下nginx【反向代理】配置【负载均衡】配置

    nginx 可以配置多个端口: 1.10088端口 配置反向代理,消除跨域问题. 2.10087端口 配置ip_hash模式的负载均衡,ip_hash可以绕开解决session共享的问题. nginx ...

  3. nginx配置服务器负载均衡

    upstream servers { ip_hash; #hash,ip轮训 server localhost:8400; } server { listen 80; server_name loca ...

  4. 高性能Nginx服务器-负载均衡

    Location正则表达式 location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作. locatio ...

  5. nginx基本配置与参数说明以及Nginx中的upstream轮询机制介绍

    转自:http://blog.csdn.net/happydream_c/article/details/54943802 一.nginx简介 Nginx (发音为[engine x])专为性能优化而 ...

  6. Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

    通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...

  7. [转]CENTOS 6.5 配置YUM安装NGINX+服务器负载均衡

    原文连接: CENTOS 6.5 配置YUM安装NGINX  http://blog.sina.com.cn/s/blog_69f467b70102uyux.html 参考博文: Centos下安装. ...

  8. 善于利用python中的os模块

    作为一个程序猿,平时善于利用python中的os模块进行路径等操作,会省去很多麻烦,下面总结一下我平时经常用到的方法: import os os.getcwd() # 获取当前文件所在的目录 os.p ...

  9. Nginx配置及负载均衡

    转载:http://www.cnblogs.com/jingmoxukong/p/5945200.html nginx简易教程   目录 Nginx  概述  安装与使用  nginx 配置实战  参 ...

随机推荐

  1. HTML5 + WebGL 实现的垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...

  2. wildfly(JBoss AS)应用服务器快速入门

    什么是wildfly JBoss AS 从8版本起名为wildfly.Wildfly是一个开源的基于JavaEE的轻量级应用服务器.可以在任何商业应用中免费使用. WildFly是一个灵活的.轻量的. ...

  3. 异常:微信小程序tabBar不生效

    app.json全局tabBar设置tabBar不显示 由于小程序的机制问题,首页的tabBar第一个导航必须是首页 "pages": [ "pages/index/in ...

  4. postman动态数据获取

    1.以获取token(JWT)和uid为例 2.在登录接口的tests中写入代码(因为登录接口报文信息中有返回JWT和uid) 3.在其他接口中需要用到JWT和uid的地方设置变量{{JWT}}和{{ ...

  5. 宝塔面板6.x版本前台存储XSS+后台CSRF组合拳Getshell

    对于宝塔漏洞复现和练习 0×00  什么是宝塔面板 宝塔面板是一款使用方便,功能强大且终身免费的服务器管理软件,支持Linux 与Windows 系统.一键配置:LAMP / LNMP ,网站,数据库 ...

  6. 掌握git基本功

    前言 最近想把代码传到GitHub上,结果我发现的demo的npm全是本地安装,上穿到GitHub要死要死,几百M,然后我就搜了下怎么不上传node_modules弄了半天也没成功,于是准备静下心学一 ...

  7. POJ 3020 Antenna Placement(二分图 匈牙利算法)

    题目网址:  http://poj.org/problem?id=3020 题意: 用椭圆形去覆盖给出所有环(即图上的小圆点),有两种类型的椭圆形,左右朝向和上下朝向的,一个椭圆形最多可以覆盖相邻的两 ...

  8. java学习5-面向对象(下)

    final修饰符: final用于修饰类.变量和方法. final修饰变量时,一旦获得了初始值就不可改变 1.抽象方法和抽象类 抽象方法与抽象类的规则: a.抽象方法和抽象类必须使用abstract修 ...

  9. 16.Nginx HTTPS实践

    1.不做任何修改实现http跳转https(协议间的跳转): return [root@web01 conf.d]# cat url.cheng.com.conf server { listen 80 ...

  10. instruments无法连接,设备查询不到,找不到工程,查询不到对应app

    这种问题真是让人捉急,一定要沐浴更衣,怀着一颗虔诚的心. 1.拔掉设备(iPhone/iPad),关掉设备.(长按电源键) 2.关闭Xcode和Instruments 3.重启设备(iPhone/iP ...