nginx的tcp proxy負載調度有兩種方式:
官方的ngx_stream_core_module
阿里開源的nginx_tcp_proxy_module
此處介紹nginx官方TCP proxy。
nginx從1.9.0版本以後支持面向TCP的反向代理。莫約是2015年初發布的。
注:如今最新版nginx爲1.11.12
nginx從1.9.0後引入模塊ngx_stream_core_module,模塊是沒有編譯的,需要用到編譯需添加--with-stream配置參數,stream負載均衡官方配置樣例
配置編譯的時候需要加上
先切換到nginx解壓後目錄內
# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-stream
# make
# cp ./objs/nginx /usr/local/nginx/sbin/
# make upgrade
以下配置文件示例爲反向代理MySQL。
user nginx; #user root; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } stream{ upstream mysql{ server 192.168.1.106:3306 weight=1; server 192.168.1.108:3306 weight=1; } server{ listen 3307; proxy_pass mysql; } }
stream 與 http 是一個層級的,在main內定義,放在配置文件最後。其中可包含server字段。
配置項說明:
listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
It is possible to specify just only the port. #我這撇腳的英語。。
地址也可以是一個主機名,若IPv6要用方括號指定 [::1] 。
ssl參數允許指定所有連接在該端口上接受SSL模式下工作。
udp參數配置一個監聽套接字用於處理數據報(1.9.13引入)。
proxy_protocol參數(1.11.4)允許指定在該端口上所有連接都要使用PROXY protocol.。
backlog參數 它限制了等待連接的隊列的最大長度(1.9.2)。
bind 指定一個單獨的bind()相應一個給定地址:端口。
更多參照官網關於模塊ngx_stream_core_module的敘述
ngx_stream_core_module自1.11.2模塊支持變量。
$binary_remote_addr
二進制格式的客戶端地址
$bytes_received
從客戶端接收的字節數(1.11.4)
$bytes_sent
發送到客戶端的字節數
$connection
連接序列號
$hostname
主機名
$msec
當前時間在秒和毫秒分辨率
$nginx_version
nginx版本
$pid
工作進程的PID
$protocol
協議用於與客戶溝通: TCP或 UDP(1.11.4)
$proxy_protocol_addr
客戶端地址從代理協議頭,否則或空字符串(1.11.4)
代理協議之前必須通過設置啓用 proxy_protocol參數聽指令。
$proxy_protocol_port
客戶端端口從代理協議頭,否則或空字符串(1.11.4)
代理協議之前必須通過設置啓用 proxy_protocol參數聽指令。
$remote_addr
客戶端地址
$remote_port
客戶端端口
$server_addr
接受連接過來的服務器的地址
計算這個變量的值通常需要一個系統調用。爲了避免一個系統調用,聽指令必須指定地址和使用 bind參數。
$server_port
接受了一個連接端口的服務器
$session_time
會話持續時間在秒和毫秒分辨率(1.11.4);
$status
會話狀態(1.11.4),可以是下列之一:
200
會議成功完成
400
客戶端數據不能被解析,例如,代理協議頭
403
訪問被禁止的,例如,當訪問是有限的某些客戶端地址
500
內部服務器錯誤
502
糟糕的網關,例如,如果一個上游服務器無法選中或者聯繫到。
503
服務不可用,例如,當訪問是有限的連接數
$time_iso8601
當地時間的ISO 8601標準格式
編寫完成後測試語法格式,OK後重載服務
# ./sbin/nginx -t
# ./sbin/nginx -s reload
———————————————官方Example Configuration—————————————————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;
proxy_responses 1;
proxy_timeout 20s;
proxy_pass dns;
}
server {
listen [::1]:12345;
proxy_pass unix:/tmp/stream.socket;
}
}