1、简介

nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡。

2、编译

./configure --with-stream # 编译安装nginx时候,指定此参数即可
备注:nginx -V 查看已安装模块

3、配置

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

    upstream dns {
       server 192.168.0.1:53535;
       server dns.example.com:53;
    }
    upstream zk_server {
        server 172.16.3.8:2181 weight=5;
    }

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

    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }

    server {
        listen [::1]:12345;
        proxy_pass unix:/tmp/stream.socket;
    }
   server {
        listen 2181 tcp;
        proxy_responses 1;
        proxy_timeout 20s;
        proxy_pass zk_server;
    }
}

4、测试

登录192.168.100.100(nginx地址)服务器执行看是否有3306端口的监听(通过nginx远程登陆数据库,需要配置可远程访问数据库的用户)
netstat -nap|grep 3306

5、备注

测试发现nginx会等待session结束才会记录到日志文件;
session日志只是tcp层面的记录,包括session时间,发送接收字节数等等;
session内部发送日志(比如一个socket连接建立起来以后,多次发送心跳数据)需要在应用层面才能记录;