Nginx高端成长之路nginx

Nginx支持TCP代理和负载均衡-stream模块

2018-05-23  本文已影响452人  Java及SpringBoot

ngx_stream_core_module

ngx_stream_core_module模块自1.9.0版开始提供。默认情况下不构建此模块,应使用--with-stream 配置参数启用它。

官网: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;
    }
    #上游后端
    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;
    }
}

指令

`**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*]];`

设置服务器将接受连接的套接字addressport。可以仅指定端口。地址也可以是主机名,例如:

listen 127.0.0.1:12345;
listen *:12345;
listen 12345;     # same as *:12345
listen localhost:12345;

IPv6地址在方括号中指定:

listen [::1]:12345;
listen [::]:12345;

UNIX域套接字使用“ unix:”前缀指定:

listen unix:/var/run/nginx.sock;

ssl参数允许指定此端口上接受的所有连接都应在SSL模式下工作。

udp参数配置一个侦听套接字以处理数据报(1.9.13)。

proxy_protocol参数(1.11.4)允许指定这个端口上接受的所有连接应使用 代理服务器协议

自版本1.13.11起支持PROXY协议版本2。

listen指令可以有几个特定于与套接字相关的系统调用的附加参数。

不同的服务器必须监听不同的 address:port对。

语法

Syntax Default Context Description
preread_buffer_size size 16k stream,server 指定size了的 预读缓冲区。
preread_timeout timeout 30s stream,server 指定timeout了的 预读阶段。
proxy_protocol_timeout timeout 30s stream,server 指定timeout用于读取PROXY协议标头以完成。如果在此时间内未传输整个标头,则关闭连接。
resolver address ... [valid=time][ipv6=on off - stream,server 将用于解析上游服务器名称的名称服务器配置到地址中,例如:resolver 127.0.0.1 [:: 1]:5353;
resolver_timeout time 30s stream,server 设置名称解析的超时
server { ... } - stream 设置服务器的配置
stream { ... } - main 提供指定流服务器指令的配置文件上下文
tcp_nodelay on | off on stream,server 启用或禁用该TCP_NODELAY选项的使用。为客户端和代理服务器连接启用该选项
variables_hash_bucket_size size 64 stream 设置变量哈希表的桶大小。设置哈希表的详细信息在单独的文档中提供 。
variables_hash_max_size size 1024 stream 设置size变量哈希表的最大值。设置哈希表的详细信息在单独的文档中提供。

可以将地址指定为域名或IP地址,以及可选端口。如果未指定端口,则使用端口53。以循环方式查询名称服务器。

默认情况下,nginx将在解析时查找IPv4和IPv6地址。如果不需要查找IPv6地址,则ipv6=off可以指定参数。

默认情况下,nginx使用响应的TTL值缓存答案。可选valid参数允许覆盖它:

resolver 127.0.0.1 [::1]:5353 valid=30s;

嵌入式变量

ngx_stream_core_module模块支持自1.11.2以来的变量。

测试nginx代理TCP协议的配置

realserver : 10.111.17.89:8080

nginx :10.111.16.75

客户端:10.100.34.198

TCP监听端口:2018

配置nginx

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

./configure --add-module=/root/nginx_upstream_check_module-master --with-stream

make && make install

nginx.config文件参照官网:

stream {
    
    upstream tcpend {
        hash $remote_addr consistent;

        server 10.111.17.89:8080 weight=5 max_fails=3 fail_timeout=30s;
    }
    
    server {
        listen 2018;
        proxy_connect_timeout 1s;
        proxy_timeout 180s;
        proxy_pass tcpend;
    }  
}

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

cd usr/local/nginx/sbin
#启动
./nginx
#重启
./nginx -s reload
#判断配置文件是否正确
./nginx -t
netstat -anp|grep :2018

[root@vm10-111-16-75 ~]# netstat -anp|grep :2018

tcp 0 0 0.0.0.0:2018 0.0.0.0:* LISTEN 18457/nginx

测试客户端连realserver

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

telnet
open 10.111.17.89 8080

[root@vm10-65-140-249 ~]# telnet 
telnet> open 10.111.17.89 8080
Trying 10.111.17.89...
Connected to 10.111.17.89.
Escape character is '^]'.
Connection closed by foreign host.
[root@vm10-65-140-249 ~]# telnet 
telnet> open 10.111.17.89 8080
Trying 10.111.17.89...
Connected to 10.111.17.89.
Escape character is '^]'

在realserver上查看网络连接:

netstat -anpl|grep :8080

[root@vm10-111-17-89 ~]# netstat -anpl|grep :8080
tcp        0      0 :::8080                     :::*                        LISTEN      5182/java           
tcp        0      0 ::ffff:10.111.17.89:8080    ::ffff:10.100.34.198:14470  ESTABLISHED 5182/java 

可以正常连接

测试客户端连接nginx

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

telnet
open 10.111.16.75 2018

[root@vm10-65-140-249 ~]# telnet
telnet> open 10.111.16.75 2018
Trying 10.111.16.75...
Connected to 10.111.16.75.
Escape character is '^]'.

在nginx机器上查看网络连接

[root@vm10-111-16-75 ~]# netstat -anp|grep :2018
tcp        0      0 0.0.0.0:2018                0.0.0.0:*                   LISTEN      18457/nginx         
tcp        0      0 10.111.16.75:2018           10.100.34.198:51539         ESTABLISHED 18458/nginx 

在realserver上查看网络连接

[root@vm10-111-17-89 ~]# netstat -anpl|grep :8080
tcp        0      0 :::8080                     :::*                        LISTEN      5182/java           
tcp        0      0 ::ffff:10.111.17.89:8080    ::ffff:10.111.16.75:40794   ESTABLISHED 5182/java  

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

client和nginx有一个tcp长连接,nginx和realserver有一个tcp长连接,但是client和realserver之间并没有tcp长连接,仅由nginx服务器负责数据中转。

上一篇下一篇

猜你喜欢

热点阅读