【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)
说明:很简单一个在HTTP模块中,而另外一个和HTTP 是并列的Stream模块(Nginx 1.9.0 支持)
一、两个模块的最简单配置如下
1、HTTP负载均衡:
http {
include mime.types;
default_type application/octet-stream; upstream live_node {
server 127.0.0.1:;
server 127.0.0.1:;
} server {
listen ;
server_name localhost;
location / {
proxy_pass http://live_node;
}
}
server {
listen ;
server_name localhost;
location / {
root /usr/local/nginx/html2;
index index.html index.htm;
}
} server {
listen ;
server_name localhost;
location / {
root /usr/local/nginx/html3;
index index.html index.htm;
}
}
}
以上测试一个浏览器访问80端口,实现访问不同的server。
2、TCP负载均衡:
stream {
upstream rtmp {
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
server {
listen ; # 需要监听的端口
proxy_timeout 20s;
proxy_pass rtmp;
}
}
以上可以实现一个简单的RTMP流的转发。
二、TCP负载均衡和Http负载均衡的详细解说
1、TCP负载均衡:
nginx-1.9.0 已发布,该版本增加了 stream 模块用于一般的 TCP 代理和负载均衡,ngx_stream_core_module 这个模块在1.90版本后将被启用。但是并不会默认安装,需要在编译时通过指定 --with-stream 参数来激活这个模块。
(1)配置Nginx编译文件参数
./configure --with-http_stub_status_module --with-stream
(2)编译、安装,make,make install .
(3)配置nginx.conf文件
stream {
upstream rtmp {
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
server {
listen ; # 需要监听的端口
proxy_timeout 20s;
proxy_pass rtmp;
}
}
创建最高级别的stream(与http同一级别),定义一个upstream组 名称为rtmp,由多个服务组成达到负载均衡 定义一个服务用来监听TCP连接(如:1935端口),并且把他们代理到一个upstream组的rtmp中,配置负载均衡的方法和参数为每个server;配置些如:连接数、权重等等。
首先创建一个server组,用来作为TCP负载均衡组。定义一个upstream块在stream上下文中,在这个块里面添加由server命令定义的server,指定他的IP地址和主机名(能够被解析成多地址的主机名)和端口号。下面的例子是建立一个被称之为rtmp组,两个监听1395端口的server ,一个监听8089端口的server。
upstream rtmp {
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
注意:你不能为每个server定义协议,因为这个stream命令建立TCP作为整个 server的协议了。
配置反向代理使Nginx能够把TCP请求从一个客户端转发到负载均衡组中(如:rtmp组)。在每个server配置块中 通过每个虚拟server的server的配置信息和在每个server中定义的监听端口(客户端需求的代理端口号,如我推流的的是RTMP协议,则端口号为:1935)的配置信息和proxy_passs 命令把TCP通信发送到upstream的哪个server中去。下面我们将TCP通信发送到rtmp 组中去。
server {
listen ; # 需要监听的端口
proxy_timeout 20s;
proxy_pass rtmp;
}
当然我们也可以采用单一的代理方式:
server {
listen ; # 需要监听的端口
proxy_timeout 20s;
proxy_pass 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
(4)改变负载均衡的方法:
默认nginx是通过轮询算法来进行负载均衡的通信的。引导这个请求循环的到配置在upstream组中server端口上去。 因为他是默认的方法,这里没有轮询命令,只是简单的创建一个upstream配置组在这儿stream山下文中,而且在其中添加server。
1、least-connected :对于每个请求,nginx plus选择当前连接数最少的server来处理:
upstream rtmp {
least_conn;
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
2、least time :对于每个链接,nginx pluns 通过几点来选择server的: 最底平均延时:通过包含在least_time命令中指定的参数计算出来的:
- connect:连接到一个server所花的时间
- first_byte:接收到第一个字节的时间
- last_byte:全部接收完了的时间 最少活跃的连接数:
upstream rtmp {
least_time first_byte;
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
3、普通的hash算法:nginx plus选择这个server是通过user_defined 关键字,就是IP地址:$remote_addr;
upstream rtmp {
hash $remote_addr consistent;
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
2、HTTP负载均衡:
参考文章:
http://freeloda.blog.51cto.com/2033581/1288553
=========================Ubuntu14.0 平台安装OpenResty1.11.2.1============================
下载安装LusJIT:LuaJIT-2.0.4
(更多版本下载地址:http://luajit.org/download.html)
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz
make && sudo make install
编译
出现以上表示编译成功
安装
可以看出安装完成后给了一个软连接到 /usr/local/bin/luajit 下
OpenResty编译或运行时所需要的软件包
apt-get install libreadline-dev libncurses5-dev libpcre3-dev \
libssl-dev perl make build-essential
OpenResty 安装
1、去openresty 的github上下载一个版本 https://github.com/openresty/lua-nginx-module/releases
wget https://openresty.org/download/openresty-1.11.2.1.tar.gz
2、解压源码包,tar xzvf ngx_openresty-1.9.7.1.tar.gz。若你下载的源码包版本不一样,将相应的版本号改为你所下载的即可。
3、切换工作目录到 cd ngx_openresty-1.9.7.1。
4、了解默认激活的组件。OpenResty 官网有组件列表,我们可以参考,列表中大部分组件默认激活,也有部分默认不激活。 默认不激活的组件,我们可以在编译的时激活,后面步骤详说明
5、绝大部分组件已内置在OpenResty安装包中,但也有一部分不包含在内默认并未启用
标准 Lua 5.1 解释器、Drizzle Nginx 模块、 Postgres Nginx 模块 以及 Iconv Nginx 模块 默认并未启用,以下为分别编译选项来开启它们
--with-lua51
--with-http_drizzle_module
--with-http_postgres_module
--with-http_iconv_module
6、使用选项 --with-Components 激活组件,--without 则是禁止组件。 你可以根据自己实际需要选择 with 或 without。
如下命令,OpenResty 将配置安装在 /opt/openresty 目录下(注意使用 root 用户),并激活luajit、http_iconv_module 并禁止 http_redis2_module 组件。检测配置文件信息
sudo ./configure \
--prefix=/opt/openresty \
--with-lua51 --with-http_drizzle_module --with-
luajit --without-http_redis2_module --with-http_iconv_module --with-stream --with-
http_stub_status_module --with-http_xslt_module --with-stream_ssl_module --with-
http_realip_module --with-http_ssl_module --add-module=../stream-lua-nginx-module-
0.0.1/ --add-module=../nginx-rtmp-module-1.1.11/
提示错误:./configure: error: the ngx_drizzle addon requires the libdrizzle library.
解决办法:
http://openresty.org/download/drizzle7-2011.07.21.tar.gz
tar xzvf drizzle7-2011.07..tar.gz
cd drizzle7-2011.07./
./configure --without-server
make libdrizzle-1.0
make install-libdrizzle-1.0
提示错误:./configure: error: the HTTP XSLT module requires the libxml2/libxslt
解决办法:
sudo apt-get install libxml2 libxml2-dev libxslt-dev
sudo apt-get install libgd2-xpm libgd2-xpm-dev
7、在上一步中,最后没有什么 error 的提示就是最好的。若有错误,最后会显示 具体原因可以看源码包目录下的 build/nginx-VERSION/objs/autoconf.err文件查看。若没有错误,则会出现如下信息:
8、编译:根据上一步命令提示,输入gmake
9、安装:输入gmake install
10、设置环境变量(我这里没有做)
为了后面启动 OpenResty 的命令简单一些,不用在 OpenResty 的安装目录下进行启动,我们设置环境变量来简化操作。 将 nginx 目录添加到 PATH 中。打开文件 /etc/profile, 在文件末尾加入export PATH=$PATH:/opt/openresty/nginx/sbin,若你的安装目录不一样,则做相应修改。 注意:这一步操作需要重新加载环境变量才会生效,可通过命令source /etc/profile或者重启服务器等方式实现。
/etc/profile 是所有用户的环境变量
/etc/enviroment 是系统的环境变量
登陆系统时shell读取的顺序应该是
/etc/profile ->/etc/enviroment -->$HOME/.profile -->$HOME/.env
编译完之后做了一个软连接哦
mkdir -p /opt/openresty/site/lualib
ln -sf /opt/openresty/nginx/sbin/nginx /opt/openresty/bin/openresty
所有启动Nginx的方式可以有两种方式:
软连接开启:/opt/openresty/bin/openresty
原始地址开启:/opt/openresty/nginx/sbin/nginx
查看编译后的结果:
root@iZbp16w4fwm1sxrjd98oe0Z:/home/www/tinywan_bak/openresty-1.11.2.1# /opt/openresty/bin/openresty -V
nginx version: openresty/1.11.2.1
built by gcc 4.8. (Ubuntu 4.8.-19ubuntu1)
built with OpenSSL 1.0.1f Jan
TLS SNI support enabled
configure arguments: --prefix=/opt/openresty/nginx --with-cc-opt=-O2
--add-module=../ngx_devel_kit-0.3.0
--add-module=../iconv-nginx-module-0.14
--add-module=../echo-nginx-module-0.60
--add-module=../xss-nginx-module-0.05
--add-module=../ngx_coolkit-0.2rc3
--add-module=../set-misc-nginx-module-0.31
--add-module=../form-input-nginx-module-0.12
--add-module=../encrypted-session-nginx-module-0.06
--add-module=../srcache-nginx-module-0.31
--add-module=../ngx_lua-0.10.6
--add-module=../ngx_lua_upstream-0.06
--add-module=../headers-more-nginx-module-0.31
--add-module=../array-var-nginx-module-0.05
--add-module=../memc-nginx-module-0.17
--add-module=../redis-nginx-module-0.3.7
--add-module=../rds-json-nginx-module-0.14
--add-module=../rds-csv-nginx-module-0.07
--with-ld-opt=-Wl,-rpath,/opt/openresty/luajit/lib
--with-stream --with-stream_ssl_module
--with-http_ssl_module
--add-module=/home/www/tinywan_bak/openresty-1.11.2.1/../stream-lua-nginx-module
浏览器访问,安装成功:
Nginx.conf
#TCP 负载均衡
stream {
server {
listen ;
#proxy_timeout 20s;
#proxy_pass backend;
content_by_lua_block {
ngx.say("HelloWorld")
}
}
}
【1】通过命令telnet 命令测试TCP负载server
root@iZbp16w4fwm1sxrjd98oe0Z:/opt/openresty/nginx/sbin# telnet 127.0.0.1
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
HelloWorld
Connection closed by foreign host.
【2】CURL测试结果!
【3】Windows 客户端测试结果:
注意,以上127.0.0.1 要换成你openresty服务器地址!!!
Linux开始、停止、重新加载
- 开始:./nginx
- 停止:./nginx -s stop
- 重置:./nginx -s reload
TCP(4层协议) 负载均衡可以的!!!!!!!!!!!!!!!!!!!!!
stream {
upstream rtmp {
server 127.0.0.1:; # 这里配置成要访问的地址
server 127.0.0.2:;
server 127.0.0.3:; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
}
server {
listen ; # 需要监听的端口
content_by_lua_block {
ngx.say("Hello, Lua!")
}
proxy_timeout 20s;
proxy_pass rtmp;
}
}
【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)的更多相关文章
- Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- Android(java)学习笔记170:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序
如需转载,请注明出处:Flutter学习笔记(26)--返回拦截WillPopScope,实现1秒内点击两次返回按钮退出程序 在实际开发中,为了防止用户误触返回按钮导致程序退出,通常会设置为在1秒内连 ...
- 网络协议学习笔记(四)传输层的UDP和TCP
概述 传输层里比较重要的两个协议,一个是 TCP,一个是 UDP.对于不从事底层开发的人员来讲,或者对于开发应用的人来讲,最常用的就是这两个协议.由于面试的时候,这两个协议经常会被放在一起问,因而我在 ...
- nginx官方文档 之 http负载均衡 学习笔记
一.负载均衡 算法 大致可以分两类: (1)不能保证用户的每一次请求都通过负载均衡到达同一服务器. (2)可保证用户的每一次请求都通过负载均衡到达同一服务器. 第二类的应用场景: 1.如果服务器有缓存 ...
- 【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
本章介绍如何使用NGINX Plus和NGINX开放源代理和负载平衡TCP和UDP流量. 目录 介绍 先决条件 配置反向代理 配置TCP或UDP负载平衡被动健康监控 选择负载平衡方法 配置会话持久性 ...
- Web负载均衡学习笔记之实现负载均衡的几种实现方式
0x00 概要 负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web负载均衡.根 ...
- centos之Haproxy 负载均衡学习笔记
HAProxy的特点是:1.支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机:2.能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作3.支持url检测后端的 ...
- Web负载均衡学习笔记之四层和七层负载均衡的区别
0x00 简介 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. ...
随机推荐
- C51学习笔记
转自:http://blog.csdn.net/gongyuan073/article/details/7856878 单片机C51学习笔记 一, C51内存结构深度剖析 二, reg51.头 ...
- mac上查找nginx安装位置
在终端输入: nginx -V 查看nginx版本及安装的本地位置 ngxin -v 查看nginx版本(此方法依然可以检测是否安装某一软件,如git,hg等)
- appium遇到问题总结(不断更新)
问题1 执行脚本 报错: java.lang.NoSuchMethodError: org.openqa.selenium.remote.ErrorHandler.<init>(Lorg/ ...
- [转帖]七牛云对HTTPS 的解释
感觉对RTT 还有 建立连接的说明挺好的 转帖一下 学习 https://www.cnblogs.com/qiniu/p/6856012.html 序•魔戒再现 几天前,OpenSSL ...
- css中定位功能的特性
它有四大特性,页面找不到盒子的情况 1.z-index值表示谁压着谁,数值大的压盖数值小的 2.只有定位了的元素,才有z-index.也就是说,不管相对定位,绝对定位,固定定位,都可以使用z-inde ...
- eclipse 导入 gradle 项目遇到 UnsupportedConfigurationException 异常
异常描述: org.eclipse.buildship.core.UnsupportedConfigurationException: Project at 'D:\XXXX_workspace\XX ...
- python利用unittest测试框架组织测试用例的5种方法
利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...
- nilcms file类 简单文件缓存实现
实现简单的文件缓存,参照CI的部分设计,在这里记录一下子. class File { const CACHE_PATH = 'nil_file_cache'; /*其他函数省略了*/ /** * 获取 ...
- office 格式刷双击无法启用连刷模式
1.问题所在是双击被设置太快了导致office无法接受,请设置成下图中的中等速度即可. 2.可使用快捷键代替 Ctrl+Shift+c(复制格式)Ctrl+Shift+v(粘贴格式)
- 部署puppet master/agent模型
自己画的一个简单的架构图 agent端每隔30分钟到master端请求与自己相关的catalog. 各节点时间要同步. 依赖DNS,各节点能通过主机名能解析. 1.同步时间 # yum install ...