博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx : TCP代理和负载均衡的stream模块
阅读量:5799 次
发布时间:2019-06-18

本文共 2340 字,大约阅读时间需要 7 分钟。

一直以来,Nginx 并不支持tcp协议,所以后台的一些基于TCP的业务就只能通过其他高可用负载软件来完成了,比如Haproxy。

这算是一个比较明显的缺憾。不过,在1.90发布后这个认知将得到改写:

2015-04-28  mainline version has been released, with the stream module for generic TCP proxying and load balancing. 

 

-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.

所以,我们如果需要用到这个功能,就需要加上 --with-stream 参数重新编译。对于已在线上运行的nginx,你可能要用到平滑升级来避免线上的服务被中断,可以参考张戈以前分享的教程:

《》

最后贴一下官方分享的stream模块的简单配置demo:

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;
}
}

 

和http模块类似,简单明了。相信熟悉 nginx 的朋友很容易的就能完成一个 nginx 下的 TCP 负载均衡集群配置。

由于工作繁忙,实在是心有余而力不足。还好最近公司给我招了个小鲜肉来做运维助理,等空下来了,我再去测一测这个 Nginx 的 TCP 代理和负载均衡功能。到时候再来博客分享一二,敬请期待!

 

 

下面测试nginx代理TCP协议的配置。

realserver : 10.134.241.68

nginx :10.134.72.166

客户端:10.129.157.168

TCP监听端口:2014

一、配置nginx

看官网上的文档 

nginx1.90对TCP协议的代理并不是默认开启的,需要在编译的时候配置 --with-stream 参数:

[img]https://images0.cnblogs.com/blog2015/450613/201505/071746123452724.png[/img]

nginx.config文件参照官网:

stream {

upstream cloudsocket {

hash $remote_addr consistent;

server 10.134.241.68:2014 weight=5 max_fails=3 fail_timeout=30s;

}

server {

listen 2014;

proxy_connect_timeout 1s;

proxy_timeout 3s;

proxy_pass cloudsocket;

}

}

启动nginx,发现nginx已经开始监听2014端口了

二、测试客户端连realserver

在客户端通过telnet连接realserver的2014端口:

在realserver上查看网络连接:

可以正常连接

三、测试客户端连接nginx

在客户端通过telnet连接nginx所在服务器的2014端口

在nginx机器上查看网络连接

在realserver上查看网络连接

可以注意到nginx是给做了一个TCP连接的中转

转载地址:http://dgafx.baihongyu.com/

你可能感兴趣的文章
HLG 1212 乘积最大
查看>>
构建Maven项目时常见错误
查看>>
特殊情况特殊处理
查看>>
程序员,我们应该如何去学习(转)
查看>>
关闭模态子窗口的同时刷新父窗口的问题
查看>>
OAuth2.0 https
查看>>
Android开发之《RXJava的简单实现》
查看>>
Android 自定义属性
查看>>
ACM-Teleportation
查看>>
PackageManager整理
查看>>
成员变量和局部变量
查看>>
C#产生不重复的随机数
查看>>
053(六十九)
查看>>
ansible 补全编辑中
查看>>
getpwuid()函数
查看>>
Landon Pigg & Lucy Schwartz - Darling I Do
查看>>
Tomcat死机报OutOfMemoryError: PermGen space错误
查看>>
UVa 10718 - Bit Mask
查看>>
VECTOR的用法
查看>>
DateTimePicker控件的使用
查看>>