0. 前言

  关于Nginx负载均衡的简单配置,我以前博客配置过基于HTTP的负载均衡。这次的负载均衡有点不一样,就是基于TCP的负载均衡。基于HTTP负载均衡是默认的Nginx版本支持的,配置也很简单,但是基于TCP的负载均衡,配置起来就有一点点麻烦了。

1. 下载安装

  由于我们要用到四层TCP层负载均衡,所以要自己编译Nginx,在这里下载最新版 http://nginx.org/download/nginx-1.12.2.tar.gz  中间我们可能要进行调试一些参数,可以下载这个扩展 git clone https://github.com/openresty/echo-nginx-module

  然后编译

 ./configure --prefix=/root/workspace/emq/nginx --with-stream --add-module=/root/workspace/emq/nginx-1.12./echo-nginx-module --with-http_geoip_module

  可能会要求安装这个libgeoip-dev包 apt-get install libgeoip-dev 由于我只是需要用到里面的geo扩展,不需要对应的信息,如果有需要的可以在这里下载数据包 http://dev.maxmind.com/geoip/legacy/downloadable/ https://www.cnblogs.com/kevingrace/p/6165572.html

  当出现上图信息,表示编译成功

 make && make install

2. 增加虚拟网卡

  一种是临时增加,一种是配置到开机启动

 ifconfig eth1: 172.16.23.111 netmask 255.255.255.0 up
ifconfig eth1: down

  vim /etc/network/interfaces  增加后重启网卡

 auto lo
iface lo inet loopback auto eth1
iface eth1 inet static
address 172.16.23.204
netmask 255.255.255.0
gateway 172.16.23.1 #auto eth1:
#iface eth1: inet static
# address 172.16.23.104
# netmask 255.255.255.0
# gateway 172.16.23.1

3. nginx.conf 配置文件

 user root;

 worker_processes auto;

 events {
worker_connections ;
} stream { upstream backend {
server 172.16.20.217:;
server 172.16.20.217:;
} upstream backbind {
server 172.16.23.203:;
} map $msec $proxy_bind_ip {
~[-]$ 172.16.23.111;
~[-]$ 172.16.23.204;
} server {
listen ;
proxy_pass backend;
proxy_bind $proxy_bind_ip;
}
} http {
geo $LB {
default ;
     #include conf/geo.conf
172.16.20.217 ;
172.16.20.218 ;
}
map $LB $proxy_bind_ip {
172.16.23.111;
172.16.23.204;
}
map $msec $proxy_bind_ip_2 {
~[-]$ 172.16.23.111;
~[-]$ 172.16.23.204;
}
server {
listen ;
location /test {
echo $proxy_bind_ip;
echo $proxy_bind_ip_2;
echo $connection;
echo "hostname" $hostname;
echo "msec" $msec;
echo "pid" $pid;
echo "proxy_protocol" $proxy_protocol_addr ":" $proxy_protocol_port;
echo "remote:" $remote_addr ":" $remote_port;
echo "server:" $server_addr ":" $server_port;
echo "status:" $status;
echo "time:" $time_iso8601;
echo "time:" $time_local;
}
}
}

  增加nginx的echo模块、geo模块、stream模块

  一开始调试时,使用http{}进行调试,因为访问 http://127.0.0.1:8888/test 就可以进行变量调试了,以为不清楚map的语法,所以只能一点一点调试。

  upstream {} 后端负载均衡器

  map {} 变量映射

  geo {} IP过滤等功能

  server {} 服务器配置

  更多功能这里不做描述,网上资料更多更全。

4. 测试

  从上面两个图可以看到,创建两个服务监听应用

  172.16.23.217:60000 172.16.23.217:60001 这两个模拟的是实际应用中的后端业务应用(MQTT集群)

  TCP Client 创建5个连接,模拟不同客户端(MQTT设备)

  172.16.23.204:12345 172.16.23.111:12345 这两个是负载均衡器Nginx监听的端口。

  5个客户端连接连到Nginx负载均衡器,Nginx会随机负载到60000和60001两台后端应用服务,并且也会随机使用Nginx的虚拟网卡204或111

物联网架构成长之路(10)-Nginx负载均衡的更多相关文章

  1. 【架构师之路】Nginx负载均衡与反向代理—《亿级流量网站架构核心技术》

    本篇摘自<亿级流量网站架构核心技术>第二章 Nginx负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台.几十台.几百台.然而,用 ...

  2. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  3. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  4. 物联网架构成长之路(9)-双机热备Keepalived了解

    1. 前言 负载均衡LB,高可用HA,这一小结主要讲双机热备方案保证高可用.这里选择Keepalived作为双机热备方案,下面就对具体的配置进行了解.2. 下载Keepalived wget http ...

  5. 物联网架构成长之路(43)-k8s从入门到放弃

    0. 前言 这段时间要入门一下CI/CD了,以前简单的了解过Jenkins,现在要把以下的这个图的架构搭建起来.国外可能一两个命令就安装完成的事情,我折腾了2天多,真的差点放弃了. 1. 安装Virt ...

  6. 物联网架构成长之路(33)-EMQ数据存储到influxDB

    一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...

  7. 物联网架构成长之路(29)-Jenkins环境搭建

    0. 说明 哈哈,前面中间插入了一篇Eclipse增加Git插件,在此之前真的没有用过GIT. 1. 运行Jenkins 这里为了方便,还是用Docker方式安装,由于这个是标准的war报,不对Doc ...

  8. 物联网架构成长之路(11)-Redis缓存主从复制

    1. 说明 在我的物联网平台框架框架中,会用到Redis这个中间件.作为EMQ权限认证的缓存.https://www.cnblogs.com/think-in-java/p/5123884.html ...

  9. 物联网架构成长之路(13)-SpringBoot入门

    1. 前言 下载最新版的JavaEE eclipse-jee-oxygen-2-win32-x86_64.zip 安装STS插件 Window->Eclipse Marketplace -> ...

随机推荐

  1. 011 处理模型数据时@ModelAttribute的使用

    一:说明 1.使用场景 在下面的场景中: 使用new对象时,最后的效果是两个被赋值了,但是还有一个值是空值的,这个不符合只更新两个值,另一个值不变的情况. 正确的做法: 三个值得数据不是new出来的, ...

  2. 每天减一半。问多少天这个绳子会小于5米?进而得while和for的关系

    一:前提 1.程序 2.结果 3.使用 for的条件只要>5 变化的条件是x/=2 4.进而使用while,得第二种方法 5.结果相同 二:结论 程序可以使用for的必将可以使用while. 其 ...

  3. Pathon1 - 基础1

    一. Hello world程序 print("Hello World!") 执行命令: python hello.py ,输出 执行 python hello.py 时,明确的指 ...

  4. hdu 6185 递推+【矩阵快速幂】

    <题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...

  5. docker 搭建nginx

    docker pull nginx 先用docker 去把镜像拉下来 $ docker run --name tmp-nginx-container -d nginx $ docker cp tmp- ...

  6. Coredata 单表简单使用

    ** 使用Coredata 工程中的DataModel创建:系统创建.手动创建** ** 使用Coredata需要要导入<CoreData/CoreData.h> ** 1.系统创建(系统 ...

  7. i春秋 “百度杯”CTF比赛 十月场 web题 Backdoor

    0x00: 打开题目,题目中告诉我们这题是文件泄露. 0x01: 通过扫描目录,发现可以扫到的有3个文件 index.php flag.php robots.txt 但是浏览flag.php它告诉我们 ...

  8. vue-particles粒子动画效果

    1.安装vue-particles依赖包 npm install vue-particles --save-dev 2.在main.js文件中引入并使用 import Vue from 'vue' i ...

  9. CODEVS.3990.中国余数定理2(CRT)

    题目链接 颓了一天 写个模板吧.. Chinese_Remainder_Theorem: MashiroSky.远航之曲 #include <cstdio> #include <cc ...

  10. [USACO11FEB]Generic Cow Protests

    思路: 动态规划.首先处理出这些数的前缀和$a$,$f_i$记录从第$1$位到第$i$位的最大分组数量.DP方程为:$f_i=max(f_i,f_j+1)$,其中$j$满足$a_i-a_j≥0$. # ...