阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx负载均衡配置(TCP代理)

217次阅读
没有评论

共计 4293 个字符,预计需要花费 11 分钟才能阅读完成。

昨天在公司微信群,CTO 分享了这个消息,对运维来说以后基于 TCP 协议的后端业务的高可用又多了一个新的选择,实在是棒极了!一直以来,Nginx 并不支持 tcp 协议,所以后台的一些基于 TCP 的业务就只能通过其他高可用负载软件来完成了,比如 Haproxy。

nginx-1.9.0 已发布,该版本增加了 stream 模块用于一般的 TCP 代理和负载均衡。

The ngx_stream_core_module module is available since version 1.9.0. This module is not built by default, it should be enabled with the –with-stream configuration parameter.

ngx_stream_core_module 这个模块在 1.90 版本后将被启用。但是并不会默认安装,需要在编译时通过指定 –with-stream 参数来激活这个模块。
其他改进包括:
Change: 删除过时的 aio 和 rtsig 事件处理方法
Feature: 可在 upstream 块中使用 “zone” 指令
Feature: 流模块,支持 TCP 代理和负载均衡
Feature: ngx_http_memcached_module 支持字节范围
Feature: Windows 版本支持使用共享内存,带随机化地址空间布局.
Feature: “error_log” 指令可在 mail 和 server 级别
Bugfix: the “proxy_protocol” parameter of the “listen” directive did not work if not specified in the first “listen” directive for a listen socket.

编译安装:略
最后贴一下官方分享的 stream 模块的简单配置 demo:
http://nginx.org/en/docs/stream/ngx_stream_core_module.html

worker_processes auto;

error_log /var/log/nginx/error.log info;
events {
    worker_connections 1024;
}

stream {
    upstream backend {
        hash $remote_addr consistent;
        server backend1.example.com:12345 weight=5;
        server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
        server unix:/tmp/backend3;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
在此我做了一个 tcp 反向解析的小实验

背景:125.208.14.177:3306    数据库 1
      125.208.14.177:3306    数据库 2
      218.78.186.162        nginx 服务器 

配置文件

worker_processes auto;

error_log /var/log/nginx/error.log info;
events {
    worker_connections 1024;
}

stream {
    upstream backend {
        hash $remote_addr consistent;
        server 125.208.14.177:3306 weight=5 max_fails=3 fail_timeout=30s;
        server 125.208.14.177:3307 weight=4 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

}

测试:

[root@iZ236mlq2naZ ~]# MySQL -uroot -p’******’ -P12345 -h218.78.186.162 -e “select * from test” test

Warning: Using a password on the command line interface can be insecure.
+—————————–+
| t                          |
+—————————–+
| this is 125.208.14.177:3306 |
+—————————–+
[root@iZ236mlq2naZ ~]# mysql -uroot -p’*****’ -P12345 -h218.78.186.162 -e “select * from test” test
Warning: Using a password on the command line interface can be insecure.
^[[A+—————————–+
| t                          |
+—————————–+
| this is 125.208.14.177:3307 |
+—————————–+
[root@iZ236mlq2naZ ~]# mysql -uroot -p’*****’ -P12345 -h218.78.186.162 -e “select * from test” test
Warning: Using a password on the command line interface can be insecure.
+—————————–+
| t                          |
+—————————–+
| this is 125.208.14.177:3306 |
+—————————–+
[root@iZ236mlq2naZ ~]# mysql -uroot -p’******’ -P12345 -h218.78.186.162 -e “select * from test” test
Warning: Using a password on the command line interface can be insecure.
+—————————–+
| t                          |
+—————————–+
| this is 125.208.14.177:3306 |
+—————————–+

 

再做一个读写分离的实验:
配置文件

worker_processes auto;

error_log /var/log/nginx/error.log info;
events {
    worker_connections 1024;
}

stream {
    upstream readdb {
        hash $remote_addr consistent;                                    — 作为 read 库
        server 125.208.14.177:3306 weight=5 max_fails=3 fail_timeout=30s;
        server 125.208.14.177:3307 weight=4 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass readdb;
    }
 

  upstream writedb{
      hash $remote_addr consistent;
      server 125.208.14.177:3308 max_fails=3 fail_timeout=30s;      — 作为 write 库
    }
    server {
        listen 23456;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass writedb;
    }
 
}
~

个人感觉:这就是多个端口多个 tcp 代理而已,读的时候用一个端口,写的时候用一个端口,多麻烦啊,用来做读写分离还是差了点,负载均衡还是不错的,还是使用 atlas 真正意义上的读写分离吧。

最后可以将 http 负载与 tcp 负载写一起达到多重目的。

更多 Nginx 负载均衡配置 相关教程见以下内容

Linux 下 Nginx+Tomcat 负载均衡和动静分离配置要点  http://www.linuxidc.com/Linux/2016-01/127255.htm

Docker+Nginx+Tomcat7 配置简单的负载均衡  http://www.linuxidc.com/Linux/2015-12/125907.htm

Nginx 负载均衡(主备)+Keepalived  http://www.linuxidc.com/Linux/2015-12/126865.htm

使用 Nginx 作为负载均衡器 http://www.linuxidc.com/Linux/2015-12/125789.htm

CentOS 环境下 Nginx 实现 3 台虚拟机负载均衡 http://www.linuxidc.com/Linux/2015-12/125875.htm

Nginx 反向代理负载均衡群集实战  http://www.linuxidc.com/Linux/2015-08/122111.htm

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-02/128062.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4293字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中