nginx配置tcp代理实例 作者: sysit 分类: d 发表于 2020-01-07 106人围观 ## 1. nginx.conf ``` stream { log_format tcp-log '$remote_addr [$time_iso8601] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time $upstream_addr ' '$upstream_bytes_sent $upstream_bytes_received $upstream_connect_time'; include tcp/*.conf; } ``` ## 2 tcp配置文件 ``` upstream mysql-w-tcp { server 10.10.10.11:3306; } server { listen 0.0.0.0:3336 so_keepalive=10m::10; #access_log /var/log/nginx/mysql-access.log tcp-log; #error_log /var/log/nginx/mysql-error.log; allow 10.10.0.0/16; deny all; proxy_pass mysql-w-tcp; proxy_timeout 20m; } ``` ## 3 tcp配置的相关变量 ``` $binary_remote_addr:二进制形式的客户端地址,对于IPv4地址,值的长度始终为4字节,对于IPv6地址,值的长度始终为16字节 $bytes_received:从客户端接收到的字节数 $bytes_sent:发送到客户端的字节数 $connection:连接序列号 $hostname:host名称 $msec:当前时间(秒),以毫秒为单位 $nginx_version:nginx版本 $pid:work process的pid $protocol:和客户端通信的协议:TCP或者UDP $proxy_protocol_addr:PROXY协议头中的客户端地址,或者为空字符串。必须先通过在listen指令中设置proxy_protocol参数才能启用PROXY协议。 $proxy_protocol_port:PROXY协议头中的客户端端口,或者为空字符串。必须先通过在listen指令中设置proxy_protocol参数才能启用PROXY协议。 $remote_addr:客户端地址 $server_addr:接收连接的服务器地址。计算此变量的值通常需要一次系统调用。 为了避免系统调用,listen指令必须指定地址并使用bind参数。 $server_port:接收连接的服务器端口 $session_time:会话持续时间(秒),以毫秒为单位 $time_iso8601:ISO8610格式的本地时间 $time_local:通用日志格式的本地时间 status:状态值。200:会话完成;400:客户端数据无法解析,例如PROXY协议头;403:访问受限;500:内部服务器错误;502:网关错误;503:服务不可用。 ``` ## 4 tcp配置文件参数说明 * listen ``` 语法: listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; 默认值: — 上下文: server ssl 指定连接此端口的连接都是SSL模式 udp 用于处理套接字 proxy_protocol 指定此端口上的所有连接都使用 PROXY protocol协议 backlog=number 限制挂起连接队列的最大长度(1.9.2)。默认情况下,backlog在FreeBSD,DragonFly BSD和Mac OS X上设置为-1,在其他平台上设置为511。 bind 表示对一个指定的address:port对进行单独的绑定。实是,如果有几个listen指令具有相同的端口但地址不同,并且其中一个listen指令监听给定端口(\*:port)的所有地址,nginx将只绑定\*:port。 应该注意,在这种情况下调用getsockname()以确定接受连接的地址。 如果使用ipv6only或so_keepalive参数,那么对于给定的地址:端口对将始终进行单独的绑定。 ipv6only=on|off 确定侦听通配符地址[::]的IPv6套接字是否只接受IPv6连接,或者是接受IPv6和IPv4连接。此参数默认处于打开状态。且它只能在启动时设置一次。 so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]此参数配置侦听 套接字的“TCP keepalive”行为。 如果省略此参数,则操作系统的设置将对套接字生效。 如果将其设置为值“on”,则套接字的SO_KEEPALIVE选项将打开。 如果它设置为值“off”,则套接字的SO_KEEPALIVE选项被关闭。 某些操作系统支持使用TCP_KEEPIDLE,TCP_KEEPINTVL和TCP_KEEPCNT套接字选项在每个套接字上设置TCP保持活动参数。 在这些系统(目前,Linux 2.4+,NetBSD 5+和FreeBSD 9.0-STABLE)上,可以使用keepidle,keepintvl和keepcnt参数配置它们。 可以省略一个或两个参数,在这种情况下,相应套接字选项的系统默认设置将有效。 例如,so_keepalive=30m::10 ``` * 指定preread buffer的大小 ``` Syntax: preread_buffer_size size; Default: preread_buffer_size 16k; Context: stream, server ``` * 指定preread buffer的超时时间 ``` Syntax: preread_timeout timeout; Default: preread_timeout 30s; Context: stream, server ``` * 指定完成读取代理协议头的超时时间,如果超过这个时间,就关闭连接 ``` Syntax: proxy_protocol_timeout timeout; Default: proxy_protocol_timeout 30s; Context: stream, server ``` * 配置用于将upstream servers中名称解析到地址的服务器 ``` Syntax: resolver address ... [valid=time] [ipv6=on|off]; Default: — Context: stream, server This directive appeared in version 1.11.3. 例如: resolver 127.0.0.1 [::1]:5353; resolver 127.0.0.1 [::1]:5353 valid=30s; ``` * 名字解析的超时时间 ``` Syntax: resolver_timeout time; Default: resolver_timeout 30s; Context: stream, server ``` * 配置服务器 ``` Syntax: server { ... } Default: — Context: stream ``` * 配置stream服务器 ``` Syntax: stream { ... } Default: — Context: main ``` * 配置是否允许TCP_NODELAY选项,这个可以用在客户端和代理服务器上 ``` Syntax: tcp_nodelay on | off; Default: tcp_nodelay on; Context: stream, server ``` * 设置变量的哈希表容量。 ``` Syntax: variables_hash_bucket_size size; Default: variables_hash_bucket_size 64; Context: stream ``` * 设置变量的哈希表最大容量 ``` Syntax: variables_hash_max_size size; Default: variables_hash_max_size 1024; Context: stream This directive appeared in version 1.11.2. ``` 如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作! 赞赏支持