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:服務不可用。