Nginx代理TCP主要是使用stream模块,这个功能是从1.9.0版本开始的。
我用它来代理Mysql。
stream { upstream mysqls { hash $remote_addr consistent; server 192.168.58.143:3306 weight=5 max_fails=3 fail_timeout=30s; server 192.168.58.142:3306 weight=1 max_fails=3 fail_timeout=30s; } server { listen 9945; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass mysqls; } }
这个就是一个最基本的配置html
有几个注意的地方:node
stream
的配置必须是和events
同级的,因此我直接就写在了nginx.conf
主配置文件中的,这样就确保了和events
同级。固然也能够单独写出来。server
里面是不许写location
的,因此就不能判断\sss\
这样的路径来作的。我开始的时候想这样的,模仿spring
实现的websocket
,后来才意识到,websocket
能够这样是由于它链接是靠http
协议的,传输才靠tcp
的。终于明白了。server
的监听端口不能和http
的重复。[emerg] 30181#0: bind() to 0.0.0.0:8090 failed (13: Permission denied)
这个错误是因为SElinux
,关掉这就行了。SElinux
方法:修改/etc/selinux/config
文件,将SELINUX=enforcing
改成SELINUX=disabled
重启以后就行了。语法: listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; 默认值: — 上下文: server
设置方式能够是下面任意一种:mysql
listen 127.0.0.1:12345; listen *:12345; listen 12345; # same as *:12345 listen localhost:12345;
IPV6必须加上中括号:linux
listen [::1]:12345; listen [::]:12345;
UNIX-domain sockets要写unix:
前缀nginx
listen unix:/var/run/nginx.sock;
ssl
指定链接此端口的链接都是SSL模式
web
udp
用于处理套接字spring
proxy_protocol
指定此端口上的全部链接都使用 PROXY protocol协议sql
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参数,那么对于给定的地址:端口对将始终进行单独的绑定。websocket
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
1.指定preread buffer的大小
Syntax: preread_buffer_size size; Default: preread_buffer_size 16k; Context: stream, server
2.指定preread buffer的超时时间
Syntax: preread_timeout timeout; Default: preread_timeout 30s; Context: stream, server
3.指定完成读取代理协议头的超时时间,若是超过这个时间,就关闭链接
Syntax: proxy_protocol_timeout timeout; Default: proxy_protocol_timeout 30s; Context: stream, server
4.配置用于将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;
5.名字解析的超时时间
Syntax: resolver_timeout time; Default: resolver_timeout 30s; Context: stream, server
6.配置服务器
Syntax: server { ... } Default: — Context: stream
7.配置stream服务器
Syntax: stream { ... } Default: — Context: main
8.配置是否容许TCP_NODELAY
选项,这个能够用在客户端和代理服务器上
Syntax: tcp_nodelay on | off; Default: tcp_nodelay on; Context: stream, server
9.设置变量的哈希表容量。
Syntax: variables_hash_bucket_size size; Default: variables_hash_bucket_size 64; Context: stream
10.设置变量的哈希表最大容量
Syntax: variables_hash_max_size size; Default: variables_hash_max_size 1024; Context: stream This directive appeared in version 1.11.2.
$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:服务不可用。