首页 > 系统相关 >【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)...

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)...

时间:2023-04-05 20:45:49浏览次数:58  
标签:... 负载 127.0 1935 -- module server nginx 均衡


说明:很简单一个在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:8089;
        server 127.0.0.1:8088;
     }

    server {
        listen 80;
        server_name  localhost;
        location / {
        proxy_pass http://live_node;
        }
    }

    server {
        listen 8088;
        server_name  localhost;
        location / {
            root   /usr/local/nginx/html2;
            index  index.html index.htm;
        }
    }

    server {
        listen 8089;
        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:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
    }
    server {
        listen 1935;  # 需要监听的端口
        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:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
    }
    server {
        listen 1935;  # 需要监听的端口
        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:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
    }



注意:你不能为每个server定义协议,因为这个stream命令建立TCP作为整个 server的协议了。

  配置反向代理使Nginx能够把TCP请求从一个客户端转发到负载均衡组中(如:rtmp组)。在每个server配置块中 通过每个虚拟server的server的配置信息和在每个server中定义的监听端口(客户端需求的代理端口号,如我推流的的是RTMP协议,则端口号为:1935)的配置信息和proxy_passs 命令把TCP通信发送到upstream的哪个server中去。下面我们将TCP通信发送到rtmp 组中去。



server {
        listen 1935;  # 需要监听的端口
        proxy_timeout 20s;
        proxy_pass rtmp;
    }



当然我们也可以采用单一的代理方式:



server {
        listen 1935;  # 需要监听的端口
        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:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个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:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
    }



3、普通的hash算法:nginx plus选择这个server是通过user_defined 关键字,就是IP地址:$remote_addr;



upstream rtmp {
     hash $remote_addr consistent;
        server 127.0.0.1:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个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



编译

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._nginx

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._nginx_02

出现以上表示编译成功

安装

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._负载均衡_03

可以看出安装完成后给了一个软连接到 /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.21.tar.gz
cd drizzle7-2011.07.21/
./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文件查看。若没有错误,则会出现如下信息:

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._lua_04

8、编译:根据上一步命令提示,输入gmake

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._负载均衡_05

9、安装:输入gmake install

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._负载均衡_06

 

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.2 (Ubuntu 4.8.2-19ubuntu1) 
built with OpenSSL 1.0.1f 6 Jan 2014
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负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._lua_07

Nginx.conf



#TCP 负载均衡
stream {
    server {
        listen 1234;
        #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 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
HelloWorld
Connection closed by foreign host.



 【2】CURL测试结果!

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._负载均衡_08

【3】Windows 客户端测试结果:

【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)..._lua_09

注意,以上127.0.0.1 要换成你openresty服务器地址!!!

Linux开始、停止、重新加载

  1. 开始:./nginx 
  2. 停止:./nginx -s stop
  3. 重置:./nginx -s reload

TCP(4层协议) 负载均衡可以的!!!!!!!!!!!!!!!!!!!!!



stream {
    upstream rtmp {
        server 127.0.0.1:8089; # 这里配置成要访问的地址
        server 127.0.0.2:1935;
        server 127.0.0.3:1935; #需要代理的端口,在这里我代理一一个RTMP模块的接口1935
    }
    server {
        listen 1935;  # 需要监听的端口

   content_by_lua_block {
        ngx.say("Hello, Lua!")
      }

proxy_timeout 20s;
        proxy_pass rtmp;
    }
}



 

 

 

 









标签:...,负载,127.0,1935,--,module,server,nginx,均衡
From: https://blog.51cto.com/tinywan/6171592

相关文章

  • 流媒体技术学习笔记之(四)解决问题video.js 播放m3u8格式的文件,根据官方的文档添加vide
    源码地址:https://github.com/Tinywan/PHP_Experience总结:说明:测试环境:本测试全部来自阿里云直播和OSS存储点播以及本地服务器直播和点播播放器:VideoJs直播:1、阿里云直播,需要CDN设置HTTP头2、本地直播需要设置直播访问服务器的头部信息(本地为Nginx)add_header'Access-......
  • Redis核心知识之—— 时延问题分析及应对、性能问题和解决方法【★★★★★】...
     参考网址:Redis常见的性能问题和解决方法:http://www.searchdatabase.com.cn/showcontent_63439.htmRedis主从配置详细过程:http://sofar.blog.51cto.com/353572/861276 读后感:1、在架构设计中,有“分流”一招,说的是将处理快的请求和处理慢的请求分离来开,否则,慢的影响到了快的,让快的......
  • docker-compose 通过NGINX快速搭建负载均衡的Tomcat集群
                 docker-compose通过NGINX快速搭建负载均衡的Tomcat集群从标题也可以看出,需要三个软件,docker-compose,docker-ce(docker的运行环境),Tomcat的镜像。docker-compose和docker的安装就不用说了,都可以离线安装,安装方法见博客:(docker-compose安装方......
  • Docker yum install的时候报错:Rpmdb checksum is invalid: dCDPT(pkg checksums): ...
    闲话就不说了,直接上Dockerfile:FROMhub.c.163.com/library/centos:7.2.1511MAINTAINERbyzsk_johnRUNyum-yinstallvimnet-tools&&yumcleanallEXPOSE22CMD["/bin/bash","-D"]注意一点,如果拆开写RUN,也就是yuminstallvim-y&&yuminst......
  • 在Linux配置LVS实现负载均衡
    前言这篇主要是讲LVS配置来实现负载均衡,步骤非常简单,只不过为了解释配置的目的增加了一些文字解释,而显得内容很多。LVS(LinuxVirtualServer)是章文嵩博士成立的自由软件项目。Linux将其作为内核的一部分,命名为IPVS(IPVirtualServer)。配置简介在一台作为负载均衡服务器DS(Direc......
  • 深入剖析 RocketMQ 源码 - 负载均衡机制
    一、引言RocketMQ是一款优秀的分布式消息中间件,在各方面的性能都比目前已有的消息队列要好,RocketMQ默认采用长轮询的拉模式,单机支持千万级别的消息堆积,可以非常好的应用在海量消息系统中。RocketMQ主要由Producer、Broker、Consumer、Namesvr等组件组成,其中Producer负责生产消......
  • 选择列表中的列 ...... 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
    在用SQLserver对表中的数据进行查询的过程中,出现如下错误:消息8120,级别16,状态1,第27行选择列表中的列'......'无效,因为该列没有包含在聚合函数或GROUPBY子句中。其目的是因为select语句中包含聚合函数,因为聚合函数是对一组值进行操作,所以它通常与select语句的......
  • 高并发系统设计——负载均衡技术选型
    摘要高并发系统设计的三个通用方法:缓存、异步和横向扩展,不过在实际的工作中,你经常使用的负载均衡的组件应该算是Nginx,它的作用是承接前端的HTTP请求,然后将它们按照多种策略,分发给后端的多个业务服务器上。这样,我们可以随时通过扩容业务服务器的方式,来抵挡突发的流量高峰。与DNS......
  • 听说Python有鸡肋?一起聊聊...
    听说是鸡肋❝一直以来,关于Python的多线程和多进程是否是鸡肋的争议一直存在,今晚抽空谈谈我的看法,以下是我的观点:❞对于多线程:Python的多线程库threading在某些情况下确实是鸡肋的,这是因为Python的全局解释器锁(GlobalInterpreterLock,GIL)导致了多线程的并发性能不能......
  • 负载均衡策略
    负载均衡策略1.轮询模式2.加权轮询在轮询的基础上,增加了一个权重的概念。权重是一个泛化后的概念,可以用任意方式来体现,本质上是一个能者多劳思想。比如,可以根据宿主的性能差异配置不同的权重。服务器处理能力好的节点接收更多的请求。3.最少连接数这是一种根据实时的负载......