nginx stream模块初探

介绍Nginx 1.9.0版本引入的Stream模块,该模块支持四层协议转发、代理及负载均衡等功能。文章提供了一个包含TCP和UDP负载均衡配置示例,并列举了Stream模块支持的多个变量及第三方模块。

前言

nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。这完全就是抢HAproxy份额的节奏,鉴于nginx在7层负载均衡和web service上的成功,和nginx良好的框架,stream模块前景一片光明。

stream 模块编译

stream模块默认没有编译到nginx, 编译nginx时候 ./configure –with-stream 即可

官网:http://nginx.org/en/docs/stream/ngx_stream_core_module.html

用法

stream模块用法和http模块差不多,关键的是语法几乎一致。熟悉http模块配置语法的上手更快
以下是一个配置了tcp负载均衡和udp(dns)负载均衡的例子, 有 server,upstream块,而且还有server,
hash, listen, proxy_pass等指令,如果不看最外层的stream关键字,还以为是http模块呢。

worker_processes auto;
error_log logs/error.stream.log info;
events {
    worker_connections  1024;
}
stream {
    upstream backend {
        hash $remote_addr consistent;
        server 127.0.0.1:12346 weight=5;
        server 127.0.0.1:12347            max_fails=3 fail_timeout=30s;
        server 127.0.0.1:12348            max_fails=3 fail_timeout=30s;
    }
    upstream dns {
       server 17.61.29.79:53;
       server 17.61.29.80:53;
       server 17.61.29.81:53;
       server 17.61.29.82:53;
    }
    server {
        listen 12345;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }
    server {
        listen 127.0.0.1:53 udp;
        proxy_responses 1;
        proxy_timeout 20s;
        proxy_pass dns;
    }
}

stream core 一些变量

注意:变量支持是从 nginx 1.11.2版本开始的

$binary_remote_addr
二进制格式的客户端地址
$bytes_received
从客户端接收到的字节数
$bytes_sent
发往客户端的字节数
$hostname
连接域名
$msec
毫秒精度的当前时间
$nginx_version
nginx 版本
$pid
worker进程号
$protocol
通信协议(UDP or TCP)
$remote_addr
客户端ip
$remote_port
客户端端口
$server_addr
接受连接的服务器ip,计算此变量需要一次系统调用。所以避免系统调用,在listen指令里必须指定具体的服务器地址并且使用参数bind$server_port
接受连接的服务器端口
$session_time
毫秒精度的会话时间(版本1.11.4开始)
$status
会话状态(版本1.11.4开始), 可以是一下几个值:
200
成功
400
不能正常解析客户端数据
403
禁止访问
500
服务器内部错误
502
网关错误,比如上游服务器无法连接
503
服务不可用,比如由于限制连接等措施导致
$time_iso8601
ISO 8601时间格式
$time_local
普通日志格式的时间戳

stream 模块

目前官网上列出的第三方模块、简直就是http模块的镜像、比如access模块访问控制ip和ip段,map模块实现映射、 geo模块实现地理位置映射、等等。使用这些模块的时候一定要看是哪个版本才支持的、比如log模块,只有在nginx-1.11.4才支持。

ngx_stream_core_module
ngx_stream_access_module
ngx_stream_geo_module
ngx_stream_geoip_module
ngx_stream_js_module
ngx_stream_limit_conn_module
ngx_stream_log_module
ngx_stream_map_module
ngx_stream_proxy_module
ngx_stream_realip_module
ngx_stream_return_module
ngx_stream_split_clients_module
ngx_stream_ssl_module
ngx_stream_ssl_preread_module
ngx_stream_upstream_module
ngx_stream_upstream_hc_module
### 安装 NginxStream 模块 #### 1. 确认 Nginx 版本 在安装之前,需确认当前使用的 Nginx 版本是否支持 `ngx_stream_core_module` 模块。此模块Nginx 1.9.0 开始引入[^1]。 可以通过以下命令查看已安装的 Nginx 版本及其编译参数: ```bash nginx -V ``` 如果输出中未显示 `--with-stream` 参数,则说明当前 Nginx 不支持 Stream 模块,需要重新编译或下载新版本进行安装。 --- #### 2. 下载并解压 Nginx 源码包 假设需要安装最新稳定版(如 Nginx 1.20.2),可以从官方站点获取源码包: ```bash wget http://nginx.org/download/nginx-1.20.2.tar.gz tar -zxvf nginx-1.20.2.tar.gz cd nginx-1.20.2 ``` --- #### 3. 配置编译选项 为了启用 Stream 模块,在运行 `./configure` 脚本时需添加 `--with-stream` 参数。以下是完整的配置示例: ```bash ./configure \ --prefix=/usr/local/nginx \ --with-stream \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_gzip_static_module ``` 其中: - `--prefix`:指定安装路径。 - `--with-stream`:启用 Stream 模块。 - 其他模块可根据需求选择性添加。 --- #### 4. 编译与安装 完成配置后,依次执行以下命令完成编译和安装过程: ```bash make && make install ``` 完成后可通过以下命令验证 Stream 模块是否加载成功: ```bash /usr/local/nginx/sbin/nginx -V ``` 若输出中包含 `--with-stream` 则表明安装成功[^1]。 --- #### 5. 配置 Stream 模块 编辑 Nginx 主配置文件 `/usr/local/nginx/conf/nginx.conf`,加入如下内容以测试 Stream 功能: ```nginx stream { upstream backend { server 192.168.1.1:22; } server { listen 9901; proxy_pass backend; proxy_timeout 300s; } } ``` 上述配置实现了将本地端口 `9901` 的 TCP 流量转发至远程主机 `192.168.1.1` 的 SSH 服务(端口 22)。更多高级功能(如负载均衡、健康检查等)也可在此基础上扩展[^3]。 保存配置文件后重启 Nginx 生效: ```bash /usr/local/nginx/sbin/nginx -s reload ``` --- #### 注意事项 - 若同一台服务器上存在多个 Nginx 实例,请确保各实例监听不同端口,以免发生冲突[^1]。 - 使用 `hash $remote_addr consistent;` 可实现基于客户端 IP 地址的一致性哈希分发策略[^3]。 --- ### 示例代码 以下是一个更复杂的 Stream 配置案例,用于 MySQL 数据库流量转发: ```nginx stream { upstream mysql_backend { hash $remote_addr consistent; server 10.10.10.10:3306 weight=5 max_fails=3 fail_timeout=30s; server 10.10.10.11:3306 weight=1 max_fails=3 fail_timeout=30s; } server { listen 8080; proxy_connect_timeout 10s; proxy_timeout 300s; proxy_pass mysql_backend; allow 192.168.0.0/16; deny all; } } ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值