【精選】Nginx負載均衡學習筆記(一)實現HTTP負載均衡和TCP負載均衡(官方和OpenResty兩種負載配置)

說明:很簡單一個在HTTP模塊中,而另一個和HTTP 是並列的Stream模塊(Nginx 1.9.0 支持)html

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。node

二、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流的轉發。nginx

2、TCP負載均衡和Http負載均衡的詳細解說

一、TCP負載均衡:

  nginx-1.9.0 已發佈,該版本增長了 stream 模塊用於通常的 TCP 代理和負載均衡,ngx_stream_core_module 這個模塊在1.90版本後將被啓用。可是並不會默認安裝,須要在編譯時經過指定 --with-stream 參數來激活這個模塊。git

(1)配置Nginx編譯文件參數github

./configure --with-http_stub_status_module --with-stream

(2)編譯、安裝,make,make install .redis

(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;配置些如:鏈接數、權重等等。shell

  首先建立一個server組,用來做爲TCP負載均衡組。定義一個upstream塊在stream上下文中,在這個塊裏面添加由server命令定義的server,指定他的IP地址和主機名(可以被解析成多地址的主機名)和端口號。下面的例子是創建一個被稱之爲rtmp組,兩個監聽1395端口的server ,一個監聽8089端口的server。json

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的協議了ubuntu

  配置反向代理使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。

一、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 }

二、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 }

三、普通的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 }

 

 

 

 

 

 

 

二、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 安裝

一、去openresty 的github上下載一個版本 https://github.com/openresty/lua-nginx-module/releases

wget https://openresty.org/download/openresty-1.11.2.1.tar.gz

二、解壓源碼包,tar xzvf ngx_openresty-1.9.7.1.tar.gz。若你下載的源碼包版本不同,將相應的版本號改成你所下載的便可。

三、切換工做目錄到 cd ngx_openresty-1.9.7.1。

四、瞭解默認激活的組件。OpenResty 官網有組件列表,咱們能夠參考,列表中大部分組件默認激活,也有部分默認不激活。 默認不激活的組件,咱們能夠在編譯的時激活,後面步驟詳說明

五、絕大部分組件已內置在OpenResty安裝包中,但也有一部分不包含在內默認並未啓用

  標準 Lua 5.1 解釋器、Drizzle Nginx 模塊、 Postgres Nginx 模塊 以及 Iconv Nginx 模塊 默認並未啓用,如下爲分別編譯選項來開啓它們

--with-lua51
--with-http_drizzle_module
--with-http_postgres_module
--with-http_iconv_module

六、使用選項 --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

七、在上一步中,最後沒有什麼 error 的提示就是最好的。如有錯誤,最後會顯示 具體緣由能夠看源碼包目錄下的 build/nginx-VERSION/objs/autoconf.err文件查看。若沒有錯誤,則會出現以下信息:

八、編譯:根據上一步命令提示,輸入gmake

九、安裝:輸入gmake install

 

十、設置環境變量(我這裏沒有作)

 

  爲了後面啓動 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.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測試結果!

【3】Windows 客戶端測試結果:

注意,以上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;
    }
}
相關文章
相關標籤/搜索