四层代理
ngx_stream_xx_module
具体可以参考官方文档:
https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/#
四层代理内容
- tcp
- udp
- 健康监测
- 调度算法
- 后端节点属性设置
tcp的redis示例
1,定义stream段,在主配置文件;
stream {
upstream redisback1 {
server 192.168.80.102:6379;
server 192.168.80.103:6379 down;
}
include stream/*.conf;
}
定义一个redis主机组,同样可以指定,调度算法、权重、主机状态;超时时间,失败尝试次数等;
include导入虚拟主机的配置文件;
2,定义虚拟主机,转发redis请求
[root@host2 conf]# cat stream/redis.conf
server {
listen 192.168.80.101:6379;
proxy_pass redisback1;
}
单独建立文件夹,放四层的代理配置,定义server虚拟主机,
监听的本机地址,转发到哪个四层的主机组;
# udp时,listen要加一个udp的参数表明是udp协议
3,定义2个后端redis服务;
yum install -y redis
vim /etc/redis.conf
取消bind的注释,改为监听本机所有ip
重启
redis-cli 本机连入
config set protected-mode no
取消保护默认,没设置密码,且允许外部ip连接时,redis处于保护模式,需取消才能正常操作;
4,测试
100客户端
101nginx代理
102redis服务器
redis-cli -h 192.168.80.101
在nginx上查看,建立连接的有,101到102真实redis服务器的连接;
即,nginx对客户端100建立一个连接;对后端redis,建立一个连接,一次有效反代,消耗2个连接;
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.80.101:6379 192.168.80.100:39624
ESTAB 0 0 192.168.80.101:47232 192.168.80.102:6379
listen指令语法
Syntax: listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default: —
Context: server
proxy_pass 主机组名称;
proxy_timeout time; 无数据传输时,多久断开,默认10m
proxy_connect_timeout time;nginx和后端服务器尝试建立连接的超时时长;
官方eg:
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;
}
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;
}
}